两个数据对象在一个带有可排序列的网格中管理。银条 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。
我正在使用 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。