From 231b42eb674b785ac57aced278f8ce96df51df55 Mon Sep 17 00:00:00 2001 From: "Jonathan.Wage" Date: Thu, 25 Oct 2007 21:02:06 +0000 Subject: [PATCH] Initial entry of timestampable template. --- lib/Doctrine/Template/Timestampable.php | 94 ++++++++++++++++++++++ lib/Doctrine/Timestampable/Listener.php | 101 ++++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 lib/Doctrine/Template/Timestampable.php create mode 100644 lib/Doctrine/Timestampable/Listener.php diff --git a/lib/Doctrine/Template/Timestampable.php b/lib/Doctrine/Template/Timestampable.php new file mode 100644 index 000000000..1bdc21ffb --- /dev/null +++ b/lib/Doctrine/Template/Timestampable.php @@ -0,0 +1,94 @@ +. + */ + +/** + * Doctrine_Template_Timestampable + * + * Easily add created and updated at timestamps to your doctrine records + * + * @package Doctrine + * @subpackage Template + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision$ + * @author Konsta Vesterinen + */ +class Doctrine_Template_Timestampable extends Doctrine_Template +{ + /** + * Array of timestampable options + * + * @var string + */ + protected $_options = array(); + + /** + * __construct + * + * @param string $array + * @return void + */ + public function __construct(array $options) + { + $this->_options = $options; + } + + /** + * setTableDefinition + * + * @return void + */ + public function setTableDefinition() + { + $createdOptions = array(); + $updatedOptions = array(); + + if (isset($this->_options['created'])) { + $createdOptions = $this->_options['created']; + unset($createdOptions['name']); + unset($createdOptions['type']); + } + + if (isset($this->_options['updated'])) { + $updatedOptions = $this->_options['updated']; + unset($updatedOptions['name']); + unset($updatedOptions['type']); + } + + $createdName = isset($this->_options['created']['name']) ? $this->_options['created']['name']:'created_at'; + $createdType = isset($this->_options['created']['type']) ? $this->_options['created']['type']:'timestamp'; + + $updatedName = isset($this->_options['updated']['name']) ? $this->_options['updated']['name']:'updated_at'; + $updatedType = isset($this->_options['updated']['type']) ? $this->_options['updated']['type']:'timestamp'; + + $this->hasColumn($createdName, $createdType, null, $createdOptions); + $this->hasColumn($updatedName, $updatedType, null, $updatedOptions); + + $this->_options['created']['name'] = $createdName; + $this->_options['created']['type'] = $createdType; + + $this->_options['updated']['name'] = $updatedName; + $this->_options['updated']['type'] = $updatedType; + + $this->addListener(new Doctrine_Timestampable_Listener($this->_options)); + } +} \ No newline at end of file diff --git a/lib/Doctrine/Timestampable/Listener.php b/lib/Doctrine/Timestampable/Listener.php new file mode 100644 index 000000000..cea57e94c --- /dev/null +++ b/lib/Doctrine/Timestampable/Listener.php @@ -0,0 +1,101 @@ +. + */ + +/** + * Doctrine_Timestampable_Listener + * + * @package Doctrine + * @subpackage Template + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision$ + * @author Konsta Vesterinen + */ +class Doctrine_Timestampable_Listener extends Doctrine_Record_Listener +{ + /** + * Array of timestampable options + * + * @var string + */ + protected $_options = array(); + + /** + * __construct + * + * @param string $options + * @return void + */ + public function __construct(array $options) + { + $this->_options = $options; + } + + /** + * preInsert + * + * @param object $Doctrine_Event + * @return void + */ + public function preInsert(Doctrine_Event $event) + { + $createdName = $this->_options['created']['name']; + $updatedName = $this->_options['updated']['name']; + + $event->getInvoker()->$createdName = $this->getTimestamp('created'); + $event->getInvoker()->$updatedName = $this->getTimestamp('updated'); + } + + /** + * preUpdate + * + * @param object $Doctrine_Event + * @return void + */ + public function preUpdate(Doctrine_Event $event) + { + $updatedName = $this->_options['updated']['name']; + + $event->getInvoker()->$updatedName = $this->getTimestamp('updated'); + } + + /** + * getTimestamp + * + * Gets the timestamp in the correct format + * + * @param string $type + * @return void + */ + public function getTimestamp($type) + { + $options = $this->_options[$type]; + + if ($options['type'] == 'date') { + return date('Y-m-d', time()); + } else if ($options['type'] == 'timestamp') { + return date('Y-m-d H:i:s', time()); + } else { + return time(); + } + } +} \ No newline at end of file