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


7

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


Bạn có thể var_dumb đối tượng mục menu? var_dump ($ hoạt động); ? Tôi đã thử mã cho bạn trong thành phần tùy chỉnh của tôi và nó hoạt động trong tệp trợ giúp và trong chế độ xem.
Dennis Heiden

Như tôi đã đề cập, nó cũng hoạt động theo quan điểm của tôi, nhưng không phải trong bộ điều khiển.
tuần trăng mật

Vui lòng cung cấp mã của chức năng lưu của bạn (+ cách trình điều khiển được triển khai và được gọi) và xml của trường tùy chỉnh của bạn. Tôi đã thử tải các thông số menu trong bộ điều khiển thành phần chính và nó hoạt động với tôi.
Dennis Heiden

Đây là chức năng bên trong các thành phần / com_jpainter / controller.php: gist.github.com/esedic/6ed98466be93008ab777 điều khiển được gọi là như thế này từ các thành phần / com_jpainter / jpainter.php gist.github.com/esedic/5fc78d8fd1ceed5e2f05 Và đây là xml bên trong các thành phần /com_jpainter/views/jpainter/tmpl/default.xml (fieldset nâng cao) gist.github.com/esedic/4cd7e9bf4f2a4253562d
weezle

Thanx, tôi sẽ cố gắng tái tạo vấn đề.
Dennis Heiden

Câu trả lời:


2

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 đó, những điều sau đây phải được thực hiện để ngăn ngừa 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 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, bởi 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 thiết lập các mục menu bằng tay bằng 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 trình đơn hoặc url không chứa mụcId.

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ờ.


Tôi biết tôi hơi muộn, nhưng cảm ơn vì nỗ lực của bạn. Tôi đã không kiểm tra giải pháp của bạn, tôi đã có một lịch trình chặt chẽ vì vậy tôi đã xoay sở để giải quyết nó theo cách khác.
Midizle

Làm thế nào bạn giải quyết vấn đề?
Dennis Heiden

Tôi đã vội vàng vì vậy tôi chỉ cần mã hóa cứng. Tôi cố gắng thực hiện giải pháp của bạn trong tương lai.
tuần trăng mật

2

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

Để 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 có trong ngữ 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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.