Extbase:
[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 = NULL;
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 * @internal
47 */
48 public function _memorizeCleanState($propertyName = NULL) {
49 // TODO Remove dependency to $dataMapper
50 if ($propertyName !== NULL) {
51 // SK: The if part is missing here! Can it be removed?
52 } else {
53 $dataMapper = t3lib_div::makeInstance('Tx_Extbase_Persistence_Mapper_DataMapper'); // singleton
54 $this->_cleanProperties = array();
55 $properties = get_object_vars($this);
56 foreach ($properties as $propertyName => $propertyValue) {
57 if ($dataMapper->isPersistableProperty(get_class($this), $propertyName)) {
58 $this->_memorizePropertyCleanState($propertyName);
59 }
60 }
61 }
62 }
63
64 /**
65 * Register an properties's clean state, e.g. after it has been reconstituted
66 * from the database.
67 *
68 * @param string $propertyName The name of the property to be memorized. If omittet all persistable properties are memorized.
69 * @return void
70 * @internal
71 */
72 public function _memorizePropertyCleanState($propertyName) {
73 $propertyValue = $this->$propertyName;
74 if (!is_array($this->_cleanProperties)) {
75 $this->_cleanProperties = array();
76 }
77 if (is_object($propertyValue)) {
78 // SK: Is "clone" semantically correct here? Discussion needed.
79 // If you see "getDirtyProperties", there you compare with ===, so cloned objects will return a different value I think (but needs to be verified)
80 $this->_cleanProperties[$propertyName] = clone($propertyValue);
81 } else {
82 $this->_cleanProperties[$propertyName] = $propertyValue;
83 }
84 }
85
86 /**
87 * Returns a hash map of dirty properties and $values
88 *
89 * @return array
90 * @internal
91 */
92 public function _getDirtyProperties() {
93 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);
94 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);
95 $dirtyProperties = array();
96 foreach ($this->_cleanProperties as $propertyName => $propertyValue) {
97 if ($this->$propertyName !== $propertyValue) {
98 $dirtyProperties[$propertyName] = $this->$propertyName;
99 }
100 }
101 return $dirtyProperties;
102 }
103
104 /**
105 * Returns TRUE if the properties were modified after reconstitution
106 *
107 * @return boolean
108 * @internal
109 */
110 public function _isDirty($propertyName = NULL) {
111 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);
112 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);
113 $result = FALSE;
114 if ($propertyName !== NULL) {
115 $result = $this->_cleanProperties[$propertyName] !== $this->$propertyName;
116 } else {
117 foreach ($this->_cleanProperties as $propertyName => $propertyValue) {
118 if ($this->$propertyName !== $propertyValue) {
119 $result = TRUE;
120 break;
121 }
122 }
123 }
124 return $result;
125 }
126
127 }
128 ?>