ExtBase:
authorJochen Rau <j.rau@web.de>
Wed, 25 Mar 2009 12:33:45 +0000 (12:33 +0000)
committerJochen Rau <j.rau@web.de>
Wed, 25 Mar 2009 12:33:45 +0000 (12:33 +0000)
* Changed method to determine the type of value in the Data Map
* Merged convertValueToQueryParameter() into convertPropertyValueToFieldValue()

typo3/sysext/extbase/Classes/Persistence/Mapper/DataMap.php
typo3/sysext/extbase/Classes/Persistence/Mapper/ObjectRelationalMapper.php
typo3/sysext/extbase/Classes/Persistence/Repository.php

index 66d6e2d..1b38823 100644 (file)
@@ -113,16 +113,16 @@ class Tx_ExtBase_Persistence_Mapper_DataMap {
                        $this->addColumn($this->getHiddenColumnName(), Tx_ExtBase_Persistence_Mapper_ColumnMap::TYPE_BOOLEAN);
                }
        }
-
+       
        protected function setTypeOfValue(Tx_ExtBase_Persistence_Mapper_ColumnMap &$columnMap, $columnConfiguration) {
-               if (strpos($columnConfiguration['config']['eval'], 'date') !== FALSE
-                       || strpos($columnConfiguration['config']['eval'], 'datetime') !== FALSE) {
+               $evalConfiguration = t3lib_div::trimExplode(',', $columnConfiguration['config']['eval']);
+               if (in_array('date', $evalConfiguration) || in_array('datetime', $evalConfiguration)) {
                        $columnMap->setTypeOfValue(Tx_ExtBase_Persistence_Mapper_ColumnMap::TYPE_DATE);
                } elseif ($columnConfiguration['config']['type'] === 'check' && empty($columnConfiguration['config']['items'])) {
                        $columnMap->setTypeOfValue(Tx_ExtBase_Persistence_Mapper_ColumnMap::TYPE_BOOLEAN);
-               } elseif (strpos($columnConfiguration['config']['eval'], 'int') !== FALSE) {
+               } elseif (in_array('int', $evalConfiguration)) {
                        $columnMap->setTypeOfValue(Tx_ExtBase_Persistence_Mapper_ColumnMap::TYPE_INTEGER);
-               } elseif (strpos($columnConfiguration['config']['eval'], 'double2') !== FALSE) {
+               } elseif (in_array('double2', $evalConfiguration)) {
                        $columnMap->setTypeOfValue(Tx_ExtBase_Persistence_Mapper_ColumnMap::TYPE_FLOAT);
                } else {
                        $columnMap->setTypeOfValue(Tx_ExtBase_Persistence_Mapper_ColumnMap::TYPE_STRING);
@@ -242,12 +242,16 @@ class Tx_ExtBase_Persistence_Mapper_DataMap {
         * @return mixed The converted value
         */
        public function convertPropertyValueToFieldValue($propertyValue) {
-               if ($propertyValue instanceof DateTime) {
-                       $convertedValue = $propertyValue->format('U');
-               } elseif (is_bool($propertyValue)) {
+               if (is_bool($value)) {
                        $convertedValue = $propertyValue ? 1 : 0;
-               } else {
+               } elseif ($value instanceof Tx_ExtBase_DomainObject_AbstractDomainObject) {
+                       $convertedValue = $propertyValue->getUid();
+               } elseif ($propertyValue instanceof DateTime) {
+                       $convertedValue = $propertyValue->format('U');
+               } elseif (is_int($propertyValue)) {
                        $convertedValue = $propertyValue;
+               } else {
+                       $convertedValue = $GLOBALS['TYPO3_DB']->fullQuoteStr((string)$propertyValue, '');
                }
                return $convertedValue;
        }
index e49246b..6fc5c27 100644 (file)
@@ -58,9 +58,33 @@ class Tx_ExtBase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
        }
        
        /**
+        * This find method is invoked by the Persistence Repository.
+        * Find objects by multiple conditions. Either as SQL parts or query by example. The fin process is delegated
+        * to the data mapper.
+        * 
+        * The following condition array would find entities with description like the given keyword and
+        * name equal to "foo".
+        *
+        * <pre>
+        * array(
+        *   array('blog_description LIKE ?', $keyword),
+        *      'blogName' => 'Foo'
+        *      )
+        * </pre>
+        * 
+        * Note: The SQL part uses the database columns names, the query by example syntax uses
+        * the object property name (camel-cased, without underscore).
+        *
+        * @param array|string $conditions The conditions as an array or SQL string
+        * @param string $groupBy Group by SQL part
+        * @param string $orderBy Order by SQL part
+        * @param string $limit Limit SQL part
+        * @param bool $useEnableFields Wether to automatically restrict the query by enable fields
+        * @return array An array of objects, empty if no objects found
         * @see Repository#find(...)
         */
        public function find($className, $conditions = '', $groupBy = '', $orderBy = '', $limit = '', $useEnableFields = TRUE) {
+               $dataMap = $this->getDataMap($className);
                if (is_array($conditions)) {
                        $whereParts = array();
                        foreach ($conditions as $key => $condition) {
@@ -69,14 +93,14 @@ class Tx_ExtBase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
                                        for ($i = 1; $i < count($condition); $i++) {
                                                $markPos = strpos($sql, '?');
                                                if ($markPos !== FALSE) {
-                                                       $sql = substr($sql, 0, $markPos) . $this->convertValueToQueryParameter($condition[$i]) . substr($sql, $markPos + 1);
+                                                       $sql = substr($sql, 0, $markPos) . $dataMap->convertValueToQueryParameter($condition[$i]) . substr($sql, $markPos + 1);
                                                }
                                        }
                                        $whereParts[] = '(' . $sql . ')';
                                } elseif (is_string($key)) {
                                        if (!is_array($condition)) {
                                                $column = $this->getDataMap($className)->getColumnMap($key)->getColumnName();
-                                               $sql = $column . ' = ' . $this->convertValueToQueryParameter($condition);
+                                               $sql = $column . ' = ' . $dataMap->convertPropertyValueToFieldValue($condition);
                                        }
                                        $whereParts[] = '(' . $sql . ')';
                                }
@@ -88,18 +112,6 @@ class Tx_ExtBase_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Sing
                return $this->fetch($className, $where, $groupBy, $orderBy, $limit, $useEnableFields);
        }
 
-       protected function convertValueToQueryParameter($value) {
-               if (is_bool($value)) {
-                       $parameter = $value ? 1 : 0;
-               } elseif ($value instanceof Tx_ExtBase_DomainObject_AbstractDomainObject) {
-                       $parameter = $value->getUid();
-               } else {
-                       $parameter = (string)$value;
-               }
-               return $GLOBALS['TYPO3_DB']->fullQuoteStr($parameter, '');
-       }
-
-
        /**
         * Fetches rows from the database by given SQL statement snippets
         *
index 4182d6a..81daf98 100644 (file)
@@ -129,16 +129,17 @@ abstract class Tx_ExtBase_Persistence_Repository implements Tx_ExtBase_Persisten
        
        
        /**
-        * Find objects by multiple conditions. Either as SQL parts or query by example.
+        * Find objects by multiple conditions. Either as SQL parts or query by example. The fin process is delegated
+        * to the data mapper.
         * 
         * The following condition array would find entities with description like the given keyword and
         * name equal to "foo".
         *
         * <pre>
         * array(
-        *   array('blog_description LIKE ?', $keword),
-        *   'blogName' => 'Foo'
-        * )
+        *   array('blog_description LIKE ?', $keyword),
+        *      'blogName' => 'Foo'
+        *      )
         * </pre>
         * 
         * Note: The SQL part uses the database columns names, the query by example syntax uses
@@ -149,7 +150,7 @@ abstract class Tx_ExtBase_Persistence_Repository implements Tx_ExtBase_Persisten
         * @param string $orderBy Order by SQL part
         * @param string $limit Limit SQL part
         * @param bool $useEnableFields Wether to automatically restrict the query by enable fields
-        * @return array An array of objects, empty if no objects found
+        * @return array An array of objects, an empty array if no objects found
         */
        public function find($conditions = '', $groupBy = '', $orderBy = '', $limit = '', $useEnableFields = TRUE) {            
                return $this->dataMapper->find($this->aggregateRootClassName, $conditions, $groupBy, $orderBy, $limit, $useEnableFields);