it-swarm.it

Qual è il modo corretto di impostare il percorso verso una voce di menu all'interno di un componente?

Quindi sto lavorando sul mio nuovo componente e voglio essere in grado di instradare verso una voce di menu quando viene negato l'accesso per una determinata azione.

Ho creato un campo menu_id nella mia tabella e sto usando il tipo di campo modulo menuitem per memorizzare la voce di menu ID.

Ho pensato che sarei stato in grado di utilizzare la funzione setRedirect dei controller in questo modo

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

Tuttavia non ha funzionato. ha appena aggiunto l'id articolo al percorso

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

Ciò non ha nemmeno caricato la vista associata alla voce di menu con l'ID 101.

Devo specificare l'intero percorso? OSSIA cercare il collegamento dalla tabella #__menus e quindi chiamare JRoute con quel valore?

Se qualcuno ha exp con questo apprezzerei davvero qualsiasi informazione.

---- Modifica --- L'ho già fatto interrogando direttamente la tabella #__menus e ottenendo il valore del collegamento, quindi inserendolo in JRoute. Tuttavia, non mi piace l'idea di interrogare direttamente la tabella perché crea una dipendenza diretta. Quello che voglio davvero sapere è come ottenere il valore del collegamento senza toccare la tabella #__menus, o se c'è un modo per indirizzare a una voce di menu usando solo itemId.

1
Mathew Lenning

Va bene. Ho trovato la risposta.

Per prima cosa per ottenere le informazioni sull'articolo senza interrogare la tabella #__menus Usa questo codice:

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

Ora il reindirizzamento è un po 'difficile, perché voglio usare il percorso corretto, ma se invio il percorso a JRoute, finisco con un errore perché JRoute aggiunge semplicemente il contenuto dell'URL all'elemento attivo corrente . L'esempio seguente viene chiamato dal controller.

Esempio:

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

Questo ovviamente genera un 404 perché questo percorso non esiste. "product" fa parte del mio componente "my-page" è un articolo di articolo com_content.

Tuttavia puoi aggirare questo aggiungendo 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

Ho anche provato questo con il $item->link Rispetto al $item->route E sembra funzionare allo stesso modo. Probabilmente è meglio usare il link, nel caso in cui il sito non stia utilizzando URL compatibili con i motori di ricerca.

Spero che aiuti!

3
Mathew Lenning