Raised DBAL version from 1.1.5 to 1.1.6
[Packages/TYPO3.CMS.git] / typo3 / sysext / extbase / Classes / DomainObject / AbstractEntity.php
1 <?php
2 /***************************************************************
3 * Copyright notice
4 *
5 * (c) 2009 Jochen Rau <jochen.rau@typoplanet.de>
6 * All rights reserved
7 *
8 * This script is part of the TYPO3 project. The TYPO3 project is
9 * free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * The GNU General Public License can be found at
15 * http://www.gnu.org/copyleft/gpl.html.
16 *
17 * This script is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * This copyright notice MUST APPEAR in all copies of the script!
23 ***************************************************************/
24
25 /**
26 * An abstract Entity. An Entity is an object fundamentally defined not by its attributes,
27 * but by a thread of continuity and identity (e.g. a person).
28 *
29 * @package Extbase
30 * @subpackage DomainObject
31 * @version $ID:$
32 */
33 abstract class Tx_Extbase_DomainObject_AbstractEntity extends Tx_Extbase_DomainObject_AbstractDomainObject {
34
35 /**
36 * @var An array holding the clean property values. Set right after reconstitution of the object
37 */
38 private $_cleanProperties = array();
39
40 /**
41 * Register an object's clean state, e.g. after it has been reconstituted
42 * from the database.
43 *
44 * @param string $propertyName The name of the property to be memorized. If omitted all persistable properties are memorized.
45 * @return void
46 */
47 public function _memorizeCleanState($propertyName = NULL) {
48 if ($propertyName !== NULL) {
49 $this->_memorizePropertyCleanState($propertyName);
50 } else {
51 $this->_cleanProperties = array();
52 $properties = get_object_vars($this);
53 foreach ($properties as $propertyName => $propertyValue) {
54 if ($propertyName[0] === '_') continue; // Do not memorize "internal" properties
55 $this->_memorizePropertyCleanState($propertyName);
56 }
57 }
58 }
59
60 /**
61 * Register an properties's clean state, e.g. after it has been reconstituted
62 * from the database.
63 *
64 * @param string $propertyName The name of the property to be memorized. If omittet all persistable properties are memorized.
65 * @return void
66 */
67 public function _memorizePropertyCleanState($propertyName) {
68 $propertyValue = $this->$propertyName;
69 if (is_object($propertyValue)) {
70 $this->_cleanProperties[$propertyName] = clone($propertyValue);
71
72 // We need to make sure the clone and the original object
73 // are identical when compared with == (see _isDirty()).
74 // After the cloning, the Domain Object will have the property
75 // "isClone" set to TRUE, so we manually have to set it to FALSE
76 // again. Possible fix: Somehow get rid of the "isClone" property,
77 // which is currently needed in Fluid.
78 if ($propertyValue instanceof Tx_Extbase_DomainObject_AbstractDomainObject) {
79 $this->_cleanProperties[$propertyName]->_setClone(FALSE);
80 }
81 } else {
82 $this->_cleanProperties[$propertyName] = $propertyValue;
83 }
84 }
85
86 /**
87 * Returns a hash map of clean properties and $values.
88 *
89 * @return array
90 */
91 public function _getCleanProperties() {
92 return $this->_cleanProperties;
93 }
94
95 /**
96 * Returns the clean value of the given property. The returned value will be NULL if the clean state was not memorized before, or
97 * if the clean value is NULL.
98 *
99 * @param string $propertyName The name of the property to be memorized. If omittet all persistable properties are memorized.
100 * @return mixed The clean property value or NULL
101 */
102 public function _getCleanProperty($propertyName) {
103 if (is_array($this->_cleanProperties)) {
104 return isset($this->_cleanProperties[$propertyName]) ? $this->_cleanProperties[$propertyName] : NULL;
105 } else {
106 return NULL;
107 }
108 }
109
110 /**
111 * Returns TRUE if the properties were modified after reconstitution
112 *
113 * @param string $propertyName An optional name of a property to be checked if its value is dirty
114 * @return boolean
115 */
116 public function _isDirty($propertyName = NULL) {
117 if (empty($this->_cleanProperties)) return TRUE;
118 // if (!is_array($this->_cleanProperties)) throw new Tx_Extbase_Persistence_Exception_CleanStateNotMemorized('The clean state of the object "' . get_class($this) . '" has not been memorized before asking _isDirty().', 1233309106);
119 if ($this->uid !== NULL && $this->uid != $this->_cleanProperties['uid']) throw new Tx_Extbase_Persistence_Exception_TooDirty('The uid "' . $this->uid . '" has been modified, that is simply too much.', 1222871239);
120 $result = FALSE;
121 if ($propertyName !== NULL) {
122 if (is_object($this->$propertyName)) {
123 // In case it is an object, we do a simple comparison (!=) as we want cloned objects to return the same values.
124 $result = $this->_cleanProperties[$propertyName] != $this->$propertyName;
125 } else {
126 $result = $this->_cleanProperties[$propertyName] !== $this->$propertyName;
127 }
128 } else {
129 foreach ($this->_cleanProperties as $propertyName => $propertyValue) {
130 if (is_object($this->$propertyName)) {
131 // In case it is an object, we do a simple comparison (!=) as we want cloned objects to return the same values.
132 if ($this->$propertyName != $propertyValue) {
133 $result = TRUE;
134 break;
135 }
136 } else {
137 if ($this->$propertyName !== $propertyValue) {
138 $result = TRUE;
139 break;
140 }
141 }
142 }
143 }
144 return $result;
145 }
146
147 }
148 ?>