fix: resolve 10 issues found in code review
Universal: Cascade Main → Dev / Cascade main → branches (push) Successful in 3s

Critical:
- Create missing pkg_mokoog.sys.ini package language file
- Create missing forms/tag.xml and forms/filter_tags.xml for component
- Remove non-existent Service/ folder from component manifest
- Remove non-existent scriptfile from system plugin manifest

Important:
- Remove unused DatabaseAwareTrait from system plugin
- Add Event parameter to onBeforeCompileHead (Joomla 5 SubscriberInterface)
- Guard onContentAfterSave with isClient('administrator') check
- Fix duplicate DEFAULT keyword in SQL CREATE TABLE
- Quote column names with quoteName() in content plugin select
- Remove duplicate language file registration in component manifest

Authored-by: Moko Consulting

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jonathan Miller
2026-05-23 17:40:40 -05:00
parent 27bb22e8e2
commit 98ac42c398
11 changed files with 166 additions and 23 deletions
+7
View File
@@ -0,0 +1,7 @@
; MokoOpenGraph - Package System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later
PKG_MOKOOG="MokoOpenGraph"
PKG_MOKOOG_DESCRIPTION="Complete Open Graph, Twitter Card, and social sharing meta tag management for Joomla. Control how every page appears when shared on Facebook, Twitter/X, LinkedIn, WhatsApp, and more."
PKG_MOKOOG_PHP_VERSION_ERROR="MokoOpenGraph requires PHP %s or later."
+7
View File
@@ -0,0 +1,7 @@
; MokoOpenGraph - Package System Language File
; Copyright (C) 2026 Moko Consulting. All rights reserved.
; License: GPL-3.0-or-later
PKG_MOKOOG="MokoOpenGraph"
PKG_MOKOOG_DESCRIPTION="Complete Open Graph, Twitter Card, and social sharing meta tag management for Joomla. Control how every page appears when shared on Facebook, Twitter/X, LinkedIn, WhatsApp, and more."
PKG_MOKOOG_PHP_VERSION_ERROR="MokoOpenGraph requires PHP %s or later."
@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
* @package MokoOpenGraph
* @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
* @license GNU General Public License version 3 or later; see LICENSE
-->
<form>
<fields name="filter">
<field
name="search"
type="text"
label="COM_MOKOOG_FILTER_SEARCH"
hint="JSEARCH_FILTER"
/>
<field
name="published"
type="status"
label="JOPTION_SELECT_PUBLISHED"
onchange="this.form.submit();"
>
<option value="">JOPTION_SELECT_PUBLISHED</option>
<option value="1">JPUBLISHED</option>
<option value="0">JUNPUBLISHED</option>
</field>
<field
name="content_type"
type="list"
label="COM_MOKOOG_FILTER_CONTENT_TYPE"
onchange="this.form.submit();"
>
<option value="">COM_MOKOOG_FILTER_SELECT_TYPE</option>
<option value="com_content">Articles</option>
<option value="menu">Menu Items</option>
</field>
</fields>
<fields name="list">
<field
name="fullordering"
type="list"
label="JGLOBAL_SORT_BY"
default="a.modified DESC"
onchange="this.form.submit();"
>
<option value="a.id ASC">JGRID_HEADING_ID_ASC</option>
<option value="a.id DESC">JGRID_HEADING_ID_DESC</option>
<option value="a.og_title ASC">COM_MOKOOG_HEADING_OG_TITLE_ASC</option>
<option value="a.og_title DESC">COM_MOKOOG_HEADING_OG_TITLE_DESC</option>
<option value="a.modified ASC">COM_MOKOOG_HEADING_MODIFIED_ASC</option>
<option value="a.modified DESC">COM_MOKOOG_HEADING_MODIFIED_DESC</option>
</field>
<field
name="limit"
type="limitbox"
label="JGLOBAL_LIST_LIMIT"
default="25"
onchange="this.form.submit();"
/>
</fields>
</form>
+73
View File
@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
* @package MokoOpenGraph
* @subpackage com_mokoog
* @author Moko Consulting <hello@mokoconsulting.tech>
* @copyright Copyright (C) 2026 Moko Consulting. All rights reserved.
* @license GNU General Public License version 3 or later; see LICENSE
-->
<form>
<fieldset name="details">
<field
name="id"
type="hidden"
/>
<field
name="content_type"
type="text"
label="COM_MOKOOG_FIELD_CONTENT_TYPE"
readonly="true"
/>
<field
name="content_id"
type="number"
label="COM_MOKOOG_FIELD_CONTENT_ID"
readonly="true"
/>
<field
name="og_title"
type="text"
label="COM_MOKOOG_FIELD_OG_TITLE"
description="COM_MOKOOG_FIELD_OG_TITLE_DESC"
filter="string"
maxlength="70"
/>
<field
name="og_description"
type="textarea"
label="COM_MOKOOG_FIELD_OG_DESCRIPTION"
description="COM_MOKOOG_FIELD_OG_DESCRIPTION_DESC"
filter="string"
rows="3"
maxlength="200"
/>
<field
name="og_image"
type="media"
label="COM_MOKOOG_FIELD_OG_IMAGE"
description="COM_MOKOOG_FIELD_OG_IMAGE_DESC"
directory="mokoog"
/>
<field
name="og_type"
type="list"
label="COM_MOKOOG_FIELD_OG_TYPE"
description="COM_MOKOOG_FIELD_OG_TYPE_DESC"
default="article"
>
<option value="article">Article</option>
<option value="website">Website</option>
<option value="product">Product</option>
<option value="profile">Profile</option>
</field>
<field
name="published"
type="list"
label="JSTATUS"
default="1"
>
<option value="1">JPUBLISHED</option>
<option value="0">JUNPUBLISHED</option>
</field>
</fieldset>
</form>
@@ -4,5 +4,3 @@
COM_MOKOOG="MokoOpenGraph"
COM_MOKOOG_DESCRIPTION="Manage Open Graph and social sharing tags for all your content. View, edit, and batch-process OG metadata."
PKG_MOKOOG_DESCRIPTION="Complete Open Graph, Twitter Card, and social sharing meta tag management for Joomla. Control how every page appears when shared on Facebook, Twitter/X, LinkedIn, WhatsApp, and more."
PKG_MOKOOG_PHP_VERSION_ERROR="MokoOpenGraph requires PHP %s or later."
@@ -4,5 +4,3 @@
COM_MOKOOG="MokoOpenGraph"
COM_MOKOOG_DESCRIPTION="Manage Open Graph and social sharing tags for all your content. View, edit, and batch-process OG metadata."
PKG_MOKOOG_DESCRIPTION="Complete Open Graph, Twitter Card, and social sharing meta tag management for Joomla. Control how every page appears when shared on Facebook, Twitter/X, LinkedIn, WhatsApp, and more."
PKG_MOKOOG_PHP_VERSION_ERROR="MokoOpenGraph requires PHP %s or later."
-6
View File
@@ -45,7 +45,6 @@
<folder>Controller</folder>
<folder>Extension</folder>
<folder>Model</folder>
<folder>Service</folder>
<folder>Table</folder>
<folder>View</folder>
</files>
@@ -69,9 +68,4 @@
<menu link="option=com_mokoog&amp;view=tags">COM_MOKOOG_SUBMENU_TAGS</menu>
</submenu>
</administration>
<languages folder="language">
<language tag="en-GB">en-GB/com_mokoog.ini</language>
<language tag="en-GB">en-GB/com_mokoog.sys.ini</language>
</languages>
</extension>
@@ -18,4 +18,4 @@ CREATE TABLE IF NOT EXISTS `#__mokoog_tags` (
PRIMARY KEY (`id`),
UNIQUE KEY `idx_content` (`content_type`, `content_id`),
KEY `idx_published` (`published`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -15,6 +15,7 @@ defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Form\Form;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\Event\Event;
use Joomla\Event\SubscriberInterface;
final class MokoOGContent extends CMSPlugin implements SubscriberInterface
@@ -45,7 +46,7 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
*
* @return void
*/
public function onContentPrepareForm(\Joomla\Event\Event $event): void
public function onContentPrepareForm(Event $event): void
{
[$form, $data] = array_values($event->getArguments());
@@ -96,7 +97,7 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
*
* @return void
*/
public function onContentAfterSave(\Joomla\Event\Event $event): void
public function onContentAfterSave(Event $event): void
{
[$context, $article, $isNew] = array_values($event->getArguments());
@@ -109,10 +110,17 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
return;
}
// Only process saves from the admin HTTP interface where form data is available
$app = $this->getApplication();
if (!$app->isClient('administrator')) {
return;
}
$contentType = $supportedContexts[$context];
$contentId = (int) $article->id;
$input = $this->getApplication()->getInput();
$input = $app->getInput();
$jform = $input->get('jform', [], 'array');
$ogData = $jform['mokoog'] ?? [];
@@ -130,7 +138,7 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
*
* @return void
*/
public function onContentAfterDelete(\Joomla\Event\Event $event): void
public function onContentAfterDelete(Event $event): void
{
[$context, $article] = array_values($event->getArguments());
@@ -168,7 +176,7 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
{
$db = Factory::getDbo();
$query = $db->getQuery(true)
->select('og_title, og_description, og_image, og_type')
->select($db->quoteName(['og_title', 'og_description', 'og_image', 'og_type']))
->from($db->quoteName('#__mokoog_tags'))
->where($db->quoteName('content_type') . ' = ' . $db->quote($contentType))
->where($db->quoteName('content_id') . ' = ' . $contentId);
@@ -19,8 +19,6 @@
<namespace path="src">Joomla\Plugin\System\MokoOG</namespace>
<scriptfile>script.php</scriptfile>
<files>
<filename plugin="mokoog">mokoog.php</filename>
<folder>src</folder>
@@ -14,15 +14,12 @@ defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
use Joomla\Database\DatabaseAwareTrait;
use Joomla\Event\Event;
use Joomla\Event\SubscriberInterface;
final class MokoOG extends CMSPlugin implements SubscriberInterface
{
use DatabaseAwareTrait;
/**
* @var bool
*/
@@ -43,9 +40,11 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
/**
* Inject Open Graph and Twitter Card meta tags before the document head is compiled.
*
* @param Event $event The event object
*
* @return void
*/
public function onBeforeCompileHead(): void
public function onBeforeCompileHead(Event $event): void
{
$app = $this->getApplication();