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