CanView对数据扩展的影响-Silverstripe 3.1.12

CanView对数据扩展的影响-Silverstripe 3.1.12,silverstripe,Silverstripe,我正在开发一个Silverstripe模块,允许用户订阅一个网站,该网站还发送月刊 单个组中将有2个级别的用户。此组中的所有用户都将能够登录到该网站,但某些内容将仅对具有活动付费订阅的用户可见 我有一个扩展主页对象的DataExtension。这允许我有一个布尔字段来指示仅订阅者的内容。我的意图是添加“canView”功能,它将对用户的订阅状态执行必要的检查,以对非活动成员隐藏链接,当然,对于管理员返回true class MemberPageExtension extends DataExte

我正在开发一个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上似乎不起作用/不可用,所以现在我有点困惑于如何实现这一点

有没有一种方法可以使页面上的DataExtension可以使用“can”函数,或者产生类似的效果,而无需在模板中使用if语句?

引用以下内容:

如果扩展需要修改一个现有的方法,它只需要一点点 更棘手。它要求您要自定义的方法具有 在要修改的位置提供了一个扩展挂钩 数据

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

看看吧,谢谢你的回复。我编辑了原始帖子,展示了我通常如何使用
canView()
函数。它在这个实例中不起作用,但是提供的代码没有显示真实的代码:它只是一个占位符函数。我刚刚添加了一个代码示例,它显示扩展上的
canView
。看起来你已经对这个问题下了决心,这对调试非常不利。