Itemidに基づいてメニューアイテムを取得し、PHPのクエリ文字列で使用される値の1つを一時的に上書きして、Joomlaが使用するリンクを生成できるようにする必要があります。実際のメニュー項目を変更したくない、または代替のメニュー項目を持っているなど。
実際の要件は少し複雑なので、簡単にするために、日中は記事ID#1を、午後6時以降は記事ID#2を使用する必要があるとしましょう。
したがって、実際のメニュー項目は次のとおりです:_option=com_content&view=article&id=1&Itemid=100
_
午後6時を過ぎると、代わりに_option=com_content&view=article&id=2&Itemid=100
_を返す$menu->getItem($itemid)->link
のようなものが必要になります。
私は$app->getMenu();
と_new JMenu
_でこれを試してきましたが、明らかに何かが欠けています。コードは次のようになると思います。
_$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
_
明確にするために、高度に専門化された実際の要件は、既存のメニュー項目、それらが誰であるか、それらがサイトのどこにあるかに基づいて一連のリンクを本質的に生成しているため、JInputやリダイレクトの使用はオプション。メニューオブジェクトを取得して操作することは、表示する必要のあるさまざまなリンクを作成するために必要です(ユーザーが表示されているリンクをクリックしない限り、実際にはリンクに移動しません)。
JMenu->getItem()
またはJMenu->load()
のフックはありません。あなたの興味に応じて、ルーティングにフックするプラグインを書くことができます。
system
プラグインは次のように使用する必要があります:
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');
}
}
どうやら必要なフックがないので、これを機能させるために使用したコードは次のとおりです。
$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);