2015-08-27 19 views
2

我正在使用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; 
    } 
} 

最後,我有一個 '父' dataObject時巫婆包含一些訪談和文章:

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; 

    } 
} 

我想在日記模型管理頁面: - 創建新日記:好,完成 - 將一次或多次採訪鏈接到本期刊 - 將一篇或多篇文章鏈接到本期刊 - 管理文章和期刊內部採訪的順序

這是怎麼回事?

感謝您的幫助。

+1

只是爲了澄清 - 這裏面臨的問題是,訪談和文章是作爲一個混合列表排序?所以你不能只擁有兩個獨立的網格域,每個網格域都可獨立訂購? –

+0

是的!這是問題。訪談和文章屬於期刊。像報紙一樣。我必須管理訂單。 –

+0

前幾天我們在IRC上聊過嗎?您需要從一個子類化兩個DataObjects,然後您可以在一個Gridfield中管理排序順序。或者你需要一些其他的數據對象來創建關係。 – wmk

回答

3

我會給兩篇文章和採訪一個共同的父類,並把它們放在一個網格域中(正如wmk在評論中所建議的那樣)。我還建議你使用這個擴展中的GridFieldAddMultiClass組件:https://github.com/silverstripe-australia/silverstripe-gridfieldextensions,以便用戶可以選擇他/她是否想添加一個採訪或文章。類似以下內容:

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 {} 

然後,建立您的單個GridView關閉Journal.ContentItems()關係。