*
* @package Extbase
* @subpackage Persistence
- * @version $Id: LazyLoadingProxy.php 2591 2009-06-09 19:23:47Z k-fish $
+ * @version $Id$
*/
-// TODO Implement support for CountableInterface
-class Tx_Extbase_Persistence_LazyLoadingProxy {
-
- /**
- * @var Tx_Extbase_Persistence_QueryFactoryInterface
- */
- protected $queryFactory;
+class Tx_Extbase_Persistence_LazyLoadingProxy implements Iterator, Tx_Extbase_Persistence_LoadingStrategyInterface {
/**
* The object this property is contained in.
private $propertyName;
/**
+ * The raw field value.
*
- * @var Tx_Extbase_Persistence_Mapper_DataMap
+ * @var mixed
*/
- private $dataMap;
-
+ private $fieldValue;
+
/**
* Constructs this proxy instance.
*
* @param object $parentObject The object instance this proxy is part of
* @param string $propertyName The name of the proxied property in it's parent
- * @param Tx_Extbase_Persistence_Mapper_DataMap $dataMap The corresponding Data Map of the property
- * @internal
+ * @param mixed $fieldValue The raw field value.
*/
- public function __construct($parentObject, $propertyName, Tx_Extbase_Persistence_Mapper_DataMap $dataMap) {
- $this->queryFactory = t3lib_div::makeInstance('Tx_Extbase_Persistence_QueryFactory');
+ public function __construct($parentObject, $propertyName, $fieldValue) {
$this->parentObject = $parentObject;
$this->propertyName = $propertyName;
- $this->dataMap = $dataMap;
+ $this->fieldValue = $fieldValue;
}
/**
* Populate this proxy by asking the $population closure.
*
* @return object The instance (hopefully) returned
- * @internal
*/
public function _loadRealInstance() {
- $result = NULL;
- $columnMap = $this->dataMap->getColumnMap($this->propertyName);
- $objectStorage = new Tx_Extbase_Persistence_ObjectStorage();
- // TODO This if statement should be further encapsulated to follow the DRY principle (see Data Mapper)
- if ($columnMap->getTypeOfRelation() === Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_ONE) {
- $query = $this->queryFactory->create($columnMap->getChildClassName());
- $result = current($query->matching($query->withUid($row[$columnMap->getColumnName()]))->execute());
- } elseif ($columnMap->getTypeOfRelation() === Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_MANY) {
- $objectStorage = new Tx_Extbase_Persistence_ObjectStorage();
- $query = $this->queryFactory->create($columnMap->getChildClassName());
- $objects = $query->matching($query->equals($columnMap->getParentKeyFieldName(), $this->parentObject->getUid()))->execute();
- foreach ($objects as $object) {
- $objectStorage->attach($object);
- }
- $result = $objectStorage;
- } elseif ($columnMap->getTypeOfRelation() === Tx_Extbase_Persistence_Mapper_ColumnMap::RELATION_HAS_AND_BELONGS_TO_MANY) {
- $objectStorage = new Tx_Extbase_Persistence_ObjectStorage();
- $relationTableName = $columnMap->getRelationTableName();
- $left = $this->QOMFactory->selector($relationTableName);
- $childTableName = $columnMap->getChildTableName();
- $right = $this->QOMFactory->selector($childTableName);
- $joinCondition = $this->QOMFactory->equiJoinCondition($relationTableName, $columnMap->getChildKeyFieldName(), $childTableName, 'uid');
- $source = $this->QOMFactory->join(
- $left,
- $right,
- Tx_Extbase_Persistence_QOM_QueryObjectModelConstantsInterface::JCR_JOIN_TYPE_INNER,
- $joinCondition
- );
- $query = $this->queryFactory->create($columnMap->getChildClassName());
- $query->setSource($source);
- $objects = $query->matching($query->equals($columnMap->getChildKeyFieldName(), $this->parentObject->getUid()))->execute();
- foreach ($objects as $object) {
- $objectStorage->attach($object);
- }
- $result = $objectStorage;
+ // this check safeguards against a proxy being activated multiple times
+ // usually that does not happen, but if the proxy is held from outside
+ // it's parent... the result would be weird.
+ if ($this->parentObject->_getProperty($this->propertyName) instanceof Tx_Extbase_Persistence_LazyLoadingProxy) {
+ $dataMapper = Tx_Extbase_Dispatcher::getPersistenceManager()->getBackend()->getDataMapper();
+ $objects = $dataMapper->fetchRelated($this->parentObject, $this->propertyName, $this->fieldValue, FALSE, FALSE);
+ $propertyValue = $dataMapper->mapResultToPropertyValue($this->parentObject, $this->propertyName, $objects);
+ $this->parentObject->_setProperty($this->propertyName, $propertyValue);
+ $this->parentObject->_memorizeCleanState($this->propertyName);
+ return $propertyValue;
+ } else {
+ return $this->parentObject->_getProperty($this->propertyName);
}
- $this->parentObject->_setProperty($this->propertyName, $result);
- $this->parentObject->_memorizeCleanState($this->propertyName);
- return $result;
}
/**
* @param string $methodName The name of the property to get
* @param array $arguments The arguments given to the call
* @return mixed
- * @internal
*/
public function __call($methodName, $arguments) {
$realInstance = $this->_loadRealInstance();
*
* @param string $propertyName The name of the property to get
* @return mixed
- * @internal
*/
public function __get($propertyName) {
$realInstance = $this->_loadRealInstance();
* @param string $propertyName The name of the property to set
* @param mixed $value The value for the property to set
* @return void
- * @internal
*/
public function __set($propertyName, $value) {
$realInstance = $this->_loadRealInstance();
*
* @param string $propertyName The name of the property to check
* @return boolean
- * @internal
*/
public function __isset($propertyName) {
$realInstance = $this->_loadRealInstance();
*
* @param string $propertyName The name of the property to unset
* @return void
- * @internal
*/
public function __unset($propertyName) {
$realInstance = $this->_loadRealInstance();
unset($realInstance->$propertyName);
}
+
+ /**
+ * Returns the current value of the storage array
+ *
+ * @return void
+ */
+ public function current() {
+ $realInstance = $this->_loadRealInstance();
+ return current($realInstance);
+ }
+
+ /**
+ * Returns the current key storage array
+ *
+ * @return void
+ */
+ public function key() {
+ $realInstance = $this->_loadRealInstance();
+ return key($realInstance);
+ }
+
+ /**
+ * Returns the next position of the storage array
+ *
+ * @return void
+ */
+ public function next() {
+ $realInstance = $this->_loadRealInstance();
+ next($realInstance);
+ }
+
+ /**
+ * Resets the array pointer of the storage
+ *
+ * @return void
+ */
+ public function rewind() {
+ $realInstance = $this->_loadRealInstance();
+ reset($realInstance);
+ }
+
+ /**
+ * Checks if the array pointer of the storage points to a valid position
+ *
+ * @return void
+ */
+ public function valid() {
+ return $this->current() !== FALSE;
+ }
+
+
+
}
-?>
\ No newline at end of file
+?>