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