47167721ad1fea8b21f8b58a8420bd0b01cd0f1a
[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 omittet 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 } else {
52 $dataMapper = t3lib_div::makeInstance('Tx_Extbase_Persistence_Mapper_DataMapper'); // singleton
53 $this->_cleanProperties = array();
54 $properties = get_object_vars($this);
55 foreach ($properties as $propertyName => $propertyValue) {
56 if ($dataMapper->isPersistableProperty(get_class($this), $propertyName)) {
57 $this->_memorizePropertyCleanState($propertyName);
58 }
59 }
60 }
61 }
62
63 /**
64 * Register an properties's clean state, e.g. after it has been reconstituted
65 * from the database
66 *
67 * @param string $propertyName The name of the property to be memorized. If omittet all persistable properties are memorized.
68 * @return void
69 * @internal
70 */
71 public function _memorizePropertyCleanState($propertyName) {
72 $propertyValue = $this->$propertyName;
73 if (!is_array($this->_cleanProperties)) {
74 $this->_cleanProperties = array();
75 }
76 if (is_object($propertyValue)) {
77 $this->_cleanProperties[$propertyName] = clone($propertyValue);
78 } else {
79 $this->_cleanProperties[$propertyName] = $propertyValue;
80 }
81 }
82
83 /**
84 * Returns a hash map of dirty properties and $values
85 *
86 * @return array
87 * @internal
88 */
89 public function _getDirtyProperties() {
90 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);
91 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);
92 $dirtyProperties = array();
93 foreach ($this->_cleanProperties as $propertyName => $propertyValue) {
94 if ($this->$propertyName !== $propertyValue) {
95 $dirtyProperties[$propertyName] = $this->$propertyName;
96 }
97 }
98 return $dirtyProperties;
99 }
100
101 /**
102 * Returns TRUE if the properties were modified after reconstitution
103 *
104 * @return boolean
105 * @internal
106 */
107 public function _isDirty($propertyName = NULL) {
108 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);
109 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);
110 $result = FALSE;
111 if ($propertyName !== NULL) {
112 $result = $this->_cleanProperties[$propertyName] !== $this->$propertyName;
113 } else {
114 foreach ($this->_cleanProperties as $propertyName => $propertyValue) {
115 if ($this->$propertyName !== $propertyValue) {
116 $result = TRUE;
117 break;
118 }
119 }
120 }
121 return $result;
122 }
123
124 }
125 ?>