b6202a6a40
Universal: PR Check / Branch Policy (pull_request) Successful in 1s
Universal: PR Check / Secret Scan (pull_request) Successful in 4s
Universal: PR Check / Validate PR (pull_request) Failing after 3s
RC Revert / Rename rc/ back to dev/ (pull_request) Has been skipped
Universal: Auto Version Bump / Version Bump (push) Successful in 8s
Branch Cleanup / Delete merged branch (pull_request) Successful in 1s
Joomla: Metadata Validation / Validate Joomla Metadata (pull_request) Successful in 28s
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Universal: PR Check / Report Issues (pull_request) Has been cancelled
Add a monthly calendar grid view to the admin component showing scheduled, queued, and posted cross-posts with color-coded status badges. Includes month-by-month navigation and today highlighting. New files: - CalendarController, CalendarModel, Calendar HtmlView, calendar template Modified files: - MokoSuiteCrossHelper: added Calendar to submenu - Language file: added calendar strings - CHANGELOG.md: documented new feature Authored-by: Moko Consulting
68 lines
2.3 KiB
PHP
68 lines
2.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @package MokoSuiteCross
|
|
* @subpackage com_mokosuitecross
|
|
* @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
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
*/
|
|
|
|
namespace Joomla\Component\MokoSuiteCross\Administrator\Model;
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
|
|
|
|
class CalendarModel extends BaseDatabaseModel
|
|
{
|
|
/**
|
|
* Get cross-post events for a given month, grouped by date.
|
|
*
|
|
* @param int $year Four-digit year
|
|
* @param int $month Month number (1-12)
|
|
*
|
|
* @return array Associative array keyed by Y-m-d, each value an array of event objects
|
|
*/
|
|
public function getEvents(int $year, int $month): array
|
|
{
|
|
$db = $this->getDatabase();
|
|
|
|
$firstDay = sprintf('%04d-%02d-01', $year, $month);
|
|
$lastDay = date('Y-m-t', strtotime($firstDay));
|
|
|
|
$dateExpr = 'COALESCE('
|
|
. $db->quoteName('p.scheduled_at') . ', '
|
|
. $db->quoteName('p.posted_at') . ', '
|
|
. $db->quoteName('p.created') . ')';
|
|
|
|
$query = $db->getQuery(true)
|
|
->select([
|
|
'DATE(' . $dateExpr . ') AS event_date',
|
|
$db->quoteName('p.status'),
|
|
$db->quoteName('s.service_type'),
|
|
$db->quoteName('c.title', 'article_title'),
|
|
])
|
|
->from($db->quoteName('#__mokosuitecross_posts', 'p'))
|
|
->join('LEFT', $db->quoteName('#__mokosuitecross_services', 's')
|
|
. ' ON ' . $db->quoteName('s.id') . ' = ' . $db->quoteName('p.service_id'))
|
|
->join('LEFT', $db->quoteName('#__content', 'c')
|
|
. ' ON ' . $db->quoteName('c.id') . ' = ' . $db->quoteName('p.article_id'))
|
|
->where('DATE(' . $dateExpr . ') >= ' . $db->quote($firstDay))
|
|
->where('DATE(' . $dateExpr . ') <= ' . $db->quote($lastDay))
|
|
->order('DATE(' . $dateExpr . ') ASC, ' . $db->quoteName('p.created') . ' ASC');
|
|
|
|
$db->setQuery($query);
|
|
$rows = $db->loadObjectList() ?: [];
|
|
|
|
$grouped = [];
|
|
|
|
foreach ($rows as $row) {
|
|
$grouped[$row->event_date][] = $row;
|
|
}
|
|
|
|
return $grouped;
|
|
}
|
|
}
|