web-dev-qa-db-fra.com

Quelle est la bonne façon de définir l'itinéraire vers un élément de menu à partir d'un composant?

Je travaille donc sur un nouveau composant et je souhaite pouvoir accéder à un élément de menu lorsque l'accès est refusé pour une action donnée.

J'ai créé un champ menu_id dans ma table et j'utilise le type de champ menuitem pour stocker l'item de menu.

Je pensais que je serais en mesure d'utiliser les contrôleurs setRedirect fonction comme si

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

Cependant cela n'a pas fonctionné. il vient d'ajouter l'id d'élément à l'itinéraire

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

Cela n'a même pas chargé la vue associée à l'élément de menu portant l'ID 101.

Dois-je spécifier l'itinéraire complet? C'EST À DIRE. recherchez le lien dans la table #__menus, puis appelez JRoute avec cette valeur?

Si quelqu'un a exp avec cela, j'apprécierais vraiment toute information.

---- Edit --- J'ai déjà fait cela auparavant en interrogeant directement la table #__menus et en obtenant la valeur du lien, puis en l'envoyant dans JRoute. Cependant, je n'aime pas l'idée d'interroger directement la table car cela crée une dépendance directe. Ce que je veux vraiment savoir, c'est comment obtenir la valeur du lien sans toucher à la table #__menus, ou s'il existe un moyen de passer directement à un élément de menu en utilisant uniquement itemId.

1
Mathew Lenning

D'accord. J'ai trouvé la réponse.

D'abord pour obtenir les informations sur l'item sans interroger le #__menus table utilise ce code:

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

Maintenant, la redirection est un peu difficile, parce que je veux utiliser le bon chemin, mais si j'envoie juste le chemin à JRoute, je me retrouve avec une erreur car JRoute n'ajoute que le contenu de l'URL à l'élément actif en cours. . L'exemple ci-dessous est appelé par le contrôleur.

Exemple:

 //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

Ceci jette bien sûr un 404 car cette route n’existe pas. "produit" fait partie de mon composant "ma page" est un article com_content.

Cependant, vous pouvez contourner cela en ajoutant l'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

J'ai aussi testé cela avec le $item->link vs le $item->route et cela semble fonctionner de la même manière. Il est probablement préférable d'utiliser le lien, au cas où le site n'utilise pas d'URL conviviales pour les moteurs de recherche.

J'espère que ça aide!

3
Mathew Lenning