在Silverstripe CMS 3.1中的OptionsetField内创建自定义字段

时间:2016-07-13 15:01:18

标签: php content-management-system silverstripe

我想从某些预定义值中选择日历事件的类型,但如果未列出,则创建新的(自定义)类型。

所以我在$ db中创建了这样的字段,如下所示: '类型' => '的Varchar&#39 ;, ' EventCustomType' => '的Varchar'

然后,在getCMSFields()中我有:

$f->addFieldsToTab("Root.Main", $eventType = new OptionsetField(
            'Type',
            _t('CalendarEvent.EVENTTYPE','Type'),
            array (
                'music'  => _t('CalendarEvent.MUSIC','Music'),
                'sport'  => _t('CalendarEvent.SPORT','Sport'),
                'drama'  => _t('CalendarEvent.DRAMA','Drama'),
                'custom' => TextField::create('EventCustomType','Event type')
            )
        )
    );

enter image description here

问题是我不知道如何插入标签" Custom"在Textareafield之前,将它们放在同一条线上。

另外,我不确定我是否需要第二个字段用于自定义字段。我可以在#34; Type"中插入自定义值吗?现场或验证它?

感谢您的任何建议

2 个答案:

答案 0 :(得分:2)

这可以通过为" EventCustomType"提供单独的字段来实现。然后使用Display Logic来显示类似......

$eventType = OptionsetField::create(
    'Type',
    _t('CalendarEvent.EVENTTYPE','Type'),
    array (
    'music'  => _t('CalendarEvent.MUSIC','Music'),
    'sport'  => _t('CalendarEvent.SPORT','Sport'),
    'drama'  => _t('CalendarEvent.DRAMA','Drama'),
    'custom' => _t('CalendarEvent.CUSTOM','Custom'),
    )
);

$fEventCustomType = TextField::create('EventCustomType','Event type')
    ->displayIf('Type')->isEqualTo('custom');

$f->addFieldsToTab("Root.Main", array($eventType,$fEventCustomType));

作为替代方案,如果您想要解救This module,那么你可以创建它以保存到一个字段中,因为它的设计就像你要求的那样...但是它有错误(我上次试过)所以现在只是参考。

答案 1 :(得分:1)

最后,我已经用不同的字段想出来了:

    $eventType = OptionsetField::create(
        'Type',
        _t('CalendarEvent.EVENTTYPE','Type'),
        array (
        'music'  => _t('CalendarEvent.MUSIC','Music'),
        'sport'  => _t('CalendarEvent.SPORT','Sport'),
        'drama'  => _t('CalendarEvent.DRAMA','Drama'),
        'custom' => _t('CalendarEvent.CUSTOM','Custom'),
        )
    );

    $customEventType = TextField::create('EventCustomType','Custom type');

    $f->addFieldsToTab("Root.Main", array($eventType,$customEventType));

和jQuery:

$('#Root_Main').entwine({
    onmatch: function(){
        var $tab = this.closest('.tab');
        var $eventType = $tab.find('ul.eventType');
        var $customType = $tab.find('.customEventType').hide();

        if($eventType.find('input:checked').val() == 'custom'){
            $customType.show();
        }

        $eventType.find('input').change(function(){
            if($(this).val() == 'custom'){
                $customType.show();
            }else{
                $customType.hide();
            }
        });
    }
});