Silverstripe DataObjects as Pages第2部分教程侧边栏问题

时间:2012-01-22 22:22:19

标签: php content-management-system silverstripe

我一直在关注本地主机上的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();
}

有谁知道如何解决这个问题?非常感谢。

3 个答案:

答案 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'的等效关系?您需要正确指定与父级的关系。