Silverstripe DataObjects as Pages Part 2 tutorial – проблема с боковой панелью

Я слежу за 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(); } 

У вас есть эквивалентное отношение «Категория» на вашем продукте? Необходимо правильно указать отношение к родительскому элементу.