我希望能够获取并设置日期使用我自己的日期格式( dd / mm / yyyy )而不是学说( YYYY-MM-DD )。我找到了一种为每个日期字段指定 getter 和 setter 的方法,但我希望以更方便的方式进行(<每个表中每个日期字段的em> 1个setter + 1个getter很多)
class Curs extends BaseCurs {
private function fechaDesdeEsp($fecha){
$fecha = new DateTime($fecha);
return $fecha->format('Y-m-d');
}
private function fechaDesdeIso($fecha){
$fecha = new DateTime($fecha);
return $fecha->format('d/m/Y');
}
public function setFechainici($fecha_inici) {
return $this->_set('fecha_inici', $this->fechaDesdeEsp($fecha_inici));
}
public function getFechainici() {
return $this->fechaDesdeIso($this->_get('fecha_inici'));
}
}
希望您找到解决方案,先谢谢
答案 0 :(得分:4)
我发现这对我来说是最好的解决方案:
/// models/DateFormatBehaior.php
class DateFormatListener extends Doctrine_Record_Listener{
public function preInsert(Doctrine_event $Event){
$this->_prepare_date($Event);
}
public function preUpdate(Doctrine_event $Event){
$this->_prepare_date($Event);
}
// Private stuff
private function _prepare_date(Doctrine_event $Event){
$Model = $Event->getInvoker();
foreach($Model->getTable()->getColumns() as $FieldName=>$Field){
if($Field['type']=='timestamp'){
if(preg_match("/([0-9]{2})\/([0-9]{2})\/([0-9]{4})/",$Model[$FieldName],$Matches)){
$Model->$FieldName = sprintf("%s-%s-%s 00:00:00",$Matches[3],$Matches[2],$Matches[1]); // YYYY-DD-MM HH:MM:SS
}
}
}
}
}
class DateFormatTemplate extends Doctrine_Template{
public function setTableDefinition(){
$this->addListener(new DateFormatListener);
}
}
然后,每个具有时间戳字段的模型:
/// models/MyModel.php
abstract class MyModel extends Doctrine_Record{
public function setTableDefinition(){
// [...]
}
public function setUp(){
parent::setUp();
$this->actAs("DateFormatTemplate");
// [...]
}
}
答案 1 :(得分:0)
我认为您可以尝试覆盖__call
,它可以处理Doctrine的自动获取/设置内容,也可以__get
和__set
。然后,在这些函数中,查看表的元数据(您应该可以通过getTable()
和表类上的方法来实现)。元数据包含列的类型,因此只需测试它是否属于您想要的类型。
这样你就可以对魔术方法进行覆盖,他们应该为你处理它。我记得你也可以将它放在一个继承自Doctrine_Record的自定义类中,然后修改Doctrine的模型生成器设置,以便它使用你的自定义记录类作为基础。
查看Doctrine的API文档(或其源代码,它非常干净),找出我忘记的具体内容:)