it-mot-dan-vi.com

Làm thế nào để có được các tham số menu và itemid trong bộ điều khiển thành phần

Trong bộ điều khiển thành phần tùy chỉnh của tôi, tôi có chức năng save (). Cuối cùng, nó sẽ hiển thị thông báo và chuyển hướng đến url

$this->setMessage(JText::_('SOME_TEXT'));
$this->setRedirect(JRoute::_('index.php?option=com_foo&view=foo', false));

Tôi đang gặp vấn đề phải làm như sau:

1.Sử dụng tham số menu từ trường tùy chỉnh thay vì chuỗi JText. Nếu tôi sử dụng bên trong chức năng này:

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$message = $active->params->get('message');

Tôi nhận được thông báo và lỗi:

Notice: Trying to get property of non-object...
Fatal error: Call to a member function get() on a non-object...

$ message là tên của trường menu tùy chỉnh của tôi được xác định trong tệp xml. Nếu tôi gọi nó trực tiếp từ xem, thì nó ổn.

2.Nhận mục menuid hoạt động và sử dụng nó trong setRedirect ().

Tôi nhận được itemid trống trong URL nếu tôi sử dụng nó như thế này:

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$this->setRedirect(JRoute::_('index.php?option=com_foo&view=foo&Itemid='.$itemId, false));

Tôi đã tìm thấy rất nhiều thông tin về việc gọi các tham số menu trong các thành phần nhưng không có thông tin nào giúp tôi

7
weezle

Sau một số thử nghiệm, tôi đã có thể sao chép vấn đề:

** Một biểu mẫu chuyển hướng đến một chế độ xem mà không có mục trình đơn hoặc chuyển hướng đến chính nó tương đối đến một url như thế này:

thành phần/mycomponent/myview

(Không quan trọng nếu chế độ xem có mục menu hay không, đây chỉ là định tuyến Joomla ngu ngốc.) **

Do đó, phải thực hiện các thao tác sau để tránh lỗi :

1) chế độ xem phải được liên kết với một mục menu trong phần phụ trợ Joomla

2) url của biểu mẫu trong frontend phải là/menu-alias

3) hành động biểu mẫu không nên chuyển hướng đến chế độ xem khác, tốt hơn là để trống

4) biểu mẫu phải chứa các đầu vào ẩn với tác vụ

Sau đó, bài đăng của bạn và lưu chuyển hướng trong bộ điều khiển hoạt động như một bùa mê, bởi vì bạn đang hoạt động trong bối cảnh mục menu (url).

Nhưng, nếu bạn chuyển hướng đến một chế độ xem khác hoặc thông qua JRoute đến cùng một chế độ xem mà không lưu id mục hiện tại, bạn sẽ rời khỏi bối cảnh mục menu ("thành phần/mycomponent/myview").

Điều này xảy ra rất nhiều trong Joomla, vì hệ thống bộ định tuyến hiện tại không kiểm tra url đã cho so với các mục menu trong cơ sở dữ liệu. Để ngăn chặn điều đó, bạn có thể thực hiện các hành động sau :

1) Mở rộng bộ định tuyến của thành phần của bạn bằng chức năng tìm kiếm bảng mục menu cho url hiện tại và trả về mục id/mục menu. (Tôi đã làm điều đó trong quá khứ và nó hoạt động.)

2) Thêm một trường ẩn trong biểu mẫu của bạn có chứa id mục, tác vụ và chế độ xem đích (cách chính xác trong Joomla để định tuyến).

3) Chuyển hướng các url như "thành phần/mycomponent/myview" sang đường dẫn url chính xác.

4) Bạn có thể đặt dự phòng trong các thông số thành phần cho mọi chế độ xem. Điều này sẽ xâu chuỗi id mục tới các thông số thành phần chứ không phải các khung nhìn cho một đường dẫn url. View1 -> Dropdown -> Chọn Mục menu Chained

Trong bộ điều khiển:

$ itemId = $ params-> get ($ myc hiệnviewname);

Đừng sử dụng $ menu-> getActive () nếu không thực sự cần thiết, vì hệ thống định tuyến Joomla ngu ngốc. Tôi khuyên bạn nên đặt mục trình đơn theo cách nào đó.

Quay lại câu hỏi :

Làm thế nào tôi nói, lỗi của bạn là một nơi nào đó trong khi bắt đầu định tuyến. Đây có thể chỉ đơn giản là url của bạn dẫn đến biểu mẫu của bạn hoặc chuyển hướng sau khi gửi biểu mẫu đến chế độ xem mà không có mục menu hoặc url không chứa itemId.

Bằng chứng:

Thêm phần này vào chức năng lưu của bạn giữa $ itemid và $ message:

if(empty($itemId)){

      $itemId = $app->input->get('Itemid', $itemId,'int');
      $active = $menu->getItem($itemId);
 }

Sau đó thêm "& task = save & Itemid = 101" vào url trả về thông báo lỗi của bạn. (Thay đổi 101 thành id mục của bạn!)

Bạn nên được chuyển hướng chính xác ngay bây giờ.

2
Dennis Heiden

Sử dụng như sau:

$menu           =& JSite::getMenu();
$activeMenu     = $menu->getActive();
$Itemid         = $activeMenu->id;

hoặc là

$menu =& JSite::getMenu();
$activeMenu     = $menu->getActive();
$Itemid         = $activeMenu->query['Itemid'];

Để thông điệp của bạn được thông qua, bạn cần lấy nó từ đầu vào ứng dụng

$JInput = JFactory::getApplication()->input;
$message = $JInput->get('message','','string');
2
Terry Carter

Để có Params Menu

Cái này là hoàn hảo Tôi đã tìm kiếm vài giờ và điều này giải quyết vấn đề của tôi về Joomla 3.6.5 & PHP 7.1

0: Sử dụng $ this khi không ở trong bối cảnh đối tượng

Giải pháp :

$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
$itemId = $active->id;
$menuparams         = $menu->getParams($itemId);
1
RadiusTheme