web-dev-qa-db-ja.com

PHP内でメニュー項目の記事IDを一時的に変更するにはどうすればよいですか?

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やリダイレクトの使用はオプション。メニューオブジェクトを取得して操作することは、表示する必要のあるさまざまなリンクを作成するために必要です(ユーザーが表示されているリンクをクリックしない限り、実際にはリンクに移動しません)。

2
GDP

JMenu->getItem()またはJMenu->load()のフックはありません。あなたの興味に応じて、ルーティングにフックするプラグインを書くことができます。

4
Nils Rückmann

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');
    }
}
2
Farahmand

どうやら必要なフックがないので、これを機能させるために使用したコードは次のとおりです。

$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