So erhalten Sie Menüparameter und Element-ID in der Komponentensteuerung

7

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

weezle
quelle
Können Sie das Menüelementobjekt var_dumb? var_dump ($ active); ? Ich habe versucht, Sie Code in meiner benutzerdefinierten Komponente, und es funktionierte in der Hilfsdatei und in der Ansicht.
Dennis Heiden
Wie ich bereits erwähnt habe, funktioniert es aus meiner Sicht auch, aber nicht im Controller.
Weezle
Bitte geben Sie den Code Ihrer Speicherfunktion (+ die Art und Weise, wie der Controller implementiert ist und aufgerufen wird) und die XML-Datei Ihres benutzerdefinierten Felds an. Ich habe das Laden von Menüparametern im Hauptkomponenten-Controller getestet und es funktioniert für mich.
Dennis Heiden
Dies ist die Funktion innerhalb von Komponenten / com_jpainter / controller.php: gist.github.com/esedic/6ed98466be93008ab777 - Controller wird wie folgt aus den Komponenten genannt / com_jpainter / jpainter.php gist.github.com/esedic/5fc78d8fd1ceed5e2f05 Und das ist xml innerhalb von Komponenten /com_jpainter/views/jpainter/tmpl/default.xml (Feldsatz erweitert) gist.github.com/esedic/4cd7e9bf4f2a4253562d
weezle
Vielen Dank, ich werde versuchen, das Problem zu replizieren.
Dennis Heiden

Antworten:

2

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:

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.

Dennis Heiden
quelle
Ich weiß, dass ich etwas spät dran bin, aber danke für deine Mühe. Ich habe Ihre Lösung nicht getestet, ich hatte einen engen Zeitplan, also habe ich es geschafft, sie anders zu lösen.
Weezle
Wie haben Sie das Problem gelöst?
Dennis Heiden
Ich hatte es eilig, also habe ich nur itemid fest codiert. Ich versuche, Ihre Lösung in Zukunft umzusetzen.
Weezle
2

Verwenden Sie Folgendes:

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

oder

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

Um Ihre Nachricht weiterzuleiten, müssen Sie sie von der Anwendungseingabe abrufen

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

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:

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