it-swarm-es.tech

¿Cuál es la forma correcta de configurar la ruta a un elemento de menú desde un componente?

Así que estoy trabajando en mi nuevo componente y quiero poder enrutar a un elemento del menú cuando se deniega el acceso para una determinada acción.

Creé un campo menu_id en mi tabla y estoy usando el tipo de campo de formulario menuitem para almacenar el itemId del menú.

Pensé que podría usar la función setRedirect de los controladores de esta manera

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

Sin embargo no funcionó. simplemente adjuntó la identificación del artículo a la ruta

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

Esto ni siquiera cargó la vista asociada con el elemento de menú con la ID 101.

¿Necesito especificar la ruta completa? ES DECIR. buscar el enlace de la tabla #__menús y luego llamar a JRoute con ese valor?

Si alguien tiene experiencia con esto, agradecería cualquier información.

---- Editar --- He hecho esto antes consultando la tabla #__menús directamente y obteniendo el valor del enlace y luego introduciéndolo en JRoute. Sin embargo, no me gusta la idea de consultar la tabla directamente porque crea una dependencia directa. Lo que realmente quiero saber es cómo obtener el valor del enlace sin tocar la tabla #__menús, o si hay una manera de dirigir a un elemento del menú utilizando solo el itemId.

1
Mathew Lenning

Bueno. Encontré la respuesta.

Primero para obtener la información del elemento sin consultar el #__menus tabla utiliza este código:

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

Ahora la redirección es un poco difícil, porque quiero usar la ruta correcta, pero si solo envío la ruta a JRoute, termino con un error porque JRoute solo agrega el contenido de la URL al elemento activo actual . El siguiente ejemplo se llama desde el controlador.

Ejemplo:

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

Por supuesto, esto arroja un 404 porque esta ruta no existe. "producto" es parte de mi componente "mi página" es un artículo de artículo com_content.

Sin embargo, puede evitar esto agregando el 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

También probé esto con el $item->link vs el $item->route y parece funcionar igual. Probablemente sea mejor usar el enlace, en caso de que el sitio no esté usando URL amigables para los motores de búsqueda.

¡Espero que esto ayude!

3
Mathew Lenning