Files
conservatorio-tomadini/components/com_jem/helpers/route.php
2024-12-17 17:34:10 +01:00

319 lines
6.8 KiB
PHP

<?php
/**
* @package JEM
* @copyright (C) 2013-2024 joomlaeventmanager.net
* @copyright (C) 2005-2009 Christoph Lukes
* @license https://www.gnu.org/licenses/gpl-3.0 GNU/GPL
*/
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Log\Log;
require_once(JPATH_SITE.'/components/com_jem/helpers/helper.php');
require_once(JPATH_SITE.'/components/com_jem/classes/categories.class.php');
/**
* JEM Component Route Helper
* based on Joomla ContentHelperRoute
*
* @static
* @package JEM
*
*/
abstract class JEMHelperRoute
{
protected static $lookup;
const ARTIFICALID = 0;
/**
* Determines an JEM Link
*
* @param int The id of an JEM item
* @param string The view
* @param string The category of the item
* @deprecated Use specific Route methods instead!
*
* @return string determined Link
*/
public static function getRoute($id, $view = 'event', $category = null)
{
// Deprecation warning.
Log::add('JEMHelperRoute::getRoute() is deprecated, use specific route methods instead.', Log::WARNING, 'deprecated');
$needles = array(
$view => array((int) $id)
);
if ($item = self::_findItem($needles)) {
$link = 'index.php?Itemid='.$item;
}
else {
// Create the link
$link = 'index.php?option=com_jem&view='.$view.'&id='. $id;
// Add category, if available
if(!is_null($category)) {
$link .= '&catid='.$category;
}
if ($item = self::_findItem($needles)) {
$link .= '&Itemid='.$item;
}
elseif ($item = self::_findItem()) {
$link .= '&Itemid='.$item;
}
}
return $link;
}
public static function getCategoryRoute($id, $task = '')
{
$settings = JEMHelper::globalattribs();
$defaultItemid = $settings->get('default_Itemid');
$needles = array(
'category' => array((int) $id)
);
// Create the link
$link = 'index.php?option=com_jem&view=category&id='. $id;
// If no category view works try categories
$needles['categories'] = array(self::ARTIFICALID);
$category = new JEMCategories($id);
if($category) {
$needles['categories'] = array_reverse($category->getPath());
}
if (!empty($task)) {
$link .= '&task='.$task;
}
if ($item = self::_findItem($needles)) {
$link .= '&Itemid='.$item;
}
elseif ($item = self::_findItem()) {
if (isset($defaultItemid))
{
$link .= '&Itemid='.$defaultItemid;
}
}
return $link;
}
public static function getEventRoute($id, $catid = null)
{
$settings = JEMHelper::globalattribs();
$defaultItemid = $settings->get('default_Itemid');
$needles = array(
'event' => array((int) $id)
);
// Create the link
$link = 'index.php?option=com_jem&view=event&id='. $id;
// Add category, if available
if(!is_null($catid)) {
// TODO
//$needles['categories'] = $needles['category'];
$link .= '&catid='.$catid;
}
if ($item = self::_findItem($needles)) {
$link .= '&Itemid='.$item;
}
elseif ($item = self::_findItem()) {
// $link .= '&Itemid='.$item;
if (isset($defaultItemid))
{
$link .= '&Itemid='.$defaultItemid;
}
}
return $link;
}
public static function getVenueRoute($id)
{
$settings = JEMHelper::globalattribs();
$defaultItemid = $settings->get('default_Itemid');
$needles = array(
'venue' => array((int) $id)
);
// Create the link
$link = 'index.php?option=com_jem&view=venue&id='. $id;
// If no venue view works try venues
$needles['venues'] = array(self::ARTIFICALID);
if ($item = self::_findItem($needles)) {
$link .= '&Itemid='.$item;
}
elseif ($item = self::_findItem()) {
if (isset($defaultItemid))
{
$link .= '&Itemid='.$defaultItemid;
}
}
return $link;
}
protected static function getRouteWithoutId($my)
{
$settings = JEMHelper::globalattribs();
$defaultItemid = $settings->get('default_Itemid');
$needles = array();
$needles[$my] = array(self::ARTIFICALID);
// Create the link
$link = 'index.php?option=com_jem&view='.$my;
if ($item = self::_findItem($needles)) {
$link .= '&Itemid='.$item;
}
elseif ($item = self::_findItem()) {
if (isset($defaultItemid))
{
$link .= '&Itemid='.$defaultItemid;
} else {
$link .= '&Itemid='.$item;
}
}
return $link;
}
public static function getMyAttendancesRoute()
{
return self::getRouteWithoutId('myattendances');
}
public static function getMyEventsRoute()
{
return self::getRouteWithoutId('myevents');
}
public static function getMyVenuesRoute()
{
return self::getRouteWithoutId('myvenues');
}
/**
* Determines the Itemid
*
* searches if a menuitem for this item exists
* if not the active menuitem will be returned
*
* @param array The id and view
*
*
* @return int Itemid
*/
protected static function _findItem($needles = null)
{
$app = Factory::getApplication();
$menus = $app->getMenu('site');
// Prepare the reverse lookup array.
if (self::$lookup === null) {
self::$lookup = array();
$component = ComponentHelper::getComponent('com_jem');
$items = $menus->getItems('component_id', $component->id);
if ($items) {
foreach ($items as $item)
{
if (isset($item->query) && isset($item->query['view'])) {
if (isset($item->query['layout']) && ($item->query['layout'] == 'calendar')) {
continue; // skip calendars
}
$view = $item->query['view'];
if (!isset(self::$lookup[$view])) {
self::$lookup[$view] = array();
}
if (isset($item->query['id'])) {
self::$lookup[$view][$item->query['id']] = $item->id;
}
// Some views have no ID, but we have to set one
else {
self::$lookup[$view][self::ARTIFICALID] = $item->id;
}
}
}
}
}
if ($needles) {
foreach ($needles as $view => $ids)
{
if (isset(self::$lookup[$view])) {
foreach($ids as $id)
{
if (isset(self::$lookup[$view][(int)$id])) {
// TODO: Check on access. See commented code below
return self::$lookup[$view][(int)$id];
}
}
}
}
}
else {
$active = $menus->getActive();
if ($active) {
return $active->id;
}
}
return null;
// $user = JemFactory::getUser();
// //false if there exists no menu item at all
// if (!$items) {
// return false;
// } else {
// //Not needed currently but kept because of a possible hierarchic link structure in future
// foreach($needles as $needle => $id)
// {
// foreach($items as $item)
// {
// if (($item->query['view'] == $needle) && ($item->query['id'] == $id)) {
// return $item;
// }
// }
// /*
// //no menuitem exists -> return first possible match
// foreach($items as $item)
// {
// if ($item->published == 1 && $item->access <= $gid) {
// return $item;
// }
// }
// */
// }
// }
// return false;
}
}
?>