| Current Path : /var/www/html/components/com_jdownloads/src/Helper/ |
| Current File : /var/www/html/components/com_jdownloads/src/Helper/LegacyRouter.php |
<?php
/**
* @package jDownloads
* @version 4.1
* @copyright (C) 2007 - 2026 - Arno Betz - www.jdownloads.com
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.txt
*
* jDownloads is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
namespace JDownloads\Component\JDownloads\Site\Helper;
\defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Component\Router\Rules\RulesInterface;
use Joomla\Database\DatabaseInterface;
use JDownloads\Component\JDownloads\Site\Helper\JDHelper;
use JDownloads\Component\JDownloads\Site\Helper\RouteHelper;
/**
* Legacy routing rules class from com_jdownloads
*
*/
#[\AllowDynamicProperties]
class LegacyRouter implements RulesInterface
{
/**
* Constructor for this legacy router
*
* @param JComponentRouterView $router The router this rule belongs to
*
* @since 3.8
*/
public function __construct($router)
{
$this->router = $router;
}
/**
* Preprocess the route for the com_jdownloads component
*
* @param array &$query An array of URL arguments
*
* @return void
*
*/
public function preprocess(&$query){
}
/**
* Build the route for the com_jdownloads component
*
* @param array &$query An array of URL arguments
* @param array &$segments The URL arguments to use to assemble the subsequent URL.
*
* @return void
*
*/
public function build(&$query, &$segments){
if (
isset($query['layout'], $query['tmpl'])
&& $query['layout'] === 'modal'
&& $query['tmpl'] === 'component'
) {
$query['Itemid'] = 0;
return;
}
// Get all alias from categories and downloads
if (!isset($this->all_cat_aliases)){
$db = Factory::getContainer()->get(DatabaseInterface::class);
$aquery = $db->setQuery($db->getQuery(true)
->select('alias, id')
->from('#__jdownloads_categories')
->where('id > 1')
->order($db->quoteName('id')));
$this->all_cat_aliases = $row = $db->loadAssocList('id');
}
if (!isset($this->all_files_aliases)){
$db = Factory::getContainer()->get(DatabaseInterface::class);
$aquery = $db->setQuery($db->getQuery(true)
->select('alias, id')
->from('#__jdownloads_files')
->order($db->quoteName('id')));
$this->all_files_aliases = $row = $db->loadAssocList('id');
}
// Get a menu item based on Itemid or currently active
$params = ComponentHelper::getParams('com_jdownloads');
// $query['Itemid'] must always be an integer value
if (isset($query['Itemid'])){
if (is_array($query['Itemid'])){
$query['Itemid'] = (int) $query['Itemid'][0];
}
}
// We need a menu item. Either the one specified in the query, or the current active one if none specified
if (empty($query['Itemid'])){
$menuItem = $this->router->menu->getActive();
$query['Itemid'] = $menuItem->id;
$menuItemGiven = false;
} else {
$menuItem = $this->router->menu->getItem($query['Itemid']);
$menuItemGiven = true;
}
// Check again, as we need a link to the download overview. A link from another component would be invalid.
if ($menuItemGiven && isset($menuItem) && $menuItem->component != 'com_jdownloads'){
// Invalid menu item
$menuitems = $this->router->menu->getItems(array(), array());
foreach ($menuitems as $menuitem){
if ($menuitem->link == 'index.php?option=com_jdownloads&view=categories'){
$menuItem = $this->router->menu->getItem($menuitem->id);
$query['Itemid'] = $menuItem->id;
break;
}
}
}
$download_send_task = isset($query['task']) && $query['task'] === 'download.send';
if (isset($query['view'])){
$view = $query['view'];
} elseif ($download_send_task) {
$view = null;
} else {
// We need to have a view in the query or a supported task route.
return;
}
// Categories page
if ($view == 'categories'){
if (!$menuItemGiven) {
$segments[] = $view;
}
unset($query['view']);
}
// Downloads list (all or only uncategorised)
if ($view == 'downloads'){
$requested_type = (isset($query['type']) && $query['type'] === 'uncategorised') ? 'uncategorised' : 'all';
if (!$this->isMatchingDownloadsMenuItem($menuItem, $query)) {
if (!$menuItemGiven) {
$segments[] = $view;
}
$segments[] = $requested_type;
}
unset($query['type']);
unset($query['view']);
}
// Category page
if ($view == 'category'){
$segments[] = $view;
unset($query['view']);
if (isset($query['catid'])) {
if (strpos($query['catid'], ':') === false) {
$cat_id = (int) $query['catid'];
if (array_key_exists($cat_id, $this->all_cat_aliases)){
$query['catid'] = $query['catid'].':'.$this->all_cat_aliases[$cat_id]['alias'];
}
}
$segments[] = $query['catid'];
unset($query['catid']);
} else {
// We should have id set for this view. If we don't, it is an error
return $segments;
}
}
// Download page (single item)
if ($view == 'download'){
$segments[] = $view;
unset($query['view']);
if (isset($query['catid'])) {
if (strpos($query['catid'], ':') === false) {
$cat_id = (int) $query['catid'];
if (array_key_exists($cat_id, $this->all_cat_aliases)){
$query['catid'] = $query['catid'].':'.$this->all_cat_aliases[$cat_id]['alias'];
}
}
$segments[] = $query['catid'];
unset($query['catid']);
}
if (isset($query['id'])) {
// Make sure we have the id and the alias
if (strpos($query['id'], ':') === false) {
$file_id = (int) $query['id'];
if (array_key_exists($file_id, $this->all_files_aliases)){
$query['id'] = $query['id'].':'.$this->all_files_aliases[$file_id]['alias'];
}
}
$segments[] = $query['id'];
unset($query['id']);
} else {
// We should have id set for this view. If we don't, it is an error
return $segments;
}
}
// MyDownloads list
if ($view == 'mydownloads'){
if (!$menuItemGiven) {
$segments[] = $view;
}
unset($query['view']);
}
// My download history
if ($view == 'myhistory'){
if (!$menuItemGiven) {
$segments[] = $view;
}
unset($query['view']);
}
// Search page
if ($view == 'search'){
$segments[] = $view;
unset($query['view']);
}
// Summary page
if ($view == 'summary'){
$segments[] = $view;
unset($query['view']);
if (isset($query['catid'])) {
if (strpos($query['catid'], ':') === false) {
$cat_id = (int) $query['catid'];
if (array_key_exists($cat_id, $this->all_cat_aliases)){
$query['catid'] = $query['catid'].':'.$this->all_cat_aliases[$cat_id]['alias'];
}
}
$segments[] = $query['catid'];
unset($query['catid']);
}
if (isset($query['id'])) {
// Make sure we have the id and the alias
if (strpos($query['id'], ':') === false) {
$file_id = (int) $query['id'];
if (array_key_exists($file_id, $this->all_files_aliases)){
$query['id'] = $query['id'].':'.$this->all_files_aliases[$file_id]['alias'];
}
}
$segments[] = $query['id'];
unset($query['id']);
} else {
// We should have id set for this view. If we don't, it is an error
return $segments;
}
// Mirror link
if (isset($query['m']) && $query['m'] > 0){
$segments[] = (int)$query['m'];
unset($query['m']);
}
}
// Report page
if ($view == 'report'){
$segments[] = $view;
unset($query['view']);
if (isset($query['catid'])) {
if (strpos($query['catid'], ':') === false) {
$cat_id = (int) $query['catid'];
if (array_key_exists($cat_id, $this->all_cat_aliases)){
$query['catid'] = $query['catid'].':'.$this->all_cat_aliases[$cat_id]['alias'];
}
}
$segments[] = $query['catid'];
unset($query['catid']);
}
if (isset($query['id'])) {
// Make sure we have the id and the alias
if (strpos($query['id'], ':') === false) {
$file_id = (int) $query['id'];
if (array_key_exists($file_id, $this->all_files_aliases)){
$query['id'] = $query['id'].':'.$this->all_files_aliases[$file_id]['alias'];
}
}
$segments[] = $query['id'];
unset($query['id']);
} else {
// We should have id set for this view. If we don't, it is an error
return $segments;
}
}
// Survey page
if ($view == 'survey'){
$segments[] = $view;
unset($query['view']);
if (isset($query['catid'])) {
if (strpos($query['catid'], ':') === false) {
$cat_id = (int) $query['catid'];
if (array_key_exists($cat_id, $this->all_cat_aliases)){
$query['catid'] = $query['catid'].':'.$this->all_cat_aliases[$cat_id]['alias'];
}
}
$segments[] = $query['catid'];
unset($query['catid']);
}
if (isset($query['id'])) {
// Make sure we have the id and the alias
if (strpos($query['id'], ':') === false) {
$file_id = (int) $query['id'];
if (array_key_exists($file_id, $this->all_files_aliases)){
$query['id'] = $query['id'].':'.$this->all_files_aliases[$file_id]['alias'];
}
}
$segments[] = $query['id'];
unset($query['id']);
} else {
// We should have id set for this view. If we don't, it is an error
return $segments;
}
}
// If the layout is specified and it is the same as the layout in the menu item, we
// unset it so it doesn't go into the query string.
if (isset($query['layout'])) {
if ($menuItemGiven && isset($menuItem->query['layout'])) {
if ($query['layout'] == $menuItem->query['layout']) {
unset($query['layout']);
unset($query['view']);
}
} else {
if ($query['layout'] == 'edit') {
//unset($query['layout']);
}
}
}
// Send download task
if (isset($query['task']) && $query['task'] == 'download.send'){
$segments[] = 'send';
unset($query['task']);
if (isset($query['catid'])) {
if (strpos($query['catid'], ':') === false) {
$cat_id = (int) $query['catid'];
if (array_key_exists($cat_id, $this->all_cat_aliases)){
$query['catid'] = $query['catid'].':'.$this->all_cat_aliases[$cat_id]['alias'];
}
}
$segments[] = $query['catid'];
unset($query['catid']);
}
if (isset($query['id'])) {
// Make sure we have the id and the alias
if (strpos($query['id'], ':') === false) {
$file_id = (int) $query['id'];
if (array_key_exists($file_id, $this->all_files_aliases)){
$query['id'] = $query['id'].':'.$this->all_files_aliases[$file_id]['alias'];
}
}
$segments[] = $query['id'];
unset($query['id']);
}
if (isset($query['m']) && $query['m'] > 0){
$segments[] = (int)$query['m'];
unset($query['m']);
} else {
unset($query['m']);
}
if (isset($query['list'])){
$value = preg_match("/[0-9,]+/", $query['list']);
if ($value){
$segments[] = $query['list'];
unset($query['list']);
}
}
if (isset($query['user'])){
$segments[] = (int)$query['user'];
unset($query['user']);
}
}
$total = count($segments);
for ($i = 0; $i < $total; $i++){
$segments[$i] = str_replace(':', '-', $segments[$i]);
}
return $segments;
}
/**
* Parse the segments of a URL.
*
* @param array &$segments The segments of the URL to parse.
* @param array &$vars The URL attributes to be used by the application.
*
* @return void
*
* @since 3.8
* @deprecated 4.0
*/
public function parse(&$segments, &$vars){
require_once JPATH_SITE . '/components/com_jdownloads/src/Helper/RouteHelper.php';
$menuid = JDHelper::getMenuItemids();
$item = $this->router->menu->getItem($menuid['root']);
$total = count($segments);
for ($i = 0; $i < $total; $i++)
{
$segments[$i] = preg_replace('/-/', ':', $segments[$i], 1);
}
// Get the active menu item.
//$item = $this->router->menu->getActive();
$params = ComponentHelper::getParams('com_jdownloads');
$advanced = $params->get('sef_advanced_link', 0);
$db = Factory::getContainer()->get(DatabaseInterface::class);
// Count route segments
$count = count($segments);
/*
* Standard routing for downloads. If we don't pick up an Itemid then we get the view from the segments
* the first segment is the view and the last segment is the id of the download or category.
*/
if (!isset($item))
{
$vars['view'] = $segments[0];
$vars['id'] = $segments[$count - 1];
return;
}
// We use the old part from 3.2
switch($segments[0])
{
case 'categories' :
$vars['view'] = 'categories';
break;
case 'uncategorised' :
$vars['view'] = 'downloads';
$vars['type'] = 'uncategorised';
break;
case 'all' :
$vars['view'] = 'downloads';
$vars['type'] = 'all';
break;
case 'mydownloads' :
$vars['view'] = 'mydownloads';
break;
case 'myhistory' :
$vars['view'] = 'myhistory';
break;
case 'category' :
// Modification by ibrahim to fix Incorrect SEF URLs When Using 4SEF, YOOtheme, SEF Advance
if ($count > 1) {
$vars['view'] = 'category';
$vars['catid'] = (int) $segments[$count - 1];
} else {
$app = Factory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$vars['view'] = 'category';
if ($active && !empty($active->query)) {
if (isset($active->query['catid'])) {
$vars['catid'] = (int) $active->query['catid'];
} elseif (isset($active->query['id'])) {
$vars['catid'] = (int) $active->query['id'];
}
}
}
break;
case 'download':
if ($count >= 3) {
$vars['view'] = 'download';
$vars['catid'] = (int) $segments[$count - 2];
$vars['id'] = (int) $segments[$count - 1];
} elseif ($count === 2) {
$vars['view'] = 'download';
$vars['id'] = (int) $segments[1];
} else {
$vars['view'] = 'download';
}
break;
case 'summary':
$vars['view'] = 'summary';
if ($count >= 3) {
$vars['catid'] = (int) $segments[$count - 2];
$vars['id'] = (int) $segments[$count - 1];
} elseif ($count === 2) {
$vars['id'] = (int) $segments[1];
}
break;
/* Part of the old routing - commented out as it is no longer used
case 'category' :
$vars['view'] = $segments[$count - 2];
$vars['catid'] = (int)$segments[$count - 1];
break;
case 'download' :
$vars['view'] = 'download';
$vars['catid'] = (int)$segments[$count - 2];
$vars['id'] = (int)$segments[$count - 1];
unset($segments[0]);
unset($segments[$count - 1]);
unset($segments[$count - 2]);
break;
case 'summary' :
$vars['view'] = 'summary';
if ($count > 1){
$vars['catid'] = (int)$segments[$count - 2];
$vars['id'] = (int)$segments[$count - 1];
}
break;
*/
case 'report' :
$vars['view'] = 'report';
$vars['catid'] = (int)$segments[$count - 2];
$vars['id'] = (int)$segments[$count - 1];
break;
case 'survey' :
$vars['view'] = 'survey';
$vars['catid'] = (int)$segments[$count - 2];
$vars['id'] = (int)$segments[$count - 1];
break;
case 'search' :
if($count == 1) {
$vars['view'] = 'search';
}
break;
case 'send' :
$vars['task'] = 'download.send';
$single_file = true;
foreach ($segments as $segment){
if (strpos($segment, ',')){
$single_file = false;
}
}
if (!$single_file){
// Mass download
$vars['catid'] = (int)$segments[1];
$vars['list'] = $segments[2];
$vars['user'] = (int)$segments[3];
} else {
// Single download
$vars['catid'] = (int)$segments[1];
$vars['id'] = (int)$segments[2];
if (isset($segments[3]) && $segments[3] > 0){
$vars['m'] = (int)$segments[3];
}
}
break;
default:
return;
}
if (isset($segments[0])) unset($segments[0]);
if (isset($segments[1])) unset($segments[1]);
if (isset($segments[2])) unset($segments[2]);
if (isset($segments[3])) unset($segments[3]);
return $vars;
}
/**
* Prüft, ob der aktive/gegebene Menüeintrag exakt auf die angefragte Downloads-Ansicht zeigt.
*
* @param object|null $menu_item Menüeintrag aus dem Router-Menü.
* @param array $query Aktuelle Router-Query.
*
* @return bool
*/
private function isMatchingDownloadsMenuItem($menu_item, array $query): bool
{
if (empty($menu_item) || empty($menu_item->query) || !is_array($menu_item->query)) {
return false;
}
if (($menu_item->query['view'] ?? '') !== 'downloads') {
return false;
}
$requested_type = (isset($query['type']) && $query['type'] === 'uncategorised') ? 'uncategorised' : 'all';
$menu_type = (isset($menu_item->query['type']) && $menu_item->query['type'] === 'uncategorised') ? 'uncategorised' : 'all';
return $requested_type === $menu_type;
}
}
?>