it-swarm.com.de

Wie kann ich die Artikel-ID eines Menüeintrags in PHP vorübergehend ändern?

Ich muss in der Lage sein, ein Menüelement basierend auf der Itemid abzurufen, dann einen der in der Abfragezeichenfolge in PHP verwendeten Werte vorübergehend zu überschreiben und schließlich den Link zu generieren, den Joomla dann verwenden würde. Ich möchte den aktuellen Menüpunkt NICHT ändern oder alternative Menüpunkte haben usw.

Die tatsächliche Anforderung ist etwas kompliziert. Nehmen wir der Einfachheit halber an, ich muss die Artikel-ID Nr. 1 tagsüber und die Artikel-ID Nr. 2 nach 18:00 Uhr verwenden.

Der eigentliche Menüpunkt lautet also: option=com_content&view=article&id=1&Itemid=100

Wenn es nach 18:00 Uhr ist, brauche ich stattdessen etwas wie $menu->getItem($itemid)->link, um option=com_content&view=article&id=2&Itemid=100 Zurückzugeben.

Ich habe dies mit $app->getMenu(); und new JMenu Versucht, aber es fehlt offensichtlich etwas. Ich würde mir vorstellen, dass der Code ungefähr so ​​aussehen würde:

$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

Um dies zu verdeutlichen, generiert die hoch spezialisierte tatsächliche Anforderung im Wesentlichen eine Reihe von Links basierend auf vorhandenen Menüelementen, wer sie sind und wo sie sich auf der Site befinden. Daher ist die Verwendung von JInput und/oder Umleitung keine Möglichkeit. Das Abrufen und Bearbeiten des Menüobjekts ist erforderlich, um die verschiedenen Links zu finden, die ich anzeigen muss (die nicht tatsächlich angezeigt werden, es sei denn, der Benutzer klickt auf einen Link, der ihnen angezeigt wurde).

2
GDP

Es gibt keine Hooks für JMenu->getItem() oder JMenu->load(). Abhängig von Ihrem Interesse können Sie ein Plugin schreiben, das sich in das Routing einhakt.

4
Nils Rückmann

Ein system Plugin sollte folgendermaßen verwendet werden:

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

Anscheinend sind die benötigten Hooks nicht vorhanden. Deshalb hier der Code, mit dem ich es zum Laufen gebracht habe:

$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