CanView对DataExtension的影响 - Silverstripe 3.1.12

时间:2015-07-02 13:03:29

标签: silverstripe

我正在开发一个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语句?

1 个答案:

答案 0 :(得分:1)

引用official documentation

  

如果扩展程序需要修改现有方法,那么它有点儿   棘手。它要求您要自定义的方法具有   在您要修改的地方提供了一个扩展挂钩   数据

我刚检查了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

再次:你的问题存在于其他地方。