原则:获取和设置字段值时更改日期格式

时间:2010-07-09 21:07:34

标签: php doctrine

我希望能够获取设置日期使用我自己的日期格式( 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'));
    }

}

希望您找到解决方案,先谢谢

2 个答案:

答案 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文档(或其源代码,它非常干净),找出我忘记的具体内容:)