DataExtension 上的 Silverstripe Link 方法
Silverstripe Link method on DataExtension
我正在使用 DataExtension 扩展成员 class,我希望添加一个 Link() 方法。我有 2 页,MembersPage.php 和 MemberExtension.php。我正在尝试创建 www.mysite.com/members/show/1 的结构,以便我能够查看其他成员的个人资料。目前,如果我到达我上面提到的 url,它就可以工作。我可以看到我的会员详细信息,但是如果我转到 www.mysite.com/members,错误会崩溃,我会收到以下错误:
Call to undefined method MemberExtension::MembersPage() in ../mysite/code/Secure/Extensions/MemberExtension.php on line 8
第8行指的是:
return $this->MembersPage()->Link('show/'.$this->ID);
从我在 SS3 中读到的所有内容来看,DataExtension 实际上会在编译时将方法合并在一起,并给人一种错觉,就好像这是一个 class 而不是 class 的子项一样。这是真的,我不明白它怎么找不到 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
);
}
}
MemberExtension.php
<?php
class MemberExtension extends DataExtension {
private static $has_one = array (
'MembersPage' => 'MembersPage'
);
public function Link() {
return $this->MembersPage()->Link('show/'.$this->ID);
}
}
编辑:
我试过试验,如果我将 Link 方法移动到 framework/security 文件夹内的成员 class,那么一切对我来说都很好。现在的问题是,如何让这个方法从 MemberExtension class?
开始工作
编辑 2:
It Works!
<% loop $Members %>
<div>
<a href="$Link">Visit Member</a>
<h3>
<a href="$Link">$FirstName</a>
</h3>
</div>
<% end_loop %>
找到了...该错误也非常具有描述性...并且在将某些代码从 class 移至其装饰器时很常见...
Call to undefined method MemberExtension::MembersPage()
那么这是什么意思呢?在 class MemberExtension 中没有名为 MembersPage() 的方法。这是真的。这是 Member class 中获取 MembersPage has_one 关系的自动方法。那么我们如何从 MembersExtension 调用 Member 中的东西,它作为装饰器插入 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)
: '';
}
}
我正在使用 DataExtension 扩展成员 class,我希望添加一个 Link() 方法。我有 2 页,MembersPage.php 和 MemberExtension.php。我正在尝试创建 www.mysite.com/members/show/1 的结构,以便我能够查看其他成员的个人资料。目前,如果我到达我上面提到的 url,它就可以工作。我可以看到我的会员详细信息,但是如果我转到 www.mysite.com/members,错误会崩溃,我会收到以下错误:
Call to undefined method MemberExtension::MembersPage() in ../mysite/code/Secure/Extensions/MemberExtension.php on line 8
第8行指的是:
return $this->MembersPage()->Link('show/'.$this->ID);
从我在 SS3 中读到的所有内容来看,DataExtension 实际上会在编译时将方法合并在一起,并给人一种错觉,就好像这是一个 class 而不是 class 的子项一样。这是真的,我不明白它怎么找不到 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
);
}
}
MemberExtension.php
<?php
class MemberExtension extends DataExtension {
private static $has_one = array (
'MembersPage' => 'MembersPage'
);
public function Link() {
return $this->MembersPage()->Link('show/'.$this->ID);
}
}
编辑:
我试过试验,如果我将 Link 方法移动到 framework/security 文件夹内的成员 class,那么一切对我来说都很好。现在的问题是,如何让这个方法从 MemberExtension class?
开始工作编辑 2:
It Works!
<% loop $Members %>
<div>
<a href="$Link">Visit Member</a>
<h3>
<a href="$Link">$FirstName</a>
</h3>
</div>
<% end_loop %>
找到了...该错误也非常具有描述性...并且在将某些代码从 class 移至其装饰器时很常见...
Call to undefined method MemberExtension::MembersPage()
那么这是什么意思呢?在 class MemberExtension 中没有名为 MembersPage() 的方法。这是真的。这是 Member class 中获取 MembersPage has_one 关系的自动方法。那么我们如何从 MembersExtension 调用 Member 中的东西,它作为装饰器插入 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)
: '';
}
}