it-swarm.it

Come ottenere i parametri di menu e itemid nel controller componenti

Nel mio controller componenti personalizzato ho la funzione save (). Alla fine visualizza il messaggio e reindirizza all'URL

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

Ho problemi a fare quanto segue:

1.Utilizzare il parametro di menu dal campo personalizzato anziché dalla stringa JText. Se uso questo all'interno della funzione:

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

Ricevo avviso ed errore:

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

$ message è il nome del mio campo di menu personalizzato definito nel file xml. Se lo chiamo direttamente dalla vista, allora va bene.

2.Ottieni la voce di menu attiva e usala all'interno di setRedirect ().

Ottengo itemid vuoto nell'URL se lo uso in questo modo:

$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));

Ho trovato molte informazioni sulla chiamata dei parametri di menu nei componenti, ma nessuno di questi mi ha aiutato

7
weezle

Dopo alcuni test, sono stato in grado di replicare il problema:

** Un modulo reindirizza a una vista senza una voce di menu o reindirizza a se stesso relativamente a un URL come questo:

componente/mycomponent/myview

(Non importa se la vista ha una voce di menu o meno, questo è solo uno stupido routing di Joomla.) **

Pertanto per evitare l'errore è necessario:

1) la vista deve essere collegata a una voce di menu nel backend di Joomla

2) l'URL al modulo nel frontend dovrebbe essere/menu-alias

3) l'azione dei moduli non dovrebbe reindirizzare a un'altra vista, meglio essere vuota

4) il modulo deve contenere input nascosti con l'attività

Quindi il tuo post e salva il reindirizzamento nel controller funziona come un incantesimo, perché stai operando nel contesto della voce di menu (url).

Ma, se reindirizzi a un'altra vista o tramite JRoute alla stessa vista senza salvare l'ID voce corrente, lascerai il contesto della voce di menu ("componente/miocomponente/mia vista").

Questo succede molto in Joomla, perché l'attuale sistema di router non controlla l'URL dato rispetto alle voci di menu nel database. Per evitare ciò, puoi fare le seguenti azioni:

1) Estendi il router del tuo componente con una funzione che cerca nella tabella delle voci di menu l'URL corrente e restituisce l'ID/la voce di menu. (L'ho già fatto in passato e funziona.)

2) Aggiungi un campo nascosto nel tuo modulo che contenga l'id oggetto, l'attività e la vista di destinazione (il modo corretto in Joomla per instradare).

3) Reindirizzare gli URL come "component/mycomponent/myview" al percorso URL corretto.

4) È possibile impostare i fallback nei parametri del componente per ogni vista. Ciò incatenerà l'id dell'elemento ai parametri del componente e non le viste in un percorso dell'URL. Visualizza1 -> Elenco a discesa -> Seleziona voce di menu concatenata

Nel controller:

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

Non usare $ menu-> getActive () se non assolutamente necessario, a causa dello stupido sistema di routing Joomla. Sto raccomandando di impostare la voce di menu in qualche modo.

Torna alla domanda:

Come ho detto, il tuo errore è da qualche parte all'inizio del routing. Questo potrebbe essere semplicemente il tuo URL che porta al tuo modulo o un reindirizzamento dopo aver inviato il modulo a una vista senza una voce di menu o a un URL che non contiene un itemId.

Prova:

Aggiungi questo alla tua funzione di salvataggio tra $ itemid e $ message:

if(empty($itemId)){

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

Quindi aggiungi "& task = save & Itemid = 101" all'URL che restituisce il tuo messaggio di errore. (Cambia 101 nel tuo ID oggetto!)

Ora dovresti essere reindirizzato correttamente.

2
Dennis Heiden

Utilizza il seguente:

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

o

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

Per far passare il tuo messaggio devi recuperarlo dall'input dell'applicazione

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

Per ottenere Menu Params

Questo è perfetto Stavo cercando poche ore e questo risolve il mio problema con Joomla 3.6.5 & PHP 7.1

0: Usando $ this quando non nel contesto dell'oggetto

Soluzione:

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