Silverstripe - 为通过 DropdownField 填充的 Varchar 设置默认值

Silverstripe - set a default value for Varchar populated via DropdownField

我在为 Size 字段设置默认数据库值时遇到问题,该字段由值数组中的 Silverstripe DropdownField() 填充。

class PartnerLogo extends DataObject {

  ...

  private static $db = array(
    "Size" => "Varchar(255)"
  );

  private static $defaults = array(
    "Size" => "sm"
  );

  public function getCMSFields() {

    $fields = new FieldList(new TabSet("Root"));

    $fields->addFieldToTab("Root.Main", 
      new DropdownField("Size[]", "Size", 
        array( 
          "xs" => "Extra Small", 
          "sm" => "Small", 
          "md" => "Medium", 
          "lg"=> "Large" 
        ), 
        "sm"
      )
    );

    return $fields;

  }

  ...

}

在 CMS 中,如果我创建新记录并单击“保存”,Size 字段为空。是否可以给 Size 一个默认值字符串?

我正在使用 Silverstripe 3.5。感谢您的帮助!

解决方案是在本例中使用 populateDefaults() 函数而不是 $defaults 数组。这也意味着我可以从 DropdownField 函数中删除方括号和最终参数(请参阅我对问题的评论):

class PartnerLogo extends DataObject {

  ...

  private static $db = array(
    "Size" => "Varchar(255)"
  );

  public function populateDefaults() {
    $this->Size = "sm";
    parent::populateDefaults();
  }

  public function getCMSFields() {

    $fields = new FieldList(new TabSet("Root"));

    $fields->addFieldToTab("Root.Main", 
      new DropdownField("Size", "Size", 
        array( 
          "xs" => "Extra Small", 
          "sm" => "Small", 
          "md" => "Medium", 
          "lg"=> "Large" 
        )
       )
    );

    return $fields;

  }

  ...

}

文档可能不正确,或者至少应该注意您不能将 Varchar 的默认值设置为字符串,就像您可以将 Enum示例(在 "Default Values" 下):https://docs.silverstripe.org/en/3/developer_guides/model/data_types_and_casting/

我认为这应该可以解决您的问题。尝试通过将 getCMSFields 函数替换为以下代码来设置下拉字段的默认值。

public function getCMSFields()
{
    $fields = new FieldList(new TabSet("Root"));

    $fields->addFieldToTab(
        "Root.Main",
        DropdownField::create("Size", "Size")
            ->setSource(
                array(
                "xs" => "Extra Small",
                "sm" => "Small",
                "md" => "Medium",
                "lg" => "Large",
                )
            )->setValue("sm") //set the default value to small
    );
    return $fields;
}

希望对您有所帮助。