【问题标题】:SilverStripe: changing the order of GridField input elementsSilverStripe:更改 GridField 输入元素的顺序
【发布时间】:2023-04-09 23:11:02
【问题描述】:

所以,首先免责声明:谈到 SilverStripe,我有点菜鸟,但这个让我很烦恼。

我正在使用 GridField 来添加和编辑 DataObject 中的条目。这一切都很好,而且效果很好。我唯一不知道的是如何更改 EDITABLE 字段的顺序 - 这不是条目的初始表格显示(由 $config 设置),它是单击“添加”后的实际输入字段新”或去编辑记录。

目前 Image uploadForm 和 Signature <select> 框位于 Body HTMLText 字段下方,这很混乱,无法正常工作。我希望它们位于顶部,就在 Summary 元素的下方。

我尝试过使用 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;
    }
}

(签名只是在不同选项卡上具有不同 GridField 的另一个 DataObject,我没有包含它的代码,因为它几乎相同。)

【问题讨论】:

    标签: php silverstripe


    【解决方案1】:

    所以,您的意思是当您编辑 MediaReleaseItem 时,这些字段不是您想要的样子?

    简单:只需在类MediaReleaseItem 上定义一个方法getCMSFields()

    <?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;
        }
    }
    

    【讨论】:

    • 绝对完美 - 正如我所说,我在这方面相对较新,我没有意识到您也可以在 DataObject 中定义 getCMSFields() - 我认为它仅适用于 Page 类!为了记录,UploadField 工作得很好。但是有一个问题 - 函数 $fields-&gt;insertBefore() 导致 500 服务器错误;知道为什么其他一切都正常吗?
    • 啊,我的错。我认为参数是相反的。所以它是$fields-&gt;insertBefore($field, $name) 而不是$fields-&gt;insertBefore($name, $field)
    • 我真的应该自己捡起来。非常感谢,你帮了大忙:)
    猜你喜欢
    • 2019-08-02
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多