php - SilverStripe - 当另一个管理模型获得新条目时更新一个管理模型

标签 php silverstripe

在 SilverStripe 中,我有两个管理模型:服务和位置。位置是位置列表。服务是这些位置可以提供的服务的列表。但是,只有某些地点可以提供某些服务。我想要做的是,每当添加新位置(或者删除或重命名一个位置)时,我想将其添加到每个服务下的复选框字段中(这样,内容管理员可以轻松控制在何处提供哪些服务)随时)。

这是服务数据对象代码(注意:我尚未在复选框字段中添加):

class Services extends DataObject {

    private static $db = array(
        'Name' => 'varchar',
    );

    public static $summary_fields = array(
        'Name' => 'Title',
    );

}

这是位置数据对象代码:

class Locations extends DataObject {

    private static $db = array(
        'Name' => 'varchar',
        'AcceptingAppointments' => 'boolean',
    );

    public static $summary_fields = array(
        'Name' => 'Title',
        'AcceptingAppointments' => 'Accepting Appointments?',
    );

    public function AcceptingAppointments() {
        return ($this->AcceptingAppointments==true ? 'Yes':'No');
    }
}

到目前为止一切正常。我可以添加、编辑和删除位置和服务。但是,我不知道如何对服务进行编码,以便每当内容管理员添加、删除或重命名位置条目时,每个服务都会使用所有位置的完整列表进行更新。

在这方面使用 $has_many 关系有效吗?

最佳答案

需要的是 ServiceLocation 之间的 $many_many 关系。我们想要多对多的关系,因为一个服务可以有很多位置,一个位置可以有很多服务。要了解有关使用 $many_many 关系的更多信息,请阅读 this lessonthis documentation .

一旦定义了 $many_many 关系,我们就可以添加 CheckboxSetField来控制这种关系。

注意,我已将 Locations 类重命名为 Location,将 Services 重命名为 Service,因为我认为该类名称应该是单数。

服务

class Service extends DataObject {

    private static $db = array(
        'Name' => 'Varchar'
    );

    private static $belongs_many_many = array(
        'Locations' => 'Location'
    );

    private static $summary_fields = array(
        'Name' => 'Title'
    );

    private static $field_labels = array(
        'Name'
    );

    public function getCMSFields() {

        $fields = parent::getCMSFields();

        if ($this->ID) {
            $fields->addFieldToTab('Root.Locations', CheckboxSetField::create(
                'Locations', 
                'Locations', 
                Location::get()->map()
            ));
        }

        return $fields;
    }

}

Location 上,我们将 $belongs_many_many 关系添加回 Service,以便我们可以控制双方的这种关系。

位置

class Location extends DataObject {

    private static $db = array(
        'Name' => 'Varchar',
        'AcceptingAppointments' => 'Boolean'
    );

    private static $many_many = array(
        'Services' => 'Service'
    );

    private static $summary_fields = array(
        'Name',
        'AcceptingAppointmentsNice'
    );

    private static $field_labels = array(
        'Name' => 'Title',
        'AcceptingAppointmentsNice' => 'Accepting Appointments?'
    );

    public function AcceptingAppointmentsNice() {
        return $this->AcceptingAppointments ? 'Yes' : 'No';
    }

    public function getCMSFields() {
        $fields = parent::getCMSFields();
        if ($this->ID) {
            $fields->addFieldToTab('Root.Services', CheckboxSetField::create(
                'Services', 
                'Services', 
                Service::get()->map()
            ));
        }
        return $fields;
    }
}

CheckboxSetField 的替代方案是 ListboxFieldListboxField 是一个简洁的下拉多选字段。如果选项列表很长,这很有用。

class Service extends DataObject {

    // ...

    public function getCMSFields() {

        $fields = parent::getCMSFields();

        if ($this->ID) {
            $fields->addFieldToTab('Root.Locations', ListboxField::create(
                'Locations', 
                'Locations', 
                Location::get()->map('ID', 'Name')->toArray(),
                array(),
                null,
                true
            ));
        }

        return $fields;
    }

}

另请注意,$summary_fields 必须声明为 private 变量,而不是 public 变量。

关于php - SilverStripe - 当另一个管理模型获得新条目时更新一个管理模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33765242/

相关文章:

javascript - Ajax 表单提交到 php 以在单选按钮单击时进行处理

php - SQL 查询 3 个表,一个具有不同的列名

php - 如何在 Admin Silverstripe 中添加自定义按钮及其功能?

php - 扩展图像类

银条3.0 : how to add different tinymce configurations per user group

caching - 更新: Updating manifest cache version and date in SilverStripe on upload

php - 许多额外的字段不保存

php - 如何使用MySQL和PHP在数据库中存储每次登录的用户注销时间?

php - 如何检查文件是否被选中

php - 使用 cURL 在文件和文件夹之间确定