【问题标题】:SilverStripe - Update one admin model when another is given new entriesSilverStripe - 当另一个管理员模型被赋予新条目时更新一个管理员模型
【发布时间】:2015-11-17 19:17:22
【问题描述】:

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

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

class Services extends DataObject {

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

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

}

这是 Locations 数据对象代码:

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 关系是否有效?

【问题讨论】:

    标签: php silverstripe


    【解决方案1】:

    需要的是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 变量。

    【讨论】:

    • 哇...太完美了!非常感谢您的回答 - 它回答了我的确切问题,证实了我的一些想法,并且似乎已经按照我想要的方式进行了一切设置。
    猜你喜欢
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多