2

我有一个数据网格,允许用户将事件添加到事件页面。

在它上面,我有 2 个日期字段,因此他们可以指定开始日期和结束日期。除非我在 Sapphire/javascript 中注释掉 DateField.js 中的一行(第 12 行 - if(!config.showcalendar) return;),否则这些字段不会显示日期选择器。

有没有办法让日期选择器在不篡改核心的情况下显示?

<?php
class Event extends DataObject{
    public static $db = array(
        'Title' => 'Varchar(255)',
        'StartDate' => 'Date',
        'EndDate' => 'Date',
        'Summary' => 'Text',
        'Content' => 'HTMLText'
    );

    static $has_one = array( 
        'WhatsOnCategory' => 'WhatsOnCategory',
        'EventImage' => 'Image'
    );

    public static $summary_fields = array(
        'Title' => 'Title'
    );

    public static $default_sort='StartDate';

    public function getCMSFields() {
        return new FieldList(
            new TextField('Title', 'Title'),
            new DateField('StartDate', 'StartDate'),
            new DateField('EndDate', 'EndDate'),
            new TextField('Summary', 'Summary'),
            new HTMLEditorField('Content', 'Content'),
            new UploadField('EventImage','Image')
        );
    }
}
4

1 回答 1

8

DateField 默认情况下不显示日历弹出窗口,您必须对其进行配置才能这样做。

申请所有 DateFields:(您可以将此行放在 getCMSFields 方法的顶部)

DateField::set_default_config('showcalendar', true);

应用于特定的 DateField 实例

return new FieldList(
    DateField::create('StartDate', 'StartDate')->setConfig('showcalendar', true)
    ...
)

使用 DateField::create 方法而不是 new DateField 允许您直接在一行中调用该类的方法,这很好。我认为这也是 SS 对象的最佳实践。

更新

在 SilverStripe 3 中,可以使用新的配置系统设置全局配置。

IE。在你的配置 YML

DateField:
  default_config:
    showcalendar: true

如果您使用的是DateTimeField,要使“每个实例”配置正常工作,您需要首先调用 getDateField:

$myDateTimeField->getDateField()->setConfig('showcalendar',true);

如果您想在 DateTimeField 的 Time 字段上使用 timepicker UI,则需要安装TimePicker 模块,然后:

$myDateTimeField->setTimeField(
    TimePickerField::create('StartTime[time]', '')
    ->addExtraClass('fieldgroup-field')
);
于 2012-09-16T23:43:51.007 回答