DataExtension上的Silverstripe Link方法

Boj*_*jan 1 silverstripe

我正在使用DataExtension扩展成员类,我希望添加一个Link()方法.我有2页,MembersPage.php和MemberExtension.php.我正在尝试创建www.mysite.com/members/show/1的结构,以便我能够查看其他成员配置文件.目前,如果我到达上面的网址,它可以工作.我可以看到我的会员详细信息,但如果我去www.mysite.com/members错误崩溃,我收到以下错误:

Call to undefined method MemberExtension::MembersPage() in ../mysite/code/Secure/Extensions/MemberExtension.php on line 8
Run Code Online (Sandbox Code Playgroud)

第8行是指:

return $this->MembersPage()->Link('show/'.$this->ID);
Run Code Online (Sandbox Code Playgroud)

从我在SS3中读到的所有内容来看,DataExtension实际上会在编译时将方法合并在一起,并给出一种错觉,好像这是一个类而不是类的子类.这是真的,我不明白它怎么找不到MembersPage()方法.是因为我的MembersPage在mysite文件夹中,而不在框架文件夹中?是否有配置设置我必须添加才能使其工作?

这是代码:

MembersPage.php

class MembersPage extends Page {
    private static $has_many = array (
        'Members' => 'Member',
    );
    public function getCMSFields() {
        $fields = parent::getCMSFields();
        $fields->addFieldToTab('Root.Members', GridField::create(
            'Members',
            'Members on this page',
            $this->Members(),
            GridFieldConfig_RecordEditor::create()
        ));
        return $fields;
    }
}
class MembersPage_Controller extends Page_Controller {
    private static $allowed_actions = array (
        'show'
    );

    public function show(SS_HTTPRequest $request) {
        $member = Member::get()->byID($request->param('ID'));

        if(!$member) {
            return $this->httpError(404,'That member could not be found');
        }

        return array (
            'Member' => $member
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

MemberExtension.php

<?php
class MemberExtension extends DataExtension {
    private static $has_one = array (
        'MembersPage' => 'MembersPage'
    );

    public function Link() {
        return $this->MembersPage()->Link('show/'.$this->ID);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我试过试验,如果我将Link方法移动到框架/安全文件夹中的Member类,那么一切都适合我.现在的问题是,如何从MemberExtension类中使用此方法?

EDIT2:

It Works!
<% loop $Members %>
    <div>
        <a href="$Link">Visit Member</a>
        <h3>
            <a href="$Link">$FirstName</a>
        </h3>
    </div>
<% end_loop %>
Run Code Online (Sandbox Code Playgroud)

wmk*_*wmk 6

发现它...错误也非常具有描述性......当将一些代码从类转移到它的装饰器时很常见......

调用未定义的方法MemberExtension :: MembersPage()

那么这是什么意思?在类MemberExtension中,没有名为MembersPage()的方法.这是真的.在Member类中获取MembersPage has_one关系是一种自动方法.那么我们怎样才能从MembersExtension中调用Member中的某个东西,这个会员作为装饰器插入会员?简单地用$this->owner而不是$this!

所以这应该工作:

<?php
class MemberExtension extends DataExtension {
    private static $has_one = array (
        'MembersPage' => 'MembersPage'
    );

    public function Link() {
        //check if MembersPage has_one relation is set
        return $this->owner->MembersPageID ? 
            $this->owner->MembersPage()->Link('show/'.$this->owner->ID)
            : '';
    }
}
Run Code Online (Sandbox Code Playgroud)