【问题标题】:How to dynamically show/hide field in SilverStripe ModelAdmin如何在 SilverStripe ModelAdmin 中动态显示/隐藏字段
【发布时间】:2016-07-17 19:17:56
【问题描述】:

我在 ModelAdmin 中有一个 Dataobject,其中包含以下字段:

class NavGroup extends DataObject {

    private static $db = array(
        'GroupType' => 'Enum("Standard,NotStandard","Standard")',
        'NumberOfBlocks' => 'Int'
    );

    public function getCMSFields() {
        $groupTypeOptions = singleton('NavGroup')->dbObject('GroupType')->enumValues();
        $fields = parent::getCMSFields();
        $fields->addFieldToTab('Root.Main', new Dropdownfield('GroupType', 'Group Type', $groupTypeOptions));
        $fields->addFieldToTab('Root.Main', new Numericfield('NumberOfBlocks', 'Number of Blocks'));
        return $fields;
    }
}

如果GroupType == "Standard" 我希望NumberOfBlocks 字段自动隐藏,以便对用户隐藏。这应该是动态发生的。

SilverStripe 中是否提供此功能,还是我需要添加一些自定义 JavaScript?

【问题讨论】:

标签: php silverstripe


【解决方案1】:

您需要使用 DisplayLogic 模块...

https://github.com/unclecheese/silverstripe-display-logic

那么你的函数可以写成...

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

    $fields->addFieldsToTab('Root.Main',array(
        Dropdownfield::create('GroupType', 'Group Type', singleton('NavGroup')->dbObject('GroupType')->enumValues())),
        Numericfield::create('NumberOfBlocks', 'Number of Blocks')
            ->displayIf('GroupType')->isEqualTo('Standard')
    ));

    return $fields;
}

【讨论】:

    【解决方案2】:

    getCMSFields() 的每个请求都使用当前对象状态,因此您可以针对这种情况执行简单的if statement

    public function getCMSFields() {
        $groupTypeOptions =  singleton('NavGroup')->dbObject('GroupType')->enumValues();
        $fields = parent::getCMSFields();
        $fields->addFieldToTab('Root.Main', new Dropdownfield('GroupType', 'Group Type', $groupTypeOptions));
    
        if ($this->GroupType === 'Standard') {
            $fields->addFieldToTab('Root.Main', new Numericfield('NumberOfBlocks', 'Number of Blocks'));
        } else {
            $fields->addFieldToTab('Root.Main', new HiddenField('NumberOfBlocks', $this->NumberOfBlocks);
        }
        return $fields;
    }
    

    但是更改 GroupType 不会更新字段,您需要保存表单才能触发更新。 unclecheese/silverstripe-display-logic 模块解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2017-09-30
      • 2021-04-14
      • 1970-01-01
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      相关资源
      最近更新 更多