我正在开发一个Silverstripe模块模块,允许用户订阅一个也发送月刊的网站。
单个组中将有2个级别的用户。该群组中的所有用户都可以登录该网站,但只有拥有有效付费订阅的用户才能看到某些内容。
我有一个扩展主页面对象的DataExtension。这允许我有一个布尔字段来指示仅限订阅者的内容。我的目的是添加" canView"函数,它将对用户的订阅状态执行必要的检查以隐藏非活动成员的链接,当然对管理员返回true。
class MemberPageExtension extends DataExtension {
static $db = array(
'SubscribersOnly' => 'Boolean'
);
public function canView(){
// perform subscription checks here
return false ; // result will be dependent on subscription status
}
}
不幸的是,canView()似乎没有在DataExtension上工作/可用,所以现在我对如何实现这一点感到有些困惑。
有没有办法让" can"页面上的DataExtension可用的函数,还是产生类似的效果而不需要模板中的if语句?
答案 0 :(得分:1)
如果扩展程序需要修改现有方法,那么它有点儿 棘手。它要求您要自定义的方法具有 在您要修改的地方提供了一个扩展挂钩 数据
我刚检查了cms/code/model/SiteTree.php
代码,发现了这些代码:
// Standard mechanism for accepting permission changes from extensions
$extended = $this->extendedCan('canView', $member);
if($extended !== null) return $extended;
所以......是的,您可以修改canView
行为,并声明canView
函数(就像您一样)。
您的问题出在其他地方:您必须告诉我们canView
的定义方式。
快速测试:我刚刚在裸SilverStripe安装上将此代码保存为mysite/code/Page.php
。
<?php
class Page extends SiteTree {
}
class Page_Controller extends ContentController {
}
class MemberPageExtension extends DataExtension {
public function canView(){
// perform subscription checks here
return false ; // result will be dependent on subscription status
}
}
$instance = new Page();
Debug::show($instance->canView());
Page::add_extension('MemberPageExtension');
$instance = new Page();
Debug::show($instance->canView());
第一个调用返回true
,第二个false
。
再次:你的问题存在于其他地方。