我一直在关注本地主机上的Silverstripe DataObjects as Pages - Part 2: Using Model Admin and URL Segments to create a product catalogue tutorial并遇到侧边栏问题。
当我使用相同的方法创建侧边栏tutorial one时,我的网站上会显示一条错误消息[用户错误]未捕获异常:对象 - > __ call():方法'categorypages'不存在在'产品'
这是我添加到Product.php以显示侧边栏的代码。
//Return the Title as a menu title
public function MenuTitle()
{
return $this->Title;
}
//确保DO显示在菜单中(需要时,否则侧栏不会在未登录时显示)
function canView()
{
return $this->CategoryPages()->canView();
}
有谁知道如何解决这个问题?非常感谢。
答案 0 :(得分:2)
你试过$this->Categories()->First()->canView()
吗?
阅读下面的评论,在我看来,你试图在所有相关的CategoryPage对象(ComponentSet)的列表上调用canView
[编辑] 正如您在下面的评论中提到的,现在在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检查。产品是否已经与某个类别相关,这真的很重要吗?否则,只需在canView方法中return true;
。
答案 1 :(得分:0)
我自己没有尝试过,但看一下您应该将$Category = $this->CategoryPages()->First();
更改为$Category = $this->Categories()->First();
答案 2 :(得分:0)
错误会告诉我您的Product类上没有has_one关系,名称为“CategoryPages”。本教程中的示例在StaffMember类上有以下内容(请注意StaffPage关系):
//Relations
static $has_one = array (
'StaffPage' => 'StaffPage',
'Photo' => 'Image'
);
这是canView函数示例中引用的内容($ this-> StaffPage ()):
function canView()
{
return $this->StaffPage()->canView();
}
您的产品上是否有名为'CategoryPages'的等效关系?您需要正确指定与父级的关系。