Silverstripe根据页面类型设置不同的默认值


Silverstripe Setting different default values based on page types

我在$db数组中设置了一个默认值为"1"。例如:

class Page extends SiteTree {
   public static $defaults = array(
      "Indexing" => "1"
   );
}

这很好地设置了默认值。现在我有了一个不同的页面类型例如:

 class mypage extends page{
    // Since this class extends page so it will take the default
    // value "Indexing" => "1" ..
 }

我想在"mypage"页面类型中设置默认值"Indexing"=>"0"。我怎样才能做到呢?

我已经试过了:

 class mypage extends page{
    public static $defaults = array(
      "Indexing" => "0"
    );
 }

这不起作用,因为父默认值已设置。任何帮助都将不胜感激。谢谢。

@Zauberfisch几乎说到了重点,但我认为他遗漏了一些东西。你必须使用:

public function populateDefaults(){
    if($this->ClassName == "mypage")
        $this->PGIndexing = "0";
    else
        $this->PGIndexing = "1";
}

在这里,您将根据类名设置默认值。这应该行得通。欢呼:)

显然这会出错,因为$db不是用来设置值的,它是silverstripe的数据库定义。

如果它没有错误,那么你要么没有粘贴完整的代码,要么在silverstripe中有一个错误,让你找到解决这个错误语法的方法。

无论哪种方式,都是这样做的:

class Page extends SiteTree {
    // public static for SilverStripe 3.x, private static for 3.1+
    public static $db = array(
        "Indexing" => "Int",
    );
    public static $defaults = array(
        "Indexing" => 1,
    );
}

现在这是基类,对于子类,我不是100%确定覆盖默认值实际上是有效的,但给它一个尝试,如果它没有,你必须覆盖populateDefaults方法并设置它在那里。

class OtherPage extends Page {
    public static $defaults = array(
        "Indexing" => 2,
    );
}

或者,如果不工作,您必须覆盖populateDefaults如上所述。
populateDefaults是通常读取$defaults变量并设置一些系统默认值的方法。

class OtherPage extends Page {
    public function populateDefaults() {
        $return = parent::populateDefaults();
        $this->Indexing = 2;
        return $return;
    }
}

注意,在所有情况下($defaultspopulateDefaults()),它只在记录第一次创建时运行。
这也意味着,如果你已经有一个记录,你添加一个字段,如索引以后,它不会影响现有的记录,这些将有一个值NULL, 0,空字符串等取决于数据类型。