两个数据对象在一个带有可排序列的网格中管理。银条 3.1

Two dataobject managed in one gridfied with orderable columns. Silverstripe 3.1

我正在使用 Silverstripe 3.1

我想在一个管理模型页面中管理两个数据对象。这是我的第一个数据对象:

class Interview extends DataObject
{
    private static $db = array(
        'Name'          => 'Varchar(255)',
        'LieuExercice'  => 'Varchar(255)',
        'Presentation'  => 'Text',
    );

    private static $has_one = array(
        'Photo'     => 'Image'
    );

    private static $belongs_many_many = array(
        'Journal'   => 'Journal'
    );

    // Change the label in datagrid
    private static $field_labels = array(
        'NameAndExercice' => 'Nom de la personne interviewée',
        'LieuExercice' => 'Lieu d\'exercice'
    );
    public function getNameAndExercice(){
        return  new LiteralField('NameAndExercice', $this->Name  . ' <em style=\'font-size:11px\'>('.$this->LieuExercice.')</em>');
    }

    private static $summary_fields = array(
        'NameAndExercice',
    );

    public function getCMSFields() {
        $fields = FieldList::create(TabSet::create('Root'));
        $fields->addFieldsToTab('Root.Contenu', TextField::create('Name', 'Nom de la personne interviewée'));
        $fields->addFieldsToTab('Root.Contenu', TextField::create('LieuExercice', 'Lieu d\'exercice')->setDescription('Lieu d\'exercice de la personne'));
        $fields->addFieldsToTab('Root.Contenu', TextareaField::create('Presentation', 'Présentation')->setDescription('Courte présentation de la personne'));
        $fields->addFieldsToTab('Root.Contenu', $photo = UploadField::create('Photo', 'Portrait de la personne interviewée')->setDescription('Fichier image du portrait de la personne'));

        //Fields configuration
        $photo->getValidator()->setAllowedExtensions(array('png', 'jpg', 'gif', 'jpeg'));
        $photo->setFolderName('interview-photos');

        return $fields;
    }
}

这是我的第二个数据对象:

class Article extends DataObject
{
    private static $db = array(
        'Title'          => 'Varchar(255)',

    );

    private static $has_one = array(
        'Photo'     => 'Image'
    );

    private static $belongs_many_many = array(
        'Journal'   => 'Journal'
    );

    public function getCMSFields() {
        $fields = FieldList::create(TabSet::create('Root'));

        $fields->addFieldsToTab('Root.Contenu', TextField::create('Title', 'Titre de l\'article'));

        $fields->addFieldsToTab('Root.Contenu', $photo = UploadField::create('Photo', 'Portrait de la personne interviewée')->setDescription('Fichier image du portrait de la personne'));

        //Fields configuration
        $photo->getValidator()->setAllowedExtensions(array('png', 'jpg', 'gif', 'jpeg'));
        $photo->setFolderName('interview-photos');

        return $fields;
    }
}

最后,我有一个 'parent' 数据对象 包含一些采访和文章 :

class Journal extends DataObject
{
    private static $db = array(
        'Title' => 'Varchar',
        'DatePublication'   => 'Date'
    );
    private static $has_one = array(
        'Couverture'        => 'Image'
    );
    private static $many_many = array(
        'Interviews'    => 'Interview',
        'Articles'      => 'Article',
    );
    private static $many_many_extraFields = array(
        'Interviews' => array(
            'SorterField' => 'Int',
        ),
        'Articles' => array(
            'SorterField' => 'Int',
        ),
    );

    public function getCMSFields(){
            $fields = FieldList::create(TabSet::create('Root'));

            $fields->addFieldsToTab('Root.Main', array(
                $titleField = TextField::create('Title', 'Titre / Numéro du journal'),
                $datePublicationField = DateField::create('DatePublication', 'Date de publication'),
                $uploadField = UploadField::create('Couverture', 'Couverture du journal')

            ));


            if($this->ID){
                $fields->insertAfter(
                    new Tab('Content', 'Contenu du journal'),
                    'Main'
                );

                //$buttonCreateMultiClass = new GridFieldAddNewMultiClass();
                //$buttonCreateMultiClass->setClasses(array('Interviews', 'Article'));

                $config = GridFieldConfig_RelationEditor::create();
                $config->addComponent(new GridFieldOrderableRows('SorterField'));

                $fields->addFieldsToTab('Root.Content', GridField::create(
                    'Interviewsz',
                    'Contenu de ce journal',
                    $this->getManyManyComponents('Interviews')->sort('SorterField'),
                    $config
                ));
            }

            // Fields configuration
            $datePublicationField->setConfig ('showcalendar', true);
            $uploadField->getValidator()->setAllowedExtensions(array('jpg', 'gif', 'png', 'jpeg'));
            $uploadField->setFolderName('journals-couvertures');
            return $fields;

    }
}

我想在 Journal 的模型管理页面中: - 创建新日记:好的,完成 - Link 对本期刊的一次或多次采访 - Link 本期刊的一篇或多篇文章 - 管理期刊内文章和采访的顺序

怎么做?

感谢您的帮助。

我会给文章和采访一个共同的父 class 并将它们放在一个网格字段中(如 wmk 在评论中建议的那样)。我还建议您使用此扩展中的 GridFieldAddMultiClass 组件:https://github.com/silverstripe-australia/silverstripe-gridfieldextensions 以便用户可以 select 是否 he/she 想要添加采访或文章。类似于以下内容:

class Journal extends DataObject {
    private static $has_many = ['ContentItems' => 'ContentItem'];
}

class ContentItem extends DataObject {
    private static $db => ['Sort' => 'Int'];
    private static $has_one => ['Journal' => 'Journal'];
}

class Article extends ContentItem {}
class Interview extends ContentItem {}

然后根据 Journal.ContentItems() 关系构建单个 GridView。