Я слежу за Silverstripe DataObjects как страницы – Часть 2: Использование администраторов моделей и URL-сегментов для создания учебника по каталогу продуктов на моем локальном хосте и запуске проблемы с боковой панелью.
Когда я использую тот же метод для создания боковой панели в качестве учебника , на моем сайте появляется сообщение об ошибке [Ошибка пользователя] Неиспользуемое исключение: Object -> __ call (): метод «categorypages» метода не существует в «Product»,
Это код, который я добавил в Product.php для отображения боковой панели.
//Return the Title as a menu title public function MenuTitle() { return $this->Title; }
// Убедитесь, что DO отображается в меню (это необходимо, иначе боковая панель не будет отображаться, когда не войдет в систему)
function canView() { return $this->CategoryPages()->canView(); }
Кто-нибудь знает, как решить эту проблему? Огромное спасибо.
вы пробовали $this->Categories()->First()->canView()
? прочитав комментарии ниже, мне кажется, что вы пытаетесь вызвать canView в списке всех ваших связанных объектов CategoryPage (ComponentSet)
[EDIT], как вы упомянули в комментариях ниже, вы получаете сообщение об ошибке в cms, вызывающем canView на не-объекте. Я предполагаю, что вы еще не прикрепляли какие-либо категории к некоторому Продукту, поэтому Категории () -> First () возвращает NULL. Пожалуйста попробуйте:
function canView() { //always show this product for users with full administrative rights (see tab 'Security' in CMS if(Permission::check('ADMIN')) return true; //go and get all categories this product belongs to $categories = $this->Categories(); //are there any categories? if($categories->Count() > 0) { //get the first category to see wheter it's viewable by the current user return $categories->First()->canView(); } else { //product doesn't belong to any categories, so don't render it return false; } }
я действительно не понимаю, почему вы внедрили эту проверку canView. действительно ли важно, чтобы Продукт уже был связан с категорией? иначе просто return true;
в вашем методе canView.
Я сам не пробовал, но, взглянув на комментарии, вы должны изменить $Category = $this->CategoryPages()->First();
to $Category = $this->Categories()->First();
Ошибка подскажет мне, что у вас нет отношения has_one в вашем классе Product с именем «CategoryPages». Пример в учебнике имеет следующий класс StaffMember (обратите внимание на отношение StaffPage):
//Relations static $has_one = array ( 'StaffPage' => 'StaffPage', 'Photo' => 'Image' );
Это то, что указано в примере функции canView ($ this-> StaffPage ()):
function canView() { return $this->StaffPage()->canView(); }
У вас есть эквивалентное отношение «Категория» на вашем продукте? Необходимо правильно указать отношение к родительскому элементу.