| Server IP : 54.36.91.62 / Your IP : 216.73.217.112 Web Server : Apache System : Linux webm013.cluster127.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 User : coopiak ( 151928) PHP Version : 8.3.23 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/coopiak/amisdesseniors-fr/libraries/kunena/src/Route/ |
Upload File : |
<?php
/**
* Kunena Component
*
* @package Kunena.Framework
* @subpackage Route
*
* @copyright Copyright (C) 2008 - @currentyear@ Kunena Team. All rights reserved.
* @license https://www.gnu.org/copyleft/gpl.html GNU/GPL
* @link https://www.kunena.org
**/
namespace Kunena\Forum\Libraries\Route;
\defined('_JEXEC') or die();
use Exception;
use Joomla\CMS\Application\ApplicationHelper;
use Joomla\CMS\Cache\CacheController;
use Joomla\CMS\Cache\CacheControllerFactoryInterface;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Uri\Uri;
use Joomla\String\StringHelper;
use Kunena\Forum\Libraries\Factory\KunenaFactory;
use Kunena\Forum\Libraries\Forum\Category\KunenaCategory;
use Kunena\Forum\Libraries\Forum\Category\KunenaCategoryHelper;
use Kunena\Forum\Libraries\Forum\Message\KunenaMessage;
use Kunena\Forum\Libraries\Forum\Topic\KunenaTopic;
use Kunena\Forum\Libraries\Profiler\KunenaProfiler;
use Kunena\Forum\Libraries\User\KunenaUser;
use Kunena\Forum\Libraries\User\KunenaUserHelper;
KunenaRoute::initialize();
/**
* Class KunenaRoute
*
* @since Kunena 6.0
*/
abstract class KunenaRoute
{
/**
* @var array
* @since Kunena 6.0
*/
public static $views = [
'attachment' => ['layout' => 'default', 'thumb' => 0, 'download' => 0],
'announcement' => ['layout' => 'default'],
'category' => ['layout' => 'default', 'catid' => '0'],
'common' => ['layout' => 'default'],
'credits' => ['layout' => 'default'],
'home' => [],
'misc' => ['layout' => 'default'],
'search' => ['layout' => 'default'],
'statistics' => ['layout' => 'default'],
'topic' => ['layout' => 'default'],
'topics' => ['layout' => 'default'],
'user' => ['layout' => 'default', 'userid' => '0'],
];
/**
* @var array
* @since Kunena 6.0
*/
public static $layouts = ['create' => 1, 'default' => 1, 'edit' => 1, 'manage' => 1, 'moderate' => 1, 'user' => 1];
/**
* @var array
* @since Kunena 6.0
*/
public static $sefviews = ['' => 1, 'home' => 1, 'category' => 1, 'topic' => 1];
/**
* @var array
* @since Kunena 6.0
*/
public static $parsevars = ['do' => 1, 'task' => 1, 'mode' => 1, 'catid' => 1, 'id' => 1, 'mesid' => 1, 'userid' => 1, 'page' => 1, 'sel' => 1];
/**
* @var integer
* @since Kunena 6.0
*/
public static $time = 0;
/**
* @var boolean
* @since Kunena 6.0
*/
public static $adminApp = false;
/**
* @var boolean
* @since Kunena 6.0
*/
public static $config = false;
/**
* @var boolean
* @since Kunena 6.0
*/
public static $menus = false;
/**
* @var object
* @since Kunena 6.0
*/
public static $menu = false;
/**
* @var boolean
* @since Kunena 6.0
*/
public static $default = false;
/**
* @var mixed
* @since Kunena 6.0
*/
public static $active = null;
/**
* @var boolean
* @since Kunena 6.0
*/
public static $home = false;
/**
* @var boolean
* @since Kunena 6.0
*/
public static $search = false;
/**
* @var null
* @since Kunena 6.0
*/
public static $current = null;
/**
* @var boolean
* @since Kunena 6.0
*/
public static $childlist = false;
/**
* @var array
* @since Kunena 6.0
*/
public static $subtree = [];
/**
* @var array
* @since Kunena 6.0
*/
public static $parent = [];
/**
* @var array
* @since Kunena 6.0
*/
public static $uris = [];
/**
* @var boolean
* @since Kunena 6.0
*/
public static $urisSave = false;
/**
* @var array
* @since Kunena 6.0
*/
protected static $filtered = [];
/**
* @param bool $object object
*
* @return boolean|Uri|null|string
*
* @since Kunena 6.0
* @throws Exception
* @throws null
*/
public static function current($object = false)
{
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
$uri = self::prepare();
if (!$uri) {
return false;
}
if ($object) {
return $uri;
}
$result = $uri->getQuery();
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return $result;
}
/**
* @param null $uri uri
*
* @return boolean|Uri|null
*
* @since Kunena 6.0
* @throws Exception
* @throws null
*/
protected static function prepare($uri = null)
{
static $current = [];
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
if (!$uri || (\is_string($uri) && $uri[0] == '&')) {
if (!isset($current[$uri])) {
$get = Uri::getInstance()->getQuery(true);
$uri = $current[$uri] = Uri::getInstance('index.php?' . http_build_query($get) . $uri);
if (Factory::getApplication()->isClient('administrator')) {
self::setItemID($uri);
}
$uri->delVar('defaultmenu');
$uri->delVar('language');
} else {
$uri = $current[$uri];
}
} elseif (is_numeric($uri)) {
if (!isset(self::$menu[\intval($uri)])) {
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return false;
}
$item = self::$menu[\intval($uri)];
$uri = Uri::getInstance("{$item->link}&Itemid={$item->id}");
} elseif ($uri instanceof Uri) {
// Nothing to do
} else {
$uri = new Uri((string) $uri);
}
$option = $uri->getVar('option');
$Itemid = $uri->getVar('Itemid');
if (!$option && !$Itemid) {
KUNENA_PROFILER ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return false;
} elseif ($option && $option != 'com_kunena') {
KUNENA_PROFILER ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return false;
} elseif ($Itemid && (!isset(self::$menu[$Itemid]) || self::$menu[$Itemid]->component != 'com_kunena')) {
KUNENA_PROFILER ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return false;
}
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return $uri;
}
/**
* @param Uri $uri uri
*
* @return integer
*
* @since Kunena 6.0
* @throws null
* @throws Exception
*/
protected static function setItemID(Uri $uri): int
{
static $candidates = [];
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
$view = $uri->getVar('view');
$catid = (int) $uri->getVar('catid');
$Itemid = (int) $uri->getVar('Itemid');
$key = $view . $catid;
if (!isset($candidates[$key])) {
if (self::$search === false) {
self::build();
}
$search = [];
if (self::$home) {
// Search from the current home menu
$search[self::$home->id] = 1;
// Then search from all linked home menus
if (isset(self::$search['home'][self::$home->id])) {
$search += self::$search['home'][self::$home->id];
}
}
// Finally search from other home menus
$search += self::$search['home'];
// Find all potential candidates
$candidates[$key] = [];
foreach ($search as $id => $dummy) {
$follow = !empty(self::$menu[$id]) ? self::$menu[$id] : null;
if ($follow && self::checkHome($follow, $catid)) {
$candidates[$key] += !empty(self::$search[$view][$follow->id]) ? self::$search[$view][$follow->id] : [];
if ($view == 'topic') {
$candidates[$key] += !empty(self::$search['category'][$follow->id]) ? self::$search['category'][$follow->id] : [];
}
$candidates[$key][$follow->id] = $follow->id;
}
}
// Don't forget lonely candidates
$candidates[$key] += !empty(self::$search[$view][0]) ? self::$search[$view][0] : [];
if ($view == 'topic') {
$candidates[$key] += !empty(self::$search['category'][0]) ? self::$search['category'][0] : [];
}
}
// Check current menu item first
$bestcount = ($Itemid && isset(self::$menu[$Itemid])) ? self::checkItem(self::$menu[$Itemid], $uri) : 0;
$bestid = $bestcount ? $Itemid : 0;
// Then go through all candidates
foreach ($candidates[$key] as $id) {
$item = self::$menu[$id];
$matchcount = self::checkItem($item, $uri);
if ($matchcount > $bestcount) {
// This is our best candidate this far
$bestid = $item->id;
$bestcount = $matchcount;
}
}
$uri->setVar('Itemid', $bestid);
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return $bestid;
}
/**
* @return void
*
* @since Kunena 6.0
* @throws Exception
*/
protected static function build(): void
{
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
if (self::$search === false) {
$user = KunenaUserHelper::getMyself();
$language = strtolower(Factory::getApplication()->getDocument()->getLanguage());
self::$search = false;
if (self::$search === false) {
self::$search = [];
self::$search['home'] = [];
foreach (self::$menu as $item) {
// Skip menu items that aren't pointing to Kunena or are using wrong language.
if (
($item->component != 'com_kunena' && $item->type != 'alias')
|| ($item->language != '*' && strtolower($item->language) != $language)
) {
continue;
}
// Follow links.
if ($item->type == 'alias') {
if (empty($item->query['Itemid']) || empty(self::$menu[$item->query['Itemid']])) {
continue;
}
$item = self::$menu[$item->query['Itemid']];
if ($item->component != 'com_kunena' || ($item->language != '*' && strtolower($item->language) != $language)) {
continue;
}
}
// Ignore legacy menu items without view in it.
if (!isset($item->query['view'])) {
continue;
}
// Save Kunena menu items so that we can make fast searches
$home = self::getHome($item);
self::$search[$item->query['view']][$home ? $home->id : 0][$item->id] = $item->id;
}
if (isset($cache)) {
$cache->store(serialize(self::$search), 'search', "com_kunena.route.v1.{$language}.{$user->userid}");
}
}
}
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
}
/**
* @return CacheController
*
* @since Kunena 6.0
*/
protected static function getCache(): CacheController
{
$options = ['defaultgroup' => 'mod_menu'];
$cache = Factory::getContainer()->get(CacheControllerFactoryInterface::class)->createCacheController('output', $options);
return $cache;
}
/**
* @param mixed $item item
*
* @return null
*
* @since Kunena 6.0
*/
public static function getHome($item)
{
if (!$item) {
return false;
}
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
$id = $item->id;
if (!isset(self::$parent[$id])) {
if ($item->component == 'com_kunena' && isset($item->query['view']) && $item->query['view'] == 'home') {
self::$parent[$id] = $item;
} else {
$parentid = $item->parent_id;
$parent = isset(self::$menu[$parentid]) ? self::$menu[$parentid] : null;
self::$parent[$id] = self::getHome($parent);
}
}
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return self::$parent[$id];
}
/**
* @param mixed $item item
* @param integer $catid catid
*
* @return integer
*
* @since Kunena 6.0
*/
protected static function checkHome($item, int $catid): int
{
static $cache = [];
if (!$catid) {
return 1;
}
if (!isset($cache[$item->id])) {
$params = $item->getParams();
$catids = $params->get('catids', []);
if (!\is_array($catids)) {
$catids = explode(',', $catids);
}
if (!empty($catids)) {
$catids = array_combine($catids, $catids);
}
unset($catids[0], $catids['']);
$cache[$item->id] = (array) $catids;
}
return \intval(empty($cache[$item->id]) || isset($cache[$item->id][$catid]));
}
/**
* @param mixed $item item
* @param Uri $uri uri
*
* @return integer
*
* @since Kunena 6.0
* @throws null
*/
protected static function checkItem($item, Uri $uri)
{
$authorise = self::$menus->authorise($item->id);
if (!$authorise) {
return 0;
}
$catid = (int) $uri->getVar('catid');
if (!empty($item->query['view'])) {
switch ($item->query['view']) {
case 'home':
$matchcount = self::checkHome($item, $catid);
break;
case 'category':
case 'topic':
$matchcount = self::checkCategory($item, $uri);
break;
default:
$matchcount = self::check($item, $uri);
}
return $matchcount;
}
return 1;
}
/**
* @param mixed $item item
* @param Uri $uri url
*
* @return integer
*
* @since Kunena
* @throws null
*/
protected static function checkCategory($item, Uri $uri)
{
static $cache = [];
$catid = (int) $uri->getVar('catid');
$check = self::check($item, $uri);
if (!$check || !$catid) {
return $check;
}
if (!isset($cache[$item->id])) {
$cache[$item->id] = [];
if (!empty($item->query['catid'])) {
$cache[$item->id] = KunenaCategoryHelper::getChildren($item->query['catid']);
$cache[$item->id][$item->query['catid']] = KunenaCategoryHelper::get($item->query['catid']);
}
}
return \intval(isset($cache[$item->id][$catid])) * 8;
}
/**
* @param mixed $item item
* @param Uri $uri uri
*
* @return integer
*
* @since Kunena 6.0
*/
protected static function check($item, Uri $uri): int
{
$hits = 0;
foreach ($item->query as $var => $value) {
if ($value != $uri->getVar($var)) {
return 0;
}
$hits++;
}
return $hits;
}
/**
* Get the referrer page.
*
* If there's no referrer or it's external, Kunena will return default page.
* Also referrers back to tasks are removed.
*
* @param string $default Default page to return into.
* @param string $anchor Anchor (location in the page).
*
* @return string
*
* @since Kunena 6.0
* @throws Exception
* @throws null
*/
public static function getReferrer($default = null, $anchor = null): string
{
$app = Factory::getApplication();
$referrer = $app->input->server->getString('HTTP_REFERER');
if ($referrer) {
$uri = new Uri($referrer);
// Make sure we do not return into a task -- or if task is SEF encoded, make sure it fails.
$uri->delVar('task');
$uri->delVar(Session::getFormToken());
// Check that referrer was from the same domain and came from the Joomla frontend or backend.
$base = $uri->toString(['scheme', 'host', 'port', 'path']);
$host = $uri->toString(['scheme', 'host', 'port']);
// Referrer should always have host set and it should come from the same base address.
if (empty($host) || stripos($base, Uri::base()) !== 0) {
$uri = null;
}
}
if (!isset($uri)) {
if ($default == null) {
$default = $app->isClient('site') ? 'index.php?option=com_kunena' : 'administrator/index.php?option=com_kunena';
}
$default = self::_($default);
$uri = new Uri($default);
}
if ($anchor) {
$uri->setFragment($anchor);
}
return $uri->toString(['path', 'query', 'fragment']);
}
/**
* @param null $uri uri
* @param bool $xhtml xhtml
* @param int $ssl ssl
*
* @return boolean|string
*
* @since Kunena 6.0
* @throws Exception
* @throws null
*/
public static function _($uri = null, $xhtml = true, $ssl = 0)
{
if (self::$adminApp) {
if ($uri instanceof Uri) {
$uri = $uri->toString();
}
if (substr($uri, 0, 14) == 'administrator/') {
// Use default routing in administration
return Route::_(substr($uri, 14), $xhtml, $ssl);
}
return Uri::root(true) . "/{$uri}";
}
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
$key = (self::$home ? self::$home->id : 0) . '-' . (int) $xhtml . (int) $ssl . ($uri instanceof Uri ? $uri->toString() : (string) $uri);
if (!$uri || (\is_string($uri) && $uri[0] == '&')) {
$key = 'a' . (self::$active ? self::$active->id : '') . '-' . $key;
}
if (isset(self::$uris[$key])) {
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return self::$uris[$key];
}
$uri = self::prepare($uri);
if (!$uri) {
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return false;
}
if (!$uri->getVar('Itemid')) {
self::setItemID($uri);
}
$fragment = $uri->getFragment();
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '(t)') : null;
self::$uris[$key] = Route::_('index.php?' . $uri->getQuery(), $xhtml, $ssl) . ($fragment ? '#' . $fragment : '');
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '(t)') : null;
self::$urisSave = true;
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return self::$uris[$key];
}
/**
* @param Uri $uri uri
* @param bool $object object
*
* @return Uri|string
*
* @since Kunena 6.0
* @throws Exception
* @throws null
*/
public static function normalize($uri = null, $object = false)
{
if (self::$adminApp) {
// Use default routing in administration
return $object ? $uri : 'index.php?' . $uri->getQuery();
}
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
$uri = self::prepare($uri);
if (!$uri) {
return false;
}
if (!$uri->getVar('Itemid')) {
self::setItemID($uri);
}
$result = $object ? $uri : 'index.php?' . $uri->getQuery();
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return $result;
}
/**
* @return boolean
*
* @since Kunena 6.0
*/
public static function getMenu()
{
return self::$home;
}
/**
* @param string $string string
* @param null $default default
*
* @return mixed
*
* @since Kunena 6.0
*/
public static function stringURLSafe($string, $default = null)
{
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
if (!isset(self::$filtered[$string])) {
self::$filtered[$string] = ApplicationHelper::stringURLSafe($string);
// Remove beginning and trailing "whitespace", fixes #1130 where category alias creation fails on error: Duplicate entry '-'.
self::$filtered[$string] = trim(self::$filtered[$string], '-_ ');
if ($default && empty(self::$filtered[$string])) {
self::$filtered[$string] = $default;
}
}
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return self::$filtered[$string];
}
/**
* @param string $alias alias
*
* @return array
*
* @since Kunena 6.0
* @throws Exception
*/
public static function resolveAlias(string $alias): array
{
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
$app = Factory::getApplication();
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->createQuery();
$query->select('*')
->from($db->quoteName('#__kunena_aliases'))
->where($db->quoteName('alias') . ' LIKE ' . $db->quote($alias . '%'));
$db->setQuery($query);
try {
$aliases = $db->loadObjectList();
} catch (\RuntimeException $e) {
$app->enqueueMessage($e->getMessage(), 'error');
}
$vars = [];
foreach ($aliases as $object) {
if (StringHelper::strtolower($alias) == StringHelper::strtolower($object->alias)) {
$var = $object->type != 'legacy' ? $object->type : 'view';
$vars[$var] = $object->type != 'layout' ? $object->item : preg_replace('/.*\./', '', $object->item);
if ($var == 'catid') {
$vars['view'] = 'category';
}
break;
}
}
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return $vars;
}
/**
* @return void
*
* @since Kunena 6.0
* @throws Exception
*/
public static function initialize(): void
{
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
self::$config = KunenaFactory::getConfig();
if (Factory::getApplication()->isClient('administrator') || Factory::getApplication()->isClient('cli')) {
self::$adminApp = true;
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return;
}
$app = KunenaFactory::getApplication();
self::$menus = $app->getMenu();
self::$menu = self::$menus->getMenu();
self::$default = self::$menus->getDefault();
$active = self::$menus->getActive();
// Get current route.
self::$current = new Uri('index.php');
if ($active) {
foreach ($active->query as $key => $value) {
self::$current->setVar($key, $value);
}
self::$current->setVar('Itemid', (int) $active->id);
if ($active->type == 'component' && $active->component == 'com_kunena' && isset($active->query['view'])) {
self::$active = $active;
}
}
// If values are both in GET and POST, they are only stored in POST
$post = $app->input->post->getArray([]);
foreach ($post as $key => $value) {
if (\in_array($key, ['view', 'layout', 'task']) && !preg_match('/[^a-zA-Z0-9_.]/i', $value)) {
self::$current->setVar($key, $value);
}
}
// Make sure that request URI is not broken
$get = $app->input->get->getArray([]);
foreach ($get as $key => $value) {
if (preg_match('/[^a-zA-Z]/', $key)) {
continue;
}
if (\in_array($key, ['query', 'searchuser'])) {
// Allow all values
}
// TODO: we need to find a way to here deal with arrays: &foo[]=bar
elseif (\gettype($value) == 'string') {
if (preg_match('/[^a-zA-Z0-9_ ]/i', $value)) {
// Illegal value
continue;
}
}
self::$current->setVar($key, $value);
}
if (self::$current->getVar('start')) {
self::$current->setVar('limitstart', self::$current->getVar('start'));
self::$current->delVar('start');
}
self::$home = self::getHome(self::$active);
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
}
/**
* @return void
*
* @since Kunena 6.0
*/
public static function cleanup(): void
{
self::$filtered = [];
self::$uris = [];
}
/**
* @param KunenaCategory $category category
* @param bool $xhtml xhtml
*
* @return boolean
*
* @since Kunena 6.0
* @throws null
* @throws Exception
*/
public static function getCategoryUrl(KunenaCategory $category, bool $xhtml = true)
{
return self::_("index.php?option=com_kunena&view=category&catid={$category->id}", $xhtml);
}
/**
* @param KunenaCategory $category category
*
* @return integer
*
* @since Kunena 6.0
* @throws Exception
* @throws null
*/
public static function getCategoryItemid(KunenaCategory $category)
{
return self::getItemID("index.php?option=com_kunena&view=category&catid={$category->id}");
}
/**
* @param null $uri uri
*
* @return integer
*
* @since Kunena 6.0
* @throws Exception
* @throws null
*/
public static function getItemID($uri = null)
{
if (self::$adminApp) {
// There are no itemids in administration
return 0;
}
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
$uri = self::prepare($uri);
if (!$uri) {
return false;
}
if (!$uri->getVar('Itemid')) {
self::setItemID($uri);
}
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return $uri->getVar('Itemid');
}
/**
* Fix itemid when there is no item id.
*
* @return integer
*
* @since Kunena 5.1
* @throws null
* @throws Exception
*/
public static function fixMissingItemID(): int
{
$component = ComponentHelper::getComponent('com_kunena');
$app = KunenaFactory::getApplication();
$items = $app->getMenu('site')->getItems('component_id', $component->id);
if ($items) {
return $items[0]->id;
}
return 0;
}
/**
* @param KunenaTopic $topic topic
* @param bool $xhtml xhtml
* @param ?KunenaMessage|string $action actions
* @param ?KunenaCategory $category category
* @param int $itemid itemid
*
* @return boolean
*
* @since Kunena 6.0
* @throws Exception
*/
public static function getTopicUrl(KunenaTopic $topic, bool $xhtml = true, $action = null, ?KunenaCategory $category = null, $Itemid = 0)
{
if (!$category) {
$category = $topic->getCategory();
}
return self::_($topic->getUri($category, $action, $Itemid), $xhtml);
}
/**
* @param KunenaMessage $message message
* @param bool $xhtml xhtml
* @param ?KunenaTopic $topic topic
* @param ?KunenaCategory $category category
*
* @return boolean
*
* @since Kunena 6.0
* @throws Exception
*/
public static function getMessageUrl(KunenaMessage $message, $xhtml = true, ?KunenaTopic $topic = null, ?KunenaCategory $category = null)
{
// FIXME: not yet fully implemented...
if (!$category) {
$category = $message->getCategory();
}
if (!$topic) {
$topic = $message->getTopic();
}
return self::_("index.php?option=com_kunena&view=topic&catid={$category->id}&id={$topic->id}", $xhtml);
}
/**
* @param KunenaUser $user user
* @param bool $xhtml xhtml
*
* @return boolean
*
* @since Kunena 6.0
* @throws Exception
* @throws null
*/
public static function getUserUrl(KunenaUser $user, $xhtml = true)
{
return self::_("index.php?option=com_kunena&view=user&userid={$user->userid}", $xhtml);
}
/**
* This method implements \unicode slugs instead of transliteration.
* It has taken from Joomla 1.7.3 with the difference that urls are not lower case.
*
* @param string $string String to process
*
* @return string Processed string
*
* @since Kunena 6.0
*/
protected static function stringURLUnicodeSlug(string $string): string
{
// Replace double byte whitespaces by single byte (East Asian languages)
$str = preg_replace('/\xE3\x80\x80/', ' ', $string);
// Remove any '-' from the string as they will be used as concatenated.
// Would be great to let the spaces in but only Firefox is friendly with this
$str = str_replace('-', ' ', $str);
// Replace forbidden characters by whitespaces
$str = preg_replace('#[:\#\*"@+=;!><&\.,%()\]\/\'\\\\|\[]#', "\x20", $str);
// Delete all '?'
$str = str_replace('?', '', $str);
// Trim white spaces at beginning and end of alias and make lowercase
$str = trim($str);
// Remove any duplicate whitespace and replace whitespaces by hyphens
$str = preg_replace('#\x20+#', '-', $str);
return $str;
}
}