Compare commits

...

11 Commits

Author SHA1 Message Date
jmiller 37d3d2a5b3 chore: sync auto-release.yml from Template-Generic [skip ci] 2026-06-28 20:07:41 +00:00
jmiller ce108475a5 chore: sync issue-branch.yml from Template-Generic [skip ci] 2026-06-28 19:53:34 +00:00
gitea-actions[bot] 979ac9823f chore: promote changelog [Unreleased] → [01.06.00] 2026-06-28 19:52:02 +00:00
gitea-actions[bot] 2fb7d10e39 chore(release): build 01.06.00 [skip ci] 2026-06-28 19:51:48 +00:00
jmiller 57333482e3 Merge PR #84: Joomla-7 forward-compatibility cleanup 2026-06-28 19:50:59 +00:00
gitea-actions[bot] 3ac54da149 chore(version): auto-bump patch 01.05.01-dev [skip ci]
Branch Cleanup / Delete merged branch (pull_request) Has been skipped
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Successful in 36s
Universal: Workflow Sync Trigger / Sync workflows to live repos (pull_request) Successful in 5m24s
2026-06-28 19:50:47 +00:00
jmiller 2af8a72ca3 Merge origin/main into dev — resync after 01.05.00 release
Universal: PR Check / Branch Policy (pull_request) Successful in 3s
Joomla: Extension CI / Release Readiness Check (pull_request) Failing after 6s
Universal: PR Check / Validate PR (pull_request) Failing after 7s
Universal: Auto Version Bump / Version Bump (push) Successful in 16s
Generic: Project CI / Lint & Validate (pull_request) Successful in 18s
Generic: Repo Health / Access control (pull_request) Successful in 2s
Generic: Repo Health / Site Health (pull_request) Has been skipped
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 20s
Universal: Build & Release / Promote to RC (pull_request) Has been skipped
Universal: Build & Release / Build & Release Pipeline (pull_request) Has been skipped
Universal: PR Check / Secret Scan (pull_request) Successful in 47s
Joomla: Extension CI / Lint & Validate (pull_request) Failing after 58s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Failing after 54s
Generic: Project CI / Tests (pull_request) Has been cancelled
Joomla: Extension CI / Tests (PHP 8.2) (pull_request) Has been cancelled
Joomla: Extension CI / Tests (PHP 8.3) (pull_request) Has been cancelled
Joomla: Extension CI / PHPStan Analysis (pull_request) Has been cancelled
Joomla: Extension CI / Build RC Pre-Release (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
Generic: Repo Health / Scripts governance (pull_request) Has been cancelled
Generic: Repo Health / Repository health (pull_request) Has been cancelled
Generic: Repo Health / Report: Scripts Governance (pull_request) Has been cancelled
Generic: Repo Health / Report: Repository Health (pull_request) Has been cancelled
2026-06-28 14:50:25 -05:00
gitea-actions[bot] 740fb4e1f6 chore(version): pre-release bump to 01.05.01-dev [skip ci] 2026-06-28 19:48:07 +00:00
gitea-actions[bot] 1413f62476 chore(version): auto-bump patch 01.04.18-dev [skip ci] 2026-06-28 19:47:54 +00:00
jmiller d6fb2816cf refactor: replace Joomla-7-deprecated APIs (forward compatibility)
Universal: Auto Version Bump / Version Bump (push) Successful in 12s
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || github.ref_name }}) (push) Successful in 15s
Removes accessors deprecated in Joomla 5 and slated for removal in 7
(extension already runs on 6; this future-proofs for 7):
- Factory::getDbo() -> Factory::getContainer()->get(DatabaseInterface::class)
  across plugins, controllers, static helpers, and the install script
- Factory::getUser() -> Factory::getApplication()->getIdentity()
- Factory::getSession() -> Factory::getApplication()->getSession()
- jexit(Text::_('JINVALID_TOKEN')) -> throw new \RuntimeException(..., 403),
  consistent with the access-denied checks already in those controllers

Note: SQL update-version concern is already resolved — the release bumped
to 01.05.00, which matches the 01.05.00.sql update slot.
2026-06-28 14:47:34 -05:00
jmiller 464514bc37 chore: sync issue-branch.yml from Template-Generic [skip ci] 2026-06-28 19:39:07 +00:00
24 changed files with 52 additions and 42 deletions
+3 -1
View File
@@ -7,7 +7,7 @@
# INGROUP: mokocli.Release
# REPO: https://git.mokoconsulting.tech/mokoconsulting-tech/mokocli
# PATH: /templates/workflows/universal/auto-release.yml.template
# VERSION: 05.00.00
# VERSION: 05.01.00
# BRIEF: Universal build & release detects platform from manifest.xml
#
# +=======================================================================+
@@ -75,6 +75,7 @@ jobs:
with:
token: ${{ secrets.MOKOGITEA_TOKEN }}
fetch-depth: 1
submodules: recursive
- name: Setup mokocli tools
env:
@@ -173,6 +174,7 @@ jobs:
with:
token: ${{ secrets.MOKOGITEA_TOKEN }}
fetch-depth: 0
submodules: recursive
- name: Configure git for bot pushes
run: |
+1 -1
View File
@@ -5,7 +5,7 @@
# FILE INFORMATION
# DEFGROUP: Gitea.Workflow
# INGROUP: mokocli.Automation
# VERSION: 01.05.00
# VERSION: 01.00.00
# BRIEF: Auto-create feature branch when an issue is opened
name: "Universal: Issue Branch"
+6 -1
View File
@@ -2,10 +2,15 @@
## [Unreleased]
## [01.06.00] --- 2026-06-28
## [01.06.00] --- 2026-06-28
## [01.05.00] --- 2026-06-28
<!-- VERSION: 01.05.00 -->
<!-- VERSION: 01.06.00 -->
All notable changes to MokoSuiteOpenGraph will be documented in this file.
+1 -1
View File
@@ -14,7 +14,7 @@
DEFGROUP: Template-Joomla
INGROUP: Template-Joomla.Documentation
REPO: https://github.com/mokoconsulting-tech/Template-Joomla/
VERSION: 01.05.00
VERSION: 01.06.00
PATH: ./CODE_OF_CONDUCT.md
BRIEF: Community expectations and enforcement guidelines
NOTE: Adapted with attribution from the Contributor Covenant v2.1
+1 -1
View File
@@ -19,7 +19,7 @@
DEFGROUP: mokoconsulting-tech.Template-Joomla
INGROUP: MokoStandards.Governance
REPO: https://github.com/mokoconsulting-tech/Template-Joomla
VERSION: 01.05.00
VERSION: 01.06.00
PATH: /GOVERNANCE.md
BRIEF: Project governance rules, roles, and decision process for Template-Joomla
-->
+1 -1
View File
@@ -1,6 +1,6 @@
# MokoSuiteOpenGraph
<!-- VERSION: 01.05.00 -->
<!-- VERSION: 01.06.00 -->
Open Graph, Twitter Card, and social sharing meta tag management for Joomla 6 and higher.
+1 -1
View File
@@ -23,7 +23,7 @@ DEFGROUP: Template-Joomla
INGROUP: Template-Joomla.Documentation
REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Joomla
PATH: /SECURITY.md
VERSION: 01.05.00
VERSION: 01.06.00
BRIEF: Security vulnerability reporting and handling policy
-->
@@ -47,7 +47,7 @@ class TagsController extends ApiController
throw new \RuntimeException('content_type and content_id are required', 400);
}
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true)
->select($db->quoteName('id'))
->from($db->quoteName('#__mokoog_tags'))
+1 -1
View File
@@ -8,7 +8,7 @@
-->
<extension type="component" method="upgrade">
<name>com_mokoog</name>
<version>01.05.00</version>
<version>01.06.00</version>
<creationDate>2026-05-23</creationDate>
<author>Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail>
@@ -0,0 +1 @@
/* 01.04.18 — no schema changes */
@@ -0,0 +1 @@
/* 01.05.01 — no schema changes */
@@ -0,0 +1 @@
/* 01.06.00 — no schema changes */
@@ -27,13 +27,13 @@ class BatchController extends BaseController
*/
public function count(): void
{
Session::checkToken('get') || jexit(Text::_('JINVALID_TOKEN'));
Session::checkToken('get') || throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403);
if (!Factory::getApplication()->getIdentity()->authorise('core.create', 'com_mokoog')) {
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
}
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true)
->select('COUNT(*)')
->from($db->quoteName('#__content', 'c'))
@@ -60,7 +60,7 @@ class BatchController extends BaseController
*/
public function process(): void
{
Session::checkToken('get') || jexit(Text::_('JINVALID_TOKEN'));
Session::checkToken('get') || throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403);
if (!Factory::getApplication()->getIdentity()->authorise('core.create', 'com_mokoog')) {
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
@@ -69,7 +69,7 @@ class BatchController extends BaseController
$app = Factory::getApplication();
$limit = min($app->getInput()->getInt('limit', 50), 200);
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true)
->select($db->quoteName([
'c.id', 'c.title', 'c.metadesc', 'c.introtext', 'c.fulltext', 'c.images',
@@ -36,14 +36,14 @@ class ImportExportController extends BaseController
*/
public function export(): void
{
Session::checkToken('get') || jexit(Text::_('JINVALID_TOKEN'));
Session::checkToken('get') || throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403);
if (!Factory::getApplication()->getIdentity()->authorise('core.manage', 'com_mokoog')) {
throw new \RuntimeException(Text::_('JLIB_APPLICATION_ERROR_ACCESS_FORBIDDEN'), 403);
}
$app = Factory::getApplication();
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
// Join with #__content to get article titles for reference
$query = $db->getQuery(true)
@@ -102,7 +102,7 @@ class ImportExportController extends BaseController
*/
public function import(): void
{
Session::checkToken() || jexit(Text::_('JINVALID_TOKEN'));
Session::checkToken() || throw new \RuntimeException(Text::_('JINVALID_TOKEN'), 403);
$identity = Factory::getApplication()->getIdentity();
@@ -161,7 +161,7 @@ class ImportExportController extends BaseController
return;
}
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$header = fgetcsv($handle);
$created = 0;
$updated = 0;
@@ -13,7 +13,7 @@ defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
// Total published articles
$db->setQuery($db->getQuery(true)->select('COUNT(*)')->from('#__content')->where('state = 1'));
@@ -8,7 +8,7 @@
-->
<extension type="plugin" group="content" method="upgrade">
<name>Content - MokoSuiteOpenGraph</name>
<version>01.05.00</version>
<version>01.06.00</version>
<creationDate>2026-05-23</creationDate>
<author>Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail>
@@ -187,7 +187,7 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
$contentType = $supportedContexts[$context];
$contentId = (int) $article->id;
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true)
->delete($db->quoteName('#__mokoog_tags'))
->where($db->quoteName('content_type') . ' = ' . $db->quote($contentType))
@@ -208,7 +208,7 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
*/
private function loadOgData(string $contentType, int $contentId, string $language = '*'): ?object
{
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true)
->select($db->quoteName([
'og_title', 'og_description', 'og_image', 'og_type', 'og_video',
@@ -239,7 +239,7 @@ final class MokoOGContent extends CMSPlugin implements SubscriberInterface
*/
private function saveOgData(string $contentType, int $contentId, array $ogData, string $language = '*'): void
{
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
// Check if record exists for this content + language
$query = $db->getQuery(true)
+1 -1
View File
@@ -8,7 +8,7 @@
-->
<extension type="plugin" group="system" method="upgrade">
<name>System - MokoSuiteOpenGraph</name>
<version>01.05.00</version>
<version>01.06.00</version>
<creationDate>2026-05-23</creationDate>
<author>Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail>
@@ -241,7 +241,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
// Pinterest article:tag rich pins (from Joomla content tags)
if ($option === 'com_content' && $view === 'article' && $id > 0) {
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$tagQuery = $db->getQuery(true)
->select($db->quoteName('t.title'))
->from($db->quoteName('#__tags', 't'))
@@ -467,7 +467,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
return $this->loadOgDataByMenu((int) $menuItem->id) ?: $empty;
}
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true)
->select('*')
->from($db->quoteName('#__mokoog_tags'))
@@ -493,7 +493,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
*/
private function loadOgDataByType(string $contentType, int $contentId): ?object
{
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$lang = Factory::getLanguage()->getTag();
$query = $db->getQuery(true)
@@ -520,7 +520,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
*/
private function loadOgDataByMenu(int $menuId): ?object
{
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$lang = Factory::getLanguage()->getTag();
$query = $db->getQuery(true)
@@ -615,7 +615,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
// Fallback: check the article's category for an image
if ($view === 'article') {
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$catQuery = $db->getQuery(true)
->select($db->quoteName('cat.params'))
->from($db->quoteName('#__categories', 'cat'))
@@ -674,7 +674,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
return $cache[$id];
}
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true)
->select($db->quoteName([
'a.title', 'a.introtext', 'a.fulltext', 'a.images',
@@ -947,20 +947,20 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
*/
private function warnMissingLicenseKey(): void
{
$session = Factory::getSession();
$session = Factory::getApplication()->getSession();
if ($session->get('mokoog.license_warned', false)) {
return;
}
$user = Factory::getUser();
$user = Factory::getApplication()->getIdentity();
if ($user->guest || !$user->authorise('core.manage')) {
return;
}
try {
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true)
->select($db->quoteName('extra_query'))
@@ -1011,7 +1011,7 @@ final class MokoOG extends CMSPlugin implements SubscriberInterface
}
try {
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true)
->select('p.id, p.sku, p.price, p.currency, p.stock_qty')
->select('c.title AS name, c.introtext AS description, c.images')
@@ -37,7 +37,7 @@ class JsonLdBuilder
$article = $cachedArticle;
if (!$article) {
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true)
->select($db->quoteName([
'a.created', 'a.modified', 'a.publish_up',
@@ -179,7 +179,7 @@ class JsonLdBuilder
$product = $cachedProduct;
if (!$product) {
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$query = $db->getQuery(true)
->select('p.sku, p.price, p.currency, p.stock_qty')
->from($db->quoteName('#__mokosuite_crm_products', 'p'))
@@ -35,7 +35,7 @@ class SitemapBuilder
$allowed = ['always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never'];
$changefreq = \in_array($changefreq, $allowed, true) ? $changefreq : 'weekly';
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
// Get all published articles
$query = $db->getQuery(true)
@@ -8,7 +8,7 @@
-->
<extension type="plugin" group="webservices" method="upgrade">
<name>Web Services - MokoSuiteOpenGraph</name>
<version>01.05.00</version>
<version>01.06.00</version>
<creationDate>2026-05-23</creationDate>
<author>Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail>
+1 -1
View File
@@ -8,7 +8,7 @@
<extension type="package" method="upgrade">
<name>Package - MokoSuiteOpenGraph</name>
<packagename>mokoog</packagename>
<version>01.05.00</version>
<version>01.06.00</version>
<creationDate>2026-05-23</creationDate>
<author>Moko Consulting</author>
<authorEmail>hello@mokoconsulting.tech</authorEmail>
+4 -4
View File
@@ -55,7 +55,7 @@ class Pkg_MokoOGInstallerScript
if ($type === 'install')
{
$db = Factory::getDbo();
$db = Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
foreach (['system', 'content', 'webservices'] as $folder)
{
@@ -79,7 +79,7 @@ class Pkg_MokoOGInstallerScript
{
try
{
$db = \Joomla\CMS\Factory::getDbo();
$db = \Joomla\CMS\Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$db->setQuery(
$db->getQuery(true)
->select($db->quoteName('us.extra_query'))
@@ -103,7 +103,7 @@ class Pkg_MokoOGInstallerScript
try
{
$db = \Joomla\CMS\Factory::getDbo();
$db = \Joomla\CMS\Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$db->setQuery(
$db->getQuery(true)
->select($db->quoteName('us.update_site_id'))
@@ -133,7 +133,7 @@ class Pkg_MokoOGInstallerScript
{
try
{
$db = \Joomla\CMS\Factory::getDbo();
$db = \Joomla\CMS\Factory::getContainer()->get(\Joomla\Database\DatabaseInterface::class);
$db->setQuery(
$db->getQuery(true)
->select([$db->quoteName('update_site_id'), $db->quoteName('extra_query')])