Files
MokoSuiteCross/source/packages/com_mokosuitecross/src/Model/CalendarModel.php
T

68 lines
2.3 KiB
PHP
Raw Normal View History

<?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;
}
}