- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个 Customer
DataObject
通过扩展 Member
. Customer
有一个 many_many
与 Package
的数据关系DataObject
.
我想增加/减少 Credits
Customer
中的字段DataObject
当一个 Package
通过基于 Limit
的 CMS 链接/取消链接Package
中的字段 table 。
客户
class Customer extends Member {
private static $db = array(
'Gender' => 'Varchar(2)',
'DateOfBirth' => 'Date',
'Featured' => 'Boolean',
'Credits' => 'Int'
);
private static $many_many = array(
'Packages' => 'Package'
);
public function getCMSFields() {
$fields = new FieldList();
$config = GridFieldConfig_RelationEditor::create();
$config->removeComponentsByType('GridFieldAddNewButton');
$packageField = new GridField(
'Packages',
'Package',
$this->Packages(),
$config
);
$fields->addFieldToTab('Root.Package', $packageField);
Session::set('SingleID', $this->ID);
$this->extend('updateCMSFields', $fields);
return $fields;
}
}
class Package extends DataObject {
private static $db = array(
'Title' => 'Varchar(255)',
'Limit' => 'Int'
);
private static $belongs_many_many = array(
'Customers' => 'Customer'
);
}
最佳答案
当您创建或删除多对多关系时,只有一条记录在您的数据库中被修改 - 表中的一条记录连接关系双方的元素。因此,关系所基于的对象都不会更新。这就是为什么这样的方法:onBeforeWrite
, onAfterWrite
, onBeforeDelete
和 onAfterDelete
根本不会被调用,你不能用它们来检测这种变化。
然而,Silverstripe 提供类 ManyManyList
它负责与多对多关系相关的所有操作。有两种您感兴趣的方法:添加和删除。您可以覆盖它们并采取内部行动来做您需要的事情。无论对象类型是什么,这些方法显然都会在每个链接或取消链接操作上调用,因此您应该对您特别感兴趣的类进行一些过滤。
覆盖 ManyManyList
的正确方法class 是使用 Injector 机制,以免修改 framework 或 cms 文件夹内的任何内容。下面的示例使用 Silverstripe 中成员和组之间的关系,但您可以轻松地根据需要采用它(客户 -> 成员;包 -> 组)。
应用程序.yml
Injector:
ManyManyList:
class: ManyManyListExtended
/**
* When adding or removing elements on a many to many relationship
* neither side of the relationship is updated (written or deleted).
* SilverStripe does not provide any built-in actions to get information
* that such event occurs. This is why this class is created.
*
* When it is uses together with SilverStripe Injector mechanism it can provide
* additional actions to run on many-to-many relations (see: class ManyManyList).
*/
class ManyManyListExtended extends ManyManyList {
/**
* Overwritten method for adding new element to many-to-many relationship.
*
* This is called for all many-to-many relationships combinations.
* 'joinTable' field is used to make actions on specific relation only.
*
* @param mixed $item
* @param null $extraFields
* @throws Exception
*/
public function add($item, $extraFields = null) {
parent::add($item, $extraFields);
if ($this->isGroupMembershipChange()) {
$memberID = $this->getMembershipID($item, 'MemberID');
$groupID = $this->getMembershipID($item, 'GroupID');
SS_Log::log("Member ($memberID) added to Group ($groupID)", SS_Log::INFO);
// ... put some additional actions here
}
}
/**
* Overwritten method for removing item from many-to-many relationship.
*
* This is called for all many-to-many relationships combinations.
* 'joinTable' field is used to make actions on specific relation only.
*
* @param DataObject $item
*/
public function remove($item) {
parent::remove($item);
if ($this->isGroupMembershipChange()) {
$memberID = $this->getMembershipID($item, 'MemberID');
$groupID = $this->getMembershipID($item, 'GroupID');
SS_Log::log("Member ($memberID) removed from Group ($groupID)", SS_Log::INFO);
// ... put some additional actions here
}
}
/**
* Check if relationship is of Group-Member type.
*
* @return bool
*/
private function isGroupMembershipChange() {
return $this->getJoinTable() === 'Group_Members';
}
/**
* Get the actual ID for many-to-many relationship part - local or foreign key value.
*
* This works both ways: make action on a Member being element of a Group OR
* make action on a Group being part of a Member.
*
* @param DataObject|int $item
* @param string $keyName
* @return bool|null
*/
private function getMembershipID($item, $keyName) {
if ($this->getLocalKey() === $keyName)
return is_object($item) ? $item->ID : $item;
if ($this->getForeignKey() === $keyName)
return $this->getForeignID();
return false;
}
}
关于silverstripe - 在 SilverStripe 中链接/取消链接多对多记录后更新字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32324867/
我是 SilverStripe 的新手。 我想知道一个可以开始为 SilverStripe 制作模块的好地方;一些很好的教程让我开始。 最佳答案 SilverStripe 模块几乎可以做任何事情,所以
我有一个模板可以生成指向我站点中其他页面的链接,但这些生成的链接是不正确的。 例如主页链接是http://127.0.0.1:8080/silverstripe/"/silverstripe/" 应该
突然间,每当我尝试点击进入 silverstripe 后端的一个页面时,它最初显示如下,我运行的是 SS 3.2,当这种情况开始发生时,我升级到 3.2.1 以查看是否可以解决问题但是不: 有时它还会
在 Silverstripe 4 中,上传的文件必须在网站的公共(public)端可见之前发布。 如果我使用 $has_one Image::Class 创建一个 $Page,然后将该图像分配给 $o
我正在处理一个遗留的 SilverStripe 项目。我正在尝试在主题文件夹中创建一个名为“files”的公用文件夹。该文件夹中的所有文件都可以通过浏览器访问。 我创建了一个文件夹并在其中创建了一个文
默认的忘记密码表单是一个 Email 表单域。我有一个许可证号附加到每个用户。作为用户,我想通过输入我的许可证号而不是电子邮件来获取重置密码链接。 我找到了一种方法来覆盖功能方面而不是表单。到目前为止
我为我的网站为 cecutients(视力低下的人)制作了附加主题。我可以按主页上的某个按钮动态更改站点主题吗? 最佳答案 是的,你可以这样做。我建议您在 Controller 上执行一个操作来更新主
我正在使用 SilverStripe 3.5.3我想自定义 $Content 的内容 ( Security/login )页。我该怎么做? 最佳答案 您也可以通过放置一个名为 的模板文件来修改页面模板
我用密码保护了我的整个 Silverstripe 站点,现在我需要自定义登录屏幕的表单字段。我在哪里可以找到发生这种情况的地方?我遇到的另一个问题是:我想向不想访问 http://example.co
我希望能够让用户在 silverstripe 的内容编辑器中添加样式按钮。他们需要能够编辑按钮内的文本,还需要能够将其链接到另一个页面或网站。我相信您可以使用短代码来做到这一点,或者可能在 tiny_
$page1 = PageType1::get(); $page2 = PageType2::get(); 有没有办法从两种页面类型的组合中获取最新的 5 篇帖子。接受任何帮助。 最佳答案 假设 Pa
我正在使用 dashboard模块,但不希望我的用户能够选择任何类型的面板。有没有一种方法可以在不删除整个类的情况下从可用面板列表中删除“天气”或“Google Analytics”等面板? 最佳答案
我在我的 SilverStripe 安装中安装了一个特定的模块。以下是目录结构 - Root - framework - cms - mymodule - code -
我正在开发一种 SilverStripe 页面类型,该页面类型旨在获取父导航项的所有子项,但可能是页面类型 PDFTemplate 的任何子项除外。我习惯于获取所有子元素,但是在基于模板类型排除特定子
我创建了一个 Customer DataObject通过扩展 Member . Customer有一个 many_many与 Package 的数据关系DataObject . 我想增加/减少 Cre
出于 SEO 的目的,我需要确保所有 URL 都保存为小写。 即使用户以大写形式输入固定链接,我如何强制 SilverStripe 管理员以小写形式保存 URL? 最佳答案 您可以在 Page 中执行
我是 Silverstripe 的新手,无法在文档或 SO 上找到我的问题的答案。 我纯粹将 Silverstripe 用作 CMS:没有网站作为前端。 我有最简单的 DataObject Produ
如何将错误记录到 SilverStripe 4 中的文件日志中?我的意思是所有导致来自 SS 的“内部服务器错误”信息的错误 在 SilverStripe 中是: SS_Log::add_writer
我想弄清楚是否有可能在没有 WYSIWYG 编辑器的情况下使用 SilverStripe 的 oEmbed 功能。可悲的是我只能找到this在 SS 文档中。 那么有没有办法为 TextField 启
我正在尝试为 SilverStripe 站点做一些非常不同的事情:在几个子页面上是数据表,这些表每个都有自己的一组列标题,有些表的列比其他表多。我想避免在富文本编辑器中构建表格,因为这很容易出现很多错
我是一名优秀的程序员,十分优秀!