ti-enxame.com

Como obter parâmetros de menu e itemid no controlador de componente

No meu controlador de componente personalizado, tenho a função save (). No final, ele exibe a mensagem e redireciona para o URL

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

Estou tendo problemas para fazer o seguinte:

1. Use o parâmetro de menu do campo personalizado em vez da sequência JText. Se eu usar isso dentro da função:

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

Recebo aviso e erro:

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

$ message é o nome do meu campo de menu personalizado definido no arquivo xml. Se eu ligar diretamente da vista, tudo bem.

2.Obtenha o itemid do menu ativo e use-o dentro de setRedirect ().

Eu recebo itemid vazio no URL se eu usá-lo assim:

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

Encontrei muitas informações sobre como chamar parâmetros de menu em componentes, mas nada disso me ajudou

7
weezle

Após alguns testes, consegui replicar o problema:

** Um formulário é redirecionado para uma visualização sem um item de menu ou redirecionado para si mesmo relativamente a um URL como este:

component/mycomponent/myview

(Não importa se a exibição tem um item de menu ou não, isso é apenas um roteamento estúpido do Joomla.) **

Portanto, o seguinte deve ser feito para evitar o erro:

1) a visualização deve estar vinculada a um item de menu no back-end do Joomla

2) o URL para o formulário no frontend deve ser/menu-alias

3) a ação do formulário não deve ser redirecionada para outra visualização, é melhor ficar vazia

4) o formulário deve conter entradas ocultas com a tarefa

Em seguida, sua postagem e salvar o redirecionamento no controlador funcionam como um encanto, porque você está operando no contexto do item de menu (url).

Porém, se você redirecionar para outra visualização ou via JRoute para a mesma visualização sem salvar o ID do item atual, você deixará o contexto do item de menu ("component/mycomponent/myview").

Isso acontece muito no Joomla, porque o sistema atual do roteador não verifica o URL fornecido nos itens de menu do banco de dados. Para evitar isso, você pode executar as seguintes ações:

1) Estenda o roteador do seu componente com uma função que pesquisa na tabela de itens de menu o URL atual e retorna a identificação do item/item de menu. (Eu já fiz isso no passado e funciona).

2) Adicione campos ocultos em seu formulário que contenham a identificação do item, a tarefa e a exibição do destino (a maneira correta no Joomla de rotear).

3) Redirecione URLs como "component/mycomponent/myview" para o caminho correto da URL.

4) Você pode definir fallbacks nos parâmetros de componente para todas as visualizações. Isso encadeará o ID do item para os parâmetros de componente e não as visualizações para um caminho de URL. Exibir1 -> Menu suspenso -> Selecionar item do menu em cadeia

No controlador:

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

Não use o $ menu-> getActive () se não for absolutamente necessário, devido ao estúpido sistema de roteamento Joomla. Estou recomendando definir o item do menu manualmente de alguma forma.

Voltar à pergunta:

Como eu disse, seu erro está em algum lugar no início do roteamento. Pode ser simplesmente seu URL que leva ao seu formulário ou um redirecionamento após o envio do formulário para uma visualização sem um item de menu ou para um URL que não contenha um itemId.

Prova:

Adicione isso à sua função de salvar entre $ itemid e $ message:

if(empty($itemId)){

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

Em seguida, adicione "& task = save & Itemid = 101" ao URL que retorna sua mensagem de erro. (Altere 101 para o seu ID de item!)

Você deve ser redirecionado corretamente agora.

2
Dennis Heiden

Use o seguinte:

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

ou

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

Para que sua mensagem seja passada, você precisa recuperá-la da entrada do aplicativo

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

Para obter parâmetros de menu

Este é perfeito, eu estava procurando por algumas horas e isso resolveu meu problema no Joomla 3.6.5 & PHP 7.1

0: Usando $ this quando não estiver no contexto do objeto

Solução:

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