DataObjects Silverstripe как Pages Part 2 Учебное пособие - боковая панель - PullRequest
0 голосов
/ 23 января 2012

Я следил Объекты данных Silverstripe в виде страниц - Часть 2. Использование администратора модели и сегментов URL для создания учебника каталога продуктов на моем локальном хосте и столкнулся с проблемой боковой панели.

Когда я использую тот же метод для создания боковой панели, что и учебник один , на моем сайте появляется сообщение об ошибке [Ошибка пользователя] Uncaught Exception: Object -> __ call (): метод 'страницы категорий 'не существуют в' Product '

Это код, который я добавил в Product.php для отображения боковой панели.

//Return the Title as a menu title
public function MenuTitle()
{
  return $this->Title;
}  

// Убедитесь, что DO отображается в меню (это необходимо, в противном случае боковая панель не отображается, когда вы не вошли в систему)

function canView()
{
 return $this->CategoryPages()->canView();
}

Кто-нибудь знает, как решить эту проблему?Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 23 января 2012

вы пробовали $this->Categories()->First()->canView()? читая комментарии ниже, мне кажется, что вы пытаетесь вызвать canView в списке всех связанных с вами объектов CategoryPage (ComponentSet)

[EDIT] как вы упомянули в комментариях ниже, вы теперь получаете ошибку в cms, вызывающем canView для необъекта. я предполагаю, что вы еще не прикрепили какие-либо категории к какому-либо продукту, поэтому Categories () -> 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.

0 голосов
/ 23 января 2012

Ошибка подсказывает мне, что у вас нет отношения has_one к вашему классу Product с именем CategoryPages. В примере из учебника для класса StaffMember указано следующее (обратите внимание на отношение StaffPage):

//Relations
static $has_one = array (
    'StaffPage' => 'StaffPage',
    'Photo' => 'Image'
);

Это то, на что ссылается в примере функция canView ($ this -> StaffPage ()):

function canView()
{
    return $this->StaffPage()->canView();
}

У вас есть эквивалентные отношения под названием «CategoryPages» в вашем Продукте? Вам необходимо правильно указать отношение к родителю.

0 голосов
/ 23 января 2012

Я сам не пробовал, но, посмотрев на комментарии, вы должны изменить $Category = $this->CategoryPages()->First(); на $Category = $this->Categories()->First();

...