web-dev-qa-db-fra.com

Comment obtenir les paramètres de menu et itemid dans le contrôleur de composant

Dans mon contrôleur de composant personnalisé, j'ai la fonction save (). À la fin, il affiche le message et redirige vers l'URL

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

J'ai des problèmes pour faire ce qui suit:

1.Utilisez le paramètre de menu du champ personnalisé au lieu de la chaîne JText. Si j'utilise ceci à l'intérieur de la fonction:

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

Je reçois un avis et une erreur:

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

$ message est le nom de mon champ de menu personnalisé défini dans un fichier xml. Si je l'appelle directement de la vue, alors c'est bon.

2.Obtenez le menu itemid actif et utilisez-le dans setRedirect ().

Je reçois un itemid vide dans l'URL si je l'utilise comme ceci:

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

J'ai trouvé beaucoup d'informations sur l'appel de paramètres de menu dans des composants, mais rien ne m'a aidé

7
weezle

Après quelques tests, j'ai pu reproduire le problème:

** Un formulaire redirige vers une vue sans élément de menu ou redirige vers lui-même par rapport à une URL semblable à celle-ci:

composant/mon composant/ma vue

(Peu importe que la vue comporte un élément de menu ou non, il s'agit simplement d'un routage stupide de Joomla.) **

Par conséquent, il faut procéder comme suit pour éviter l'erreur:

1) la vue doit être liée à un élément de menu dans le backend de Joomla

2) l'URL du formulaire dans l'interface devrait être/menu-alias

3) l'action de formulaire ne doit pas être redirigée vers une autre vue, mieux vaut être vide

4) le formulaire doit contenir des entrées cachées avec la tâche

Ensuite, votre redirection de messages et de sauvegarde dans le contrôleur fonctionne comme un charme, car vous travaillez dans le contexte de l’élément de menu (url).

Toutefois, si vous redirigez vers une autre vue ou via JRoute vers la même vue sans enregistrer l'id d'élément actuel, vous quitterez le contexte de l'élément de menu ("composant/mon composant/ma vue").

Cela se produit souvent dans Joomla, car le système de routeur actuel ne vérifie pas l'URL donnée par rapport aux éléments de menu de la base de données. Pour éviter cela, vous pouvez effectuer les actions suivantes:

1) Étendez le routeur de votre composant avec une fonction qui recherche l’URL actuelle dans le tableau des éléments de menu et renvoie l’ID/élément de menu. (Je l'ai déjà fait dans le passé et ça marche.)

2) Ajoutez dans votre formulaire un champ caché contenant l’id de l’élément, la tâche et la vue cible (le chemin correct dans Joomla pour router).

3) Rediriger des URL du type "composant/mon composant/ma vue" vers le chemin correct de l'URL.

4) Vous pouvez définir des replis dans les paramètres du composant pour chaque vue. Cela chaînera l'id d'élément aux paramètres du composant et non les vues à un chemin d'URL. Affichage1 -> Liste déroulante -> Sélectionner un élément de menu chaîné

Dans le contrôleur:

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

N'utilisez pas le $ menu-> getActive () si ce n'est absolument nécessaire, à cause du stupide système de routage Joomla. Je recommande de régler l'élément de menu manuellement.

Retour à la question:

Comme je l'ai dit, votre erreur se situe quelque part au début du routage. Cela pourrait être simplement votre URL qui mène à votre formulaire ou une redirection après avoir soumis le formulaire à une vue sans élément de menu ou à une URL ne contenant pas d'élément.

Preuve:

Ajoutez ceci à votre fonction de sauvegarde entre $ itemid et $ message:

if(empty($itemId)){

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

Ajoutez ensuite "& task = save & Itemid = 101" à l'URL qui renvoie votre message d'erreur. (Changer 101 à votre identifiant d'article!)

Vous devriez être redirigé correctement maintenant.

2
Dennis Heiden

Utilisez le suivant:

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

ou

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

Pour que votre message soit transmis, vous devez le récupérer à partir de l'entrée de l'application.

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

Pour obtenir les paramètres du menu

Celui-ci est parfait. Je cherchais depuis quelques heures et cela résolvait mon problème de Joomla 3.6.5 & PHP 7.1

0: Utilisation de $ this lorsque le contexte de l'objet n'est pas

Solution:

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