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é).
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.
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');
}
}
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);