2016-07-21 5 views
1

У меня есть отношение many_many между моими Theses и Subjects. Я создал ListboxField w/c принимает несколько значений.SilverStripe ListboxField multiselect сортировать по выбору пользователя

Сохранение его в базе данных не было проблемой, но когда я снова просматриваю информацию, предмет сортирует базу выбора пользователя на ID темы.

Например, пользователь выбирает заказ [1,5,4,2]. После сохранения и просмотра снова он будет отображаться следующим образом: [1,2,4,5].

Вот мой код:

Theses.php

class Theses extends DataObject { 

    private static $db = array(
     'CallNo' => 'Varchar', 
     'AuthorID' => 'Int', 
     'TitleTH' => 'Text', 
     'Year' => 'Int(4)', 
     'PhysicalDesc' => 'Text', 
     'Notes' => 'Text', 
     'Summary' => 'Text', 
     'DegreeCourse' => 'Varchar' 
    ); 

    private static $has_one = array(
     'Author' => 'Author' 
    ); 

    private static $field_labels = array(
     'CallNo' => 'Call Number', 
     'TitleTH' => 'Title Headings', 
     'Author.AuthorName' => 'Author', 
     'DegreeCourse' => 'Degree Course', 
     'Year' => 'Year Published', 
     'SubjectsString' => 'Subject' 
    ); 

    private static $summary_fields = array(
     'CallNo' => 'CallNo', 
     'TitleTH' => 'TitleTH', 
     'Author.AuthorName', 
     'DegreeCourse', 
     'Year' => 'Year', 
     'SubjectsString' 
    ); 

    private static $many_many = array(
     'Subjects' => 'Subject' 
    ); 

    public function SubjectsString() { 
     $returnString = ''; 
     foreach ($this->Subjects()->sort('Theses_Subjects.Created') as $Subjects) { 
      $returnString .= $Subjects->SubjectTitle . '--'; 
     } 
     return $returnString; 
    } 

    public function getCMSfields() { 
     $fields = FieldList::create(TabSet::create('Root')); 
     $fields->addFieldsToTab('Root.Main', array(
      TextField::create('CallNo'), 
      DropdownField::create('AuthorID', 'AuthorName') 
       ->setSource(Author::get()->sort('AuthorName')->map('ID', 'AuthorName')), 
      TextField::create('TitleTH'), 
      NumericField::create('Year', 'Year') 
       ->setMaxLength(4), 
      TextField::create('PhysicalDesc'), 
      TextField::create('Notes'), 
      TextAreaField::create('Summary'), 
      DropdownField::create('DegreeCourse', 'DegreeCourse', array('BLIS' => 'BLIS', 'BLS' => 'BLS', 'MLIS' => 'MLIS', 'MLS' => 'MLS')), 
      ListboxField::create('Subjects', 'Subjects', Subject::get()->map('ID', 'SubjectTitle')->toArray(), 1, 4, true), 
     )); 

     return $fields; 
    } 
} 

Subject.php

class Subject extends DataObject { 

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

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

    public function canView($member = null) { 
     return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member); 
    } 

    public function canEdit($member = null) { 
     return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member); 
    } 

    public function canDelete($member = null) { 
     return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member); 
    } 

    public function canCreate($member = null) { 
     return Permission::check('CMS_ACCESS_MyAdmin', 'any', $member); 
    } 

    private static $summary_fields = array(
     'SubjectTitle' 
    ); 

} 

ответ

0

Я искал способ, чтобы сделать ListBox работу, но может не найдешь что-то для вас там, поэтому вместо этого я отвечаю на этот вопрос таким образом, который обеспечивает аналогичный ex но не ListBox.

Использование GridField Extensions Module сортировка может быть добавлена ​​в GridField, а удаление кнопки «Добавить новое» и оставление добавления с помощью автоматического завершения имеет одинаковую функциональность. Он занимает больше места - но показывает сводку предмета и позволяет открыть запись - а также переупорядочить по мере необходимости.

Я включил только часть кода, так как были некоторые недостающие объекты (Автор). Также обратите внимание, что для DataObject, используемого в ModelAdmin (который является моим предположением здесь), вам не нужно создавать каждое поле, так как они для вас создаются с помощью $ fields = parent :: getCMSFields();

Надеется, что это помогает

class Theses extends DataObject { 

    ... 

    private static $many_many = array(
     'Subjects' => 'Subject' 
    ); 

    public static $many_many_extraFields = array(
     'Subjects' => array(
      'SortOrder' => 'Int', 
     ), 
    ); 

    ... 

    public function getCMSfields() { 
     $fields = parent::getCMSFields(); 

     $gridSubjects = $fields->dataFieldByName('Subjects'); 
     $gridSubjects->getConfig() 
      ->addComponent(GridFieldOrderableRows::create('SortOrder')) 
      ->removeComponentsByType('GridFieldAddNewButton'); 

     $fields = FieldList::create(TabSet::create('Root')); 
     $fields->addFieldsToTab('Root.Main', array(

      ... 

      TextField::create('Notes'), 
      TextAreaField::create('Summary'), 
      DropdownField::create('DegreeCourse', 'DegreeCourse', array('BLIS' => 'BLIS', 'BLS' => 'BLS', 'MLIS' => 'MLIS', 'MLS' => 'MLS')), 
      $gridSubjects 
     )); 

     return $fields; 
    } 
} 
Смежные вопросы