diff --git a/lib/Doctrine/Event.php b/lib/Doctrine/Event.php index ad80eaeb4..fb8119690 100644 --- a/lib/Doctrine/Event.php +++ b/lib/Doctrine/Event.php @@ -52,6 +52,8 @@ class Doctrine_Event const SAVEPOINT_ROLLBACK = 35; const SAVEPOINT_COMMIT = 36; + const HYDRATE = 40; + /* * RECORD EVENT CODES */ @@ -155,7 +157,7 @@ class Doctrine_Event case self::SAVEPOINT_ROLLBACK: return 'rollback savepoint'; case self::SAVEPOINT_COMMIT: - return 'commit Ssavepoint'; + return 'commit savepoint'; case self::RECORD_DELETE: return 'delete record'; @@ -222,6 +224,20 @@ class Doctrine_Event return $this; } + /** + * setOption + * sets the value of an option by reference + * + * @param string $option the name of the option + * @param mixed $value the value of the given option + * @return Doctrine_Event this object + */ + public function set($option, &$value) + { + $this->_options[$option] =& $value; + + return $this; + } /** * start * starts the internal timer of this event diff --git a/lib/Doctrine/Hydrate.php b/lib/Doctrine/Hydrate.php index 0f84e1529..49ec75ca0 100644 --- a/lib/Doctrine/Hydrate.php +++ b/lib/Doctrine/Hydrate.php @@ -777,8 +777,10 @@ class Doctrine_Hydrate extends Doctrine_Object implements Serializable */ public function execute($params = array(), $hydrationMode = null) { - $params = array_merge($this->_params['set'], $this->_params['where'], - $this->_params['having'], $params); + $params = array_merge($this->_params['set'], + $this->_params['where'], + $this->_params['having'], + $params); if ($this->_cache) { $cacheDriver = $this->getCacheDriver(); @@ -984,6 +986,8 @@ class Doctrine_Hydrate extends Doctrine_Object implements Serializable return $array; } + $event = new Doctrine_Event(Doctrine_Event::HYDRATE, null); + while ($data = $stmt->fetch(Doctrine::FETCH_ASSOC)) { $currData = array(); $identifiable = array(); @@ -1028,12 +1032,17 @@ class Doctrine_Hydrate extends Doctrine_Object implements Serializable // dealing with root component $table = $this->_aliasMap[$rootAlias]['table']; $componentName = $table->getComponentName(); + $event->set('data', $currData[$rootAlias]); + $table->getListener()->preHydrate($event); $element = $driver->getElement($currData[$rootAlias], $componentName); $oneToOne = false; $index = $driver->search($element, $array); - if ($index === false) { + if ($index === false) { + $event->set('data', $element); + $table->getListener()->postHydrate($event); + if (isset($this->_aliasMap[$rootAlias]['map'])) { $key = $this->_aliasMap[$rootAlias]['map']; @@ -1058,6 +1067,9 @@ class Doctrine_Hydrate extends Doctrine_Object implements Serializable $map = $this->_aliasMap[$alias]; $table = $this->_aliasMap[$alias]['table']; $componentName = $table->getComponentName(); + $event->set('data', $data); + $table->getListener()->preHydrate($event); + $element = $driver->getElement($data, $componentName); $parent = $map['parent']; @@ -1079,6 +1091,9 @@ class Doctrine_Hydrate extends Doctrine_Object implements Serializable $index = $driver->search($element, $prev[$parent][$componentAlias]); if ($index === false) { + $event->set('data', $element); + $table->getListener()->postHydrate($event); + if (isset($map['map'])) { $key = $map['map']; if (isset($prev[$parent][$componentAlias][$key])) { diff --git a/tests/HydrateTestCase.php b/tests/HydrateTestCase.php index 58a4b35a2..663cd658e 100644 --- a/tests/HydrateTestCase.php +++ b/tests/HydrateTestCase.php @@ -54,54 +54,40 @@ class Doctrine_Hydrate_TestCase extends Doctrine_UnitTestCase 'p' => array('id' => null, 'phonenumber' => null, 'user_id' => null) ) ); + public function prepareData() + { } - public function testExecuteForEmptyAliasMapThrowsException() + public function testHydrateHooks() { - $h = new Doctrine_Hydrate_Mock(); + $user = new User(); + $user->getTable()->addListener(new HydrationListener); + + $user->name = 'zYne'; + $user->save(); + + $this->conn->clear(); + + $user = Doctrine_Query::create()->from('User u')->fetchOne(); + + $this->assertEqual($user->name, 'ZYNE'); + $this->assertEqual($user->password, 'DEFAULT PASS'); + } +} +class HydrationListener extends Doctrine_EventListener +{ + public function preHydrate(Doctrine_Event $event) + { + $data = $event->data; + $data['password'] = 'default pass'; - try { - $h->execute(); - $this->fail('Should throw exception'); - } catch(Doctrine_Hydrate_Exception $e) { - $this->pass(); + $event->data = $data; + } + public function postHydrate(Doctrine_Event $event) + { + foreach ($event->data as $key => $value) { + $event->data[$key] = strtoupper($value); } } - public function testExecuteForEmptyTableAliasMapThrowsException() - { - $h = new Doctrine_Hydrate_Mock(); - $h->setData($this->testData1); - $h->setAliasMap(array('u' => array('table' => $this->conn->getTable('User')))); - try { - $h->execute(); - $this->fail('Should throw exception'); - } catch(Doctrine_Hydrate_Exception $e) { - $this->pass(); - } - } - /** - public function testHydrate() - { - $h = new Doctrine_Hydrate_Mock(); - $h->setData($this->testData1); - $h->setAliasMap(array('u' => array('table' => $this->conn->getTable('User')), - 'p' => array('table' => $this->conn->getTable('Phonenumber'), - 'parent' => 'u', - 'relation' => $this->conn->getTable('User')->getRelation('Phonenumber'))) - ); - $h->setTableAliases(array('e' => 'u', 'p' => 'p')); - $coll = $h->execute(); - - $this->assertTrue($coll instanceof Doctrine_Collection2, 'instance of Doctrine_Collection expected'); - $this->assertEqual($coll->count(), 4); - $count = count($this->dbh); - - $this->assertEqual($coll[0]->Phonenumber->count(), 1); - $this->assertEqual($coll[1]->Phonenumber->count(), 2); - $this->assertEqual($coll[2]->Phonenumber->count(), 1); - $this->assertEqual($coll[3]->Phonenumber->count(), 0); - $this->assertEqual(count($this->dbh), $count); - } - */ } class Doctrine_Hydrate_Mock extends Doctrine_Hydrate { @@ -111,8 +97,11 @@ class Doctrine_Hydrate_Mock extends Doctrine_Hydrate { $this->data = $data; } - - public function _fetch($params = array(), $return = Doctrine::FETCH_RECORD) + public function getQuery() + { + + } + public function execute($params = array(), $hydrationMode = null) { return $this->data; } diff --git a/tests/run.php b/tests/run.php index 6ce972d60..4a42b34fd 100644 --- a/tests/run.php +++ b/tests/run.php @@ -197,7 +197,7 @@ $core->addTestCase(new Doctrine_Hydrate_FetchMode_TestCase()); $core->addTestCase(new Doctrine_Tokenizer_TestCase()); //$core->addTestCase(new Doctrine_Collection_Offset_TestCase()); //$core->addTestCase(new Doctrine_BatchIterator_TestCase()); -//$core->addTestCase(new Doctrine_Hydrate_TestCase()); +$core->addTestCase(new Doctrine_Hydrate_TestCase()); $test->addTestCase($core); // Relation handling