it-swarm-id.com

Apa cara yang tepat untuk mengatur rute ke item menu dari dalam suatu komponen?

Jadi saya sedang mengerjakan komponen baru saya dan saya ingin dapat merutekan ke item menu ketika akses ditolak untuk tindakan tertentu.

Saya membuat bidang menu_id di tabel saya dan saya menggunakan jenis bidang form menuitem untuk menyimpan itemId menu.

Saya berpikir bahwa saya akan dapat menggunakan fungsi setRedirect pengendali seperti itu

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

Namun itu tidak berhasil. itu hanya menambahkan id item ke rute

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

Ini bahkan tidak memuat tampilan yang terkait dengan item menu dengan ID 101.

Apakah saya perlu menentukan seluruh rute? YAITU. cari tautan dari tabel #__menus lalu panggil JRoute dengan nilai itu?

Jika ada yang exp dengan ini saya akan sangat menghargai informasi apa pun.

---- Edit --- Saya sudah melakukan ini sebelumnya dengan menanyakan tabel #__menus secara langsung dan mendapatkan nilai tautan lalu mendorongnya ke JRoute. Namun saya tidak suka ide untuk menanyakan tabel secara langsung karena itu menciptakan ketergantungan langsung. Yang benar-benar ingin saya ketahui adalah cara mendapatkan nilai tautan tanpa menyentuh tabel #__menus, atau jika ada cara untuk mengarahkan ke item menu hanya menggunakan itemId.

1
Mathew Lenning

Baik. Saya menemukan jawabannya.

Pertama yang mendapatkan informasi item tanpa menanyakan #__menus tabel gunakan kode ini:

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

Sekarang redirect sedikit sulit, karena saya ingin menggunakan rute yang tepat, tetapi jika saya hanya mengirim rute ke JRoute, saya berakhir dengan kesalahan karena JRoute hanya menambahkan konten url ke item aktif saat ini . Contoh di bawah ini dipanggil dari controller.

Contoh:

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

Ini tentu saja melempar 404 karena rute ini tidak ada. "produk" adalah bagian dari komponen saya "halaman saya" adalah item artikel com_content.

Namun Anda dapat menyiasatinya dengan menambahkan 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

Saya juga menguji ini dengan $item->link vs. $item->route dan sepertinya berfungsi sama. Mungkin lebih baik menggunakan tautan, kalau-kalau situs tidak menggunakan URL ramah mesin pencari.

Saya harap ini membantu!

3
Mathew Lenning