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 verwende:
$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$message = $active->params->get('message');
Ich bekomme 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 Ansicht aufrufe, ist es in Ordnung.
2. Holen Sie sich die aktive Menüelement-ID und verwenden Sie sie in setRedirect ().
Ich erhalte eine leere Artikel-ID in der URL, wenn ich sie wie folgt 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
Antworten:
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 um:
Komponente / meine Komponente / meine Ansicht
(Es spielt keine Rolle, ob die Ansicht einen Menüpunkt enthält oder nicht, dies ist nur dummes 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 umleiten, sondern leer sein
4) Das Formular sollte versteckte Eingaben für die Aufgabe enthalten
Dann funktioniert Ihre Post- und Speicherumleitung 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 Kontext des Menüelements ("component / mycomponent / myview").
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 um eine 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 Ihrem Formular ausgeblendete Felder hinzu, die die Element-ID, die Aufgaben- und die Zielansicht enthalten (der richtige Weg in Joomla zur Route).
3) Leiten Sie URLs wie "component / mycomponent / myview" auf den richtigen URL-Pfad um.
4) Sie können Fallbacks in den Komponentenparametern für jede Ansicht festlegen. Dadurch wird die Element-ID mit den Komponentenparametern und nicht die Ansichten mit einem URL-Pfad verknüpft. Ansicht1 -> Dropdown -> Verkettetes Menüelement auswählen
In der Steuerung:
$ itemId = $ params-> get ($ mycurrentviewname);
Verwenden Sie nicht das $ menu-> getActive (), wenn dies aufgrund des dummen Joomla-Routingsystems nicht unbedingt erforderlich ist. Ich empfehle, den Menüpunkt irgendwie manuell einzustellen.
Zurück zur Frage:
Wie gesagt, Ihr Fehler steht irgendwo am Anfang des Routings. Dies kann einfach Ihre URL sein, die zu Ihrem Formular oder einer Weiterleitung führt, nachdem Sie das Formular an eine Ansicht ohne Menüelement oder an eine URL gesendet haben, die keine itemId enthält.
Beweis:
Fügen Sie dies Ihrer Speicherfunktion zwischen $ itemid und $ message hinzu:
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.
quelle
Verwenden Sie Folgendes:
oder
Um Ihre Nachricht weiterzuleiten, müssen Sie sie von der Anwendungseingabe abrufen
quelle
Menüparameter abrufen
Dieser ist perfekt Ich habe ein paar Stunden gesucht und dies löst mein Problem mit Joomla 3.6.5 & PHP 7.1
0: Verwenden Sie $ this, wenn Sie sich nicht im Objektkontext befinden
Lösung:
quelle