Доктрина: изменение формата даты при получении и установке значений полей

Я хочу получить и установить дату, используя свой собственный формат даты ( dd / mm / yyyy ), а не doctrine ( yyyy-mm-dd ). Я нашел способ, определяющий getter и setter для каждого поля даты, но я хочу сделать это более удобным способом ( 1 setter + 1 getter для каждого поля даты в каждой таблице много )

class Curs extends BaseCurs { private function fechaDesdeEsp($fecha){ $fecha = new DateTime($fecha); return $fecha->format('Ym-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')); } } 

Надеюсь, вы найдете решение, спасибо в Advance

Solutions Collecting From Web of "Доктрина: изменение формата даты при получении и установке значений полей"

Я нашел это лучшим решением для меня:

 /// 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"); // [...] } } 

Я думаю, вы могли бы попробовать переопределить __call , который обрабатывает автоматическое получение / установку Doctrine, и, возможно, __get и __set тоже. Затем в этих функциях просмотрите метаданные таблицы (вы можете получить getTable() к этому через getTable() и метод в классе таблицы). Метаданные содержат тип столбца, поэтому просто проверьте, является ли это нужным вам типом.

Таким образом, вы можете просто переопределить магические методы, и они должны справиться с этим для вас. Я помню, вы также можете поместить это в пользовательский класс, который наследуется от Doctrine_Record, а затем измените настройки генератора модели Doctrine так, чтобы он использовал ваш собственный класс записи в качестве базы.

Посмотрите на документацию API Doctrine (или их исходный код, это довольно чисто), чтобы узнать особенности, которые я забыл 🙂