web-dev-qa-db-fra.com

Comment puis-je modifier temporairement l'ID d'article d'un élément de menu dans PHP?

Je dois pouvoir obtenir un élément de menu basé sur le Itemid, puis écraser temporairement l'une des valeurs utilisées dans la chaîne de requête en PHP et enfin générer le lien que Joomla utiliserait ensuite. Je ne veux PAS changer l'élément de menu actuel, ni avoir d'autres éléments de menu, etc.

La configuration requise est un peu compliquée. Par souci de simplicité, supposons que je dois utiliser l'ID d'article n ° 1 pendant la journée et l'ID d'article n ° 2 après 18h00.

Donc, l'élément de menu est: option=com_content&view=article&id=1&Itemid=100

Si c'est après 18h00, j'ai besoin de quelque chose comme $menu->getItem($itemid)->link pour renvoyer option=com_content&view=article&id=2&Itemid=100 À la place.

J'ai essayé cela avec $app->getMenu(); et new JMenu, Mais il me manque évidemment quelque chose. J'imagine que le code ressemblerait à ceci:

$menu = $app->getMenu();
$menuitem = $menu->getItem(100);
$menu->setProperties('the_article_id',2);
$templink = $menuitem->link;
// $templink should be: option=com_content&view=article&id=2&Itemid=100
...continue my processing with $templink

Pour clarifier, l'exigence réelle hautement spécialisée génère essentiellement une série de liens basés sur des éléments de menu existants, leur nom et leur emplacement sur le site. Par conséquent, l'utilisation de JInput et/ou de la redirection n'est pas une option. option. L'obtention et la manipulation de l'objet de menu sont nécessaires pour créer les différents liens que je dois afficher (ne pas y aller réellement, à moins que l'utilisateur ne clique sur celui qui lui a été affiché).

2
GDP

Il n'y a pas de crochets pour JMenu->getItem() ou JMenu->load(). Selon votre intérêt, vous pouvez écrire un plugin qui s’accroche au routage.

4
Nils Rückmann

Un plugin system devrait être utilisé comme ceci:

public function onAfterRoute()
{
    $app = JFactory::getApplication();
    $jinput = $app->input;
    $time_condition = true; // Set the time condition here!
    if ($time_condition && $jinput->get('option') == 'com_content' && $jinput->get('view') == 'article' && $jinput->get('Itemid') == 100 && $jinput->get('id') == 1)
    {
        $jinput->set('id', '2');
    }
}
2
Farahmand

Apparemment, les crochets dont j'ai besoin ne sont pas là, alors voici le code que j'ai utilisé pour le faire fonctionner:

$menu = $app->getMenu();
$menuitem = $menu->getItem(100);
$querystring = str_ireplace('index.php?','',$menuitem->link);
parse_str($querystring, $array);
$array['id'] = 12345;
$temp_url = 'index.php?'.http_build_query($array);
1
GDP