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
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.
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');
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);