ti-enxame.com

Qual é a maneira correta de definir a rota para um item de menu de um componente?

Portanto, estou trabalhando no meu novo componente e quero poder rotear para um item de menu quando o acesso for negado para uma determinada ação.

Criei um campo menu_id na minha tabela e estou usando o tipo de campo do formulário de menu para armazenar o itemId do menu.

Eu pensei que seria capaz de usar a função setRedirect dos controladores assim

if($isRestricted && !$canDownload)
{
    $msg = $this->translate('COM_BABELU_PRODUCTS_DL_NOT_AUTHORISED');
    $this->setRedirect('index.php?itemId=101', $msg, 'warning');
    return false;
}

No entanto, não funcionou. apenas anexou o ID do item à rota

http://mysite.com/previous-menu-item-alias?itemId=101

Isso nem carregou a visualização associada ao item de menu com o ID 101.

Preciso especificar a rota inteira? I.E. procure o link da tabela #__menus e chame JRoute com esse valor?

Se alguém tiver exp com isso, eu realmente aprecio qualquer informação.

---- Edit --- Eu já fiz isso antes consultando a tabela #__menus diretamente e obtendo o valor do link e inserindo-o no JRoute. No entanto, não gosto da ideia de consultar a tabela diretamente, porque ela cria uma dependência direta. O que realmente quero saber é como obter o valor do link sem tocar na tabela #__menus ou se existe uma maneira de direcionar para um item de menu usando apenas o itemId.

1
Mathew Lenning

OK. Eu encontrei a resposta.

Primeiro para obter as informações do item sem consultar o #__menus tabela use este código:

$app = JFactory::getApplication();
$menu = $app->getMenu();
$item = $menu->getItem($itemId);

Agora, o redirecionamento é um pouco difícil, porque quero usar a rota correta, mas se eu enviar a rota para o JRoute, acabo com um erro porque JRoute apenas anexa o conteúdo da URL ao item ativo atual . O exemplo abaixo está sendo chamado do controlador.

Exemplo:

 //current url = http://mysite.com/product
 //$item->route = my-page 

$this->setRedirect(JRoute::_($item->route));
$this->redirect();


//resulting url = http://mysite.com/product/my-page

Obviamente, isso gera um 404 porque essa rota não existe. "product" faz parte do meu componente "my-page" é um item de artigo com_content.

No entanto, você pode contornar isso adicionando o URI:

$route = $item->route;
If((int)$item->home === 1)// its the home menu item, so clear the route
{
    $route = '';
}

$this->setRedirect(JURI::base().$route);
$this->redirect();

// resulting url = http://mysite.com/my-page

Eu também testei isso com o $item->link vs o $item->route e parece funcionar da mesma maneira. Provavelmente, é melhor usar o link, caso o site não esteja usando URLs compatíveis com os mecanismos de pesquisa.

Eu espero que isso ajude!

3
Mathew Lenning