Я хочу получить и установить дату, используя свой собственный формат даты ( 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
Я нашел это лучшим решением для меня:
/// 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 (или их исходный код, это довольно чисто), чтобы узнать особенности, которые я забыл 🙂