it-swarm-vi.com

Cách thích hợp để đặt tuyến đường đến một mục menu từ bên trong một thành phần là gì?

Vì vậy, tôi đang làm việc trên một thành phần mới của mình và tôi muốn có thể định tuyến đến một mục menu khi quyền truy cập bị từ chối cho một hành động nhất định.

Tôi đã tạo một trường menu_id trong bảng của mình và tôi đang sử dụng loại trường biểu mẫu menuitem để lưu trữ mục menuId.

Tôi nghĩ rằng tôi sẽ có thể sử dụng bộ điều khiển setRedirect như vậy

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

Tuy nhiên nó không hoạt động. nó chỉ gắn id vật phẩm vào tuyến

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

Điều này thậm chí không tải chế độ xem được liên kết với mục menu với ID 101.

Tôi có cần chỉ định toàn bộ tuyến đường không? I E. Tra cứu liên kết từ bảng #__menus và sau đó gọi JRoute với giá trị đó?

Nếu bất cứ ai có exp với điều này, tôi thực sự sẽ đánh giá cao bất kỳ thông tin.

---- Chỉnh sửa --- Tôi đã thực hiện điều này trước đây bằng cách truy vấn trực tiếp bảng #__menus và nhận giá trị liên kết sau đó đẩy nó vào JRoute. Tuy nhiên tôi không thích ý tưởng truy vấn bảng trực tiếp vì nó tạo ra sự phụ thuộc trực tiếp. Điều tôi thực sự muốn biết là làm thế nào để có được giá trị liên kết mà không cần chạm vào bảng #__menus hoặc nếu có một cách để chuyển đến một mục menu chỉ sử dụng itemId.

1
Mathew Lenning

Đuợc. Tôi tìm thấy câu trả lời.

Đầu tiên để có được thông tin mục mà không cần truy vấn #__menus bảng sử dụng mã này:

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

Bây giờ việc chuyển hướng hơi khó khăn, vì tôi muốn sử dụng tuyến thích hợp, nhưng nếu tôi chỉ gửi tuyến đến JRoute, tôi sẽ gặp lỗi vì JRoute chỉ thêm nội dung url vào mục hoạt động hiện tại . Ví dụ dưới đây đang được gọi từ bộ điều khiển.

Thí dụ:

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

Điều này tất nhiên ném 404 vì tuyến đường này không tồn tại. "sản phẩm" là một phần của thành phần "trang của tôi" là một mục bài viết com_content.

Tuy nhiên, bạn có thể khắc phục điều này bằng cách thêm 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

Tôi cũng đã thử nghiệm điều này với $item->link so với $item->route và nó dường như hoạt động như nhau. Có lẽ tốt hơn để sử dụng liên kết, chỉ trong trường hợp trang web không sử dụng URL thân thiện với công cụ tìm kiếm.

Tôi hi vọng cái này giúp được!

3
Mathew Lenning