2012-01-22 3 views
0

Я слежу за Silverstripe DataObjects as Pages - Part 2: Using Model Admin and URL Segments to create a product catalogue tutorial на моем локальном хосте и сталкиваюсь с проблемой боковой панели.Silverstripe DataObjects as Pages Part 2 tutorial- sidebar issue

Когда я использую тот же метод для создания боковой панели, как tutorial one, на моем сайте отображается сообщение об ошибке [Ошибка пользователя] Неиспользуемое исключение: Объект -> __ вызов(): метод «categorypages» метода не существует в «Product»

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

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

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

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

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

ответ

2

Вы пытались $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.

+0

Привет, Schellmax, спасибо за ваш быстрый ответ. Вы можете видеть, что я пытаюсь выяснить это СС.Я изменил строку на $ this-> Categories-> First() -> canView() Теперь эта страница работает нормально, но в администраторе CMS я нажимаю «Продукт», затем «Поиск» (чтобы показать весь существующий продукт). Он появился в Fatal Ошибка: вызов функции-члена canView() для не-объекта. Любые предложения по этому поводу? Спасибо, кучи! Sam :) – grumpypanda

+0

, то, скорее всего, вы еще не прикрепили страницы категорий. я добавлю некоторое обходное решение в свой ответ выше – schellmax

+0

Спасибо, Schellmax, вы легенда! Я хочу, чтобы в один прекрасный день мои навыки кодирования будут похожи на ваши. Причина, по которой я реализую функцию canView, заключается в том, что боковая панель исчезает, если я выхожу из раздела администрирования SS без нее. Я проверил каждый продукт в админ, все они имеют одну или несколько категорий, не имеет значения, связан ли продукт с категорией или нет. Сможете ли вы объяснить свой код выше немного больше, чем то, что он делает? Извините, я довольно новичок в SS. Согласно моей цели и тому, что вы сказали выше, я полагаю, что я должен просто использовать функцию canView() {return true; } Огромное спасибо!! – grumpypanda

0

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

+0

Привет, Xeraa, спасибо за ваш ответ. Я видел комментарий, код, который я использую, это $ Category = $ this-> Categories() -> First(); Любые другие предложения? Спасибо, кучи! :) – grumpypanda

0

Погрешность хотел бы предложить мне, что вы не имеете отношения HAS_ONE на классе продукта с именем 'CategoryPages'. Пример в учебнике имеет следующий по классу StaffMember (обратите внимание на отношения StaffPage):

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

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

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

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

+0

Привет, Шейн, большое спасибо за ваш ответ, я определил отношения на Product.php: static $ belongs_many_many = array ( 'Категории' => 'CategoryPage'); и на CategoryPage.php: static $ many_many = array ('Products' => 'Product'); Вы правы, что мне нужно изменить return $ this-> CategoryPages() -> canView(); вернуть $ this-> Категории() -> canView(); для правильной ссылки. Однако теперь у меня появилось еще одно сообщение об ошибке: [User Error] Uncaught Exception: Object -> __ call(): метод canview не существует в «ComponentSet». Какие-либо предложения по устранению этого? Спасибо Шейну. Cheers, Sam :) – grumpypanda