SilverStripe: изменение порядка входных элементов GridField

Итак, отказ от ответственности сначала: я немного нуб, когда дело доходит до SilverStripe, но это меня раздражает.

Я использую GridField для добавления и редактирования записей в DataObject. Это хорошо и хорошо, и работает отлично. Единственное, что я не могу понять, это изменить порядок полей EDITABLE – это не начальное отображение таблиц записей (которое задано в $ config), это фактические поля ввода после нажатия кнопки «добавить» новый "или перейти к редактированию записи.

На данный момент поля Image uploadForm и Signature <select> находятся ниже поля HTMLText тела, которое является грязным и не работает правильно. Я хочу, чтобы они были наверху, прямо под элементом Сводка.

Я пробовал играть с changeFieldOrder (), но это не работает с типом объекта GridField, а $ fields ничего не знает о входных элементах (я дамп () его создал и посмотрел).

MediaReleaseItem.php:

 class MediaReleaseItem extends DataObject { static $db = array ( 'Title' => 'Varchar', 'DateUpdated' => 'Date', 'Summary' => 'Varchar', 'Image' => 'Varchar', 'Body' => 'HTMLText', ); private static $has_one = array( "Image" => "Image", "MediaReleaseItem" => "MediaReleases", "Signature" => "MediaReleaseSignature", ); } 

И MediaReleases.php:

 class MediaReleases extends Page { private static $has_many = array( "MediaReleaseItems" => "MediaReleaseItem", "Signature" => "MediaReleaseSignature", ); function getCMSFields() { $fields = parent::getCMSFields(); $config = GridFieldConfig_RecordEditor::create(); $config->getComponentByType('GridFieldDataColumns')->setDisplayFields(array( 'Title'=> 'Title', 'DateUpdated' => 'Date', 'Summary' => 'Summary', )); $mediaReleasesField = new GridField( 'MediaReleaseItem', // Field name 'Media Releases', // Field title $this->MediaReleaseItems(), $config ); $fields->addFieldToTab('Root.MediaReleaseItems', $mediaReleasesField); return $fields; } } 

(Подпись – это еще один объект DataObject с другим GridField на другой вкладке, я не использовал код для него, потому что он почти идентичен.)

так, вы имеете в виду, когда вы редактируете MediaReleaseItem поля не так, как вы хотите?

simple: просто определите метод getCMSFields() для класса MediaReleaseItem .

 <?php class MediaReleaseItem extends DataObject { private static $db = array ( 'Title' => 'Varchar', 'DateUpdated' => 'Date', 'Summary' => 'Varchar', 'Image' => 'Varchar', 'Body' => 'HTMLText', ); private static $has_one = array( "Image" => "Image", "MediaReleaseItem" => "MediaReleases", "Signature" => "MediaReleaseSignature", ); public function getCMSFields() { $arrayOfSignatures = MediaReleaseSignature::get()->map()->toArray(); $fields = FieldList::create(array( TextField::create('Title', 'Title for this Item'), DateField::create('DateUpdated', 'Updated')->setConfig('showcalendar', true), TextField::create('Image', 'Image'), // not sure if it works to have both a DB field and a has_one with the same name UploadField::create('ImageID', 'Image'), DropdownField::create('Signature', 'Signature', $arrayOfSignatures), // you can add more fields here )); // but you can also add fields here $fields->insertBefore(TextField::create('Summay', 'Summary'), 'DateUpdated'); $fields->push(HTMLEditorField::create('Body', 'Body Content')); return $fields; } }