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

时间:2014-06-18 08:12:12

标签: php silverstripe

我在$ 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" ..
 }

我想设置默认值“Indexing”=> “mypage”页面类型中的“0”。我怎样才能做到这一点。

我尝试了以下内容:

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

这不起作用,因为设置了父默认值。 任何帮助将深表感谢。感谢。

2 个答案:

答案 0 :(得分: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%确定覆盖默认值实际上有效,但试一试,如果它没有,你必须覆盖{ {1}}方法并将其设置在那里。

populateDefaults

或者,如果这不起作用,则必须如上所述覆盖class OtherPage extends Page { public static $defaults = array( "Indexing" => 2, ); } populateDefaults是通常读取$ defaults变量并设置一些系统默认值的方法。

populateDefaults

请注意,在所有情况下(class OtherPage extends Page { public function populateDefaults() { $return = parent::populateDefaults(); $this->Indexing = 2; return $return; } } $defaults),只有在创建第一个记录时才会运行。 这也意味着如果你已经有了一个记录,并且稍后添加了像Indexing这样的字段,它将不会影响现有记录,那些将具有NULL,0,空字符串等值,具体取决于数据类型。< / p>

答案 1 :(得分:1)

@Zauberfisch几乎到了这一点,但我认为他错过了一些东西。你必须使用:

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

您可以在此处根据类名设置默认值。所以这应该工作。干杯:)