it-swarm.com.de

So erhalten Sie Menüparameter und ItemID im Komponenten-Controller

In meinem benutzerdefinierten Komponenten-Controller habe ich die Funktion save (). Am Ende wird eine Nachricht angezeigt und zur URL weitergeleitet

$this->setMessage(JText::_('SOME_TEXT'));
$this->setRedirect(JRoute::_('index.php?option=com_foo&view=foo', false));

Ich habe Probleme, Folgendes zu tun:

1.Verwenden Sie den Menüparameter aus dem benutzerdefinierten Feld anstelle der JText-Zeichenfolge. Wenn ich dies innerhalb der Funktion benutze:

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$message = $active->params->get('message');

Ich erhalte Nachricht & Fehler:

Notice: Trying to get property of non-object...
Fatal error: Call to a member function get() on a non-object...

$ message ist der Name meines benutzerdefinierten Menüfelds, das in der XML-Datei definiert ist. Wenn ich es direkt aus der Sicht aufrufe, ist es in Ordnung.

2. Holen Sie sich das aktive Menü itemid und verwenden Sie es in setRedirect ().

Ich erhalte eine leere Item-ID in der URL, wenn ich sie folgendermaßen verwende:

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$this->setRedirect(JRoute::_('index.php?option=com_foo&view=foo&Itemid='.$itemId, false));

Ich habe viele Informationen zum Aufrufen von Menüparametern in Komponenten gefunden, aber nichts davon hat mir geholfen

7
weezle

Nach einigen Tests konnte ich das Problem replizieren:

** Ein Formular leitet zu einer Ansicht ohne Menüelement oder zu sich selbst relativ zu einer URL wie dieser weiter:

komponente/meineKomponente/meineAnsicht

(Es spielt keine Rolle, ob die Ansicht ein Menüelement enthält oder nicht, das ist nur ein blödes Joomla-Routing.) **

Daher muss Folgendes getan werden, um den Fehler zu vermeiden:

1) Die Ansicht muss mit einem Menüpunkt im Joomla-Backend verknüpft sein

2) Die URL zum Formular im Frontend sollte/menu-alias sein

3) Die Formularaktion sollte nicht zu einer anderen Ansicht umgeleitet werden, sondern leer sein

4) Das Formular sollte versteckte Eingaben für die Aufgabe enthalten

Dann funktioniert Ihre Umleitung zum Posten und Speichern im Controller wie ein Zauber, da Sie im Kontext des Menüelements (URL) arbeiten.

Wenn Sie jedoch zu einer anderen Ansicht oder über JRoute zu derselben Ansicht umleiten, ohne die aktuelle Element-ID zu speichern, verlassen Sie den Menüelement-Kontext ("Komponente/MeineKomponente/MeineAnsicht").

Dies passiert häufig in Joomla, da das aktuelle Routersystem die angegebene URL nicht mit den Menüelementen in der Datenbank vergleicht. Um dies zu verhindern, können Sie die folgenden Aktionen ausführen:

1) Erweitern Sie den Router Ihrer Komponente mit einer Funktion, die die Menüelementtabelle nach der aktuellen URL durchsucht und die Element-ID/das Menüelement zurückgibt. (Ich habe das schon in der Vergangenheit gemacht und es funktioniert.)

2) Fügen Sie in Ihrem Formular ausgeblendete Felder hinzu, die die Artikel-ID, die Aufgabe und die Zielansicht enthalten (der richtige Weg in Joomla, um zu routen).

3) Leiten Sie URLs wie "component/mycomponent/myview" zum richtigen URL-Pfad um.

4) Sie können für jede Ansicht Fallbacks in den Komponentenparametern festlegen. Dadurch wird die Element-ID an die Komponentenparameter und nicht an die Ansichten an einen URL-Pfad gekettet. Ansicht1 -> Dropdown -> Verketteten Menüpunkt auswählen

Im Controller:

$ itemId = $ params-> get ($ mycurrentviewname);

Verwenden Sie nicht $ menu-> getActive (), wenn dies aufgrund des blöden Joomla-Routingsystems nicht unbedingt erforderlich ist. Ich empfehle, den Menüpunkt irgendwie manuell festzulegen.

Zurück zu Frage:

Wie gesagt, dein Fehler ist irgendwo am Anfang des Routings. Dies kann einfach Ihre URL sein, die zu Ihrem Formular führt, oder eine Weiterleitung, nachdem Sie das Formular an eine Ansicht ohne Menüelement gesendet haben, oder an eine URL, die keine Element-ID enthält.

Beweis:

Fügen Sie dies zu Ihrer Speicherfunktion zwischen $ itemid und $ message hinzu:

if(empty($itemId)){

      $itemId = $app->input->get('Itemid', $itemId,'int');
      $active = $menu->getItem($itemId);
 }

Fügen Sie dann "& task = save & Itemid = 101" zur URL hinzu, die Ihre Fehlermeldung zurückgibt. (Ändern Sie 101 in Ihre Artikel-ID!)

Sie sollten jetzt korrekt umgeleitet werden.

2
Dennis Heiden

Verwenden Sie Folgendes:

$menu           =& JSite::getMenu();
$activeMenu     = $menu->getActive();
$Itemid         = $activeMenu->id;

oder

$menu =& JSite::getMenu();
$activeMenu     = $menu->getActive();
$Itemid         = $activeMenu->query['Itemid'];

Damit Ihre Nachricht weitergeleitet wird, müssen Sie sie aus der Anwendungseingabe abrufen

$JInput = JFactory::getApplication()->input;
$message = $JInput->get('message','','string');
2
Terry Carter

Um Menu Params zu bekommen

Dieser ist perfekt. Ich habe ein paar Stunden gesucht und damit mein Problem mit Joomla 3.6.5 & PHP 7.1

0: Verwenden von $ this, wenn es sich nicht im Objektkontext befindet

Lösung:

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$menuparams         = $menu->getParams($itemId);
1
RadiusTheme