MVC: Review with source annotations
authorSebastian Kurfürst <sebastian@typo3.org>
Tue, 17 Mar 2009 15:32:27 +0000 (15:32 +0000)
committerSebastian Kurfürst <sebastian@typo3.org>
Tue, 17 Mar 2009 15:32:27 +0000 (15:32 +0000)
20 files changed:
typo3/sysext/extbase/Classes/Configuration/Source/TX_EXTMVC_Configuration_Source_FlexForm.php
typo3/sysext/extbase/Classes/Configuration/Source/TX_EXTMVC_Configuration_Source_PHP.php
typo3/sysext/extbase/Classes/Configuration/Source/TX_EXTMVC_Configuration_Source_TS.php
typo3/sysext/extbase/Classes/Configuration/TX_EXTMVC_Configuration_Manager.php
typo3/sysext/extbase/Classes/Controller/TX_EXTMVC_Controller_AbstractController.php
typo3/sysext/extbase/Classes/Controller/TX_EXTMVC_Controller_ActionController.php
typo3/sysext/extbase/Classes/DomainObject/TX_EXTMVC_DomainObject_AbstractDomainObject.php
typo3/sysext/extbase/Classes/DomainObject/TX_EXTMVC_DomainObject_Entity.php
typo3/sysext/extbase/Classes/Persistence/Exception/TX_EXTMVC_Persistence_Exception_TooDirty.php
typo3/sysext/extbase/Classes/Persistence/Mapper/TX_EXTMVC_Persistence_Mapper_ColumnMap.php
typo3/sysext/extbase/Classes/Persistence/Mapper/TX_EXTMVC_Persistence_Mapper_DataMap.php
typo3/sysext/extbase/Classes/Persistence/Mapper/TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper.php
typo3/sysext/extbase/Classes/Persistence/TX_EXTMVC_Persistence_ObjectStorage.php
typo3/sysext/extbase/Classes/Persistence/TX_EXTMVC_Persistence_QueryFactoryInterface.php
typo3/sysext/extbase/Classes/Persistence/TX_EXTMVC_Persistence_QueryInterface.php
typo3/sysext/extbase/Classes/Persistence/TX_EXTMVC_Persistence_Repository.php
typo3/sysext/extbase/Classes/Persistence/TX_EXTMVC_Persistence_Session.php
typo3/sysext/extbase/Classes/TX_EXTMVC_Request.php
typo3/sysext/extbase/Classes/Web/TX_EXTMVC_Web_Response.php
typo3/sysext/extbase/class.tx_extmvc_dispatcher.php

index 45feef8..f708669 100644 (file)
@@ -27,10 +27,17 @@ class TX_EXTMVC_Configuration_Source_FlexForm implements TX_EXTMVC_Configuration
         **/
        protected $flexFormContent;
 
+       /**
+        * Sets the flex form content
+        *
+        * @param string $flexFormContent Flexform content
+        * @return void
+        */
        public function setFlexFormContent($flexFormContent) {
                $this->flexFormContent = $flexFormContent;
        }
 
+       // SK: Change Doc comment
        /**
         * Loads the specified TypoScript configuration file and returns its content in a
         * configuration container. If the file does not exist or could not be loaded,
@@ -41,6 +48,7 @@ class TX_EXTMVC_Configuration_Source_FlexForm implements TX_EXTMVC_Configuration
         */
         public function load($extensionKey) {
                $settings = array();
+               // SK. I'd say this does not work in case $this->flexFormContent IS already an array. Can this happen?
                if (!is_array($this->flexFormContent) && $this->flexFormContent) {
                        $flexFormArray = t3lib_div::xml2array($this->flexFormContent);
                }
index 84296e8..13d220d 100644 (file)
@@ -37,7 +37,7 @@ class TX_EXTMVC_Configuration_Source_PHP implements TX_EXTMVC_Configuration_Sour
         * @return array
         */
        public function load($extensionKey) {
-               $pathAndFilename = t3lib_extMgm::extPath(strtolower($extensionKey)) . '/Configuration/Settings');
+               $pathAndFilename = t3lib_extMgm::extPath(strtolower($extensionKey)) . '/Configuration/Settings';
                $c = t3lib_div::makeInstance('TX_EXTMVC_Configuration_Container');
                if (file_exists($pathAndFilename . '.php')) {
                        require ($pathAndFilename . '.php');
index 302f877..ddd863d 100644 (file)
@@ -29,9 +29,11 @@ class TX_EXTMVC_Configuration_Source_TS implements TX_EXTMVC_Configuration_Sourc
         * @return TX_EXTMVC_Configuration_Container
         */
         public function load($extensionKey) {
+               // SK: same as with dispatcher. strtolower($extensionKey) is wrong; example: tt_news -> tx_ttnews
                $settings = $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_' . strtolower($extensionKey) . '.'];
                $c = t3lib_div::makeInstance('TX_EXTMVC_Configuration_Container');
                if (is_array($settings)) {
+                       // SK: IMHO we do not need the instance of TX_EXTMVC_Configuration_Container here. Why not return the TypoScript directly?
                        $c = t3lib_div::makeInstance('TX_EXTMVC_Configuration_Container');
                        $c->mergeWithTS($settings);
                }
index 965087e..3da4c8f 100644 (file)
@@ -70,6 +70,7 @@ class TX_EXTMVC_Configuration_Manager implements t3lib_Singleton {
                                        $settings = $settings[$controllerName];
                                }
                        }
+                       // SK: TODO: Look at this in detail
                        // if (!empty($controllerName) && is_array($settings[$controllerName])) {
                        //      foreach ($settings[$controllerName] as $key => $value) {
                        //              if (array_key_exists($key, $settings)) {
index 3480f20..eb1470e 100755 (executable)
@@ -43,7 +43,7 @@ abstract class TX_EXTMVC_Controller_AbstractController implements TX_EXTMVC_Cont
         * @var array
         */
        protected $settings;
-       
+
        /**
         * @var TX_EXTMVC_Request The current request
         */
@@ -58,13 +58,13 @@ abstract class TX_EXTMVC_Controller_AbstractController implements TX_EXTMVC_Cont
         * @var TX_EXTMVC_Controller_Arguments Arguments passed to the controller
         */
        protected $arguments;
-       
+
        /**
         * Actions that schould not be cached (changes the invocated dispatcher to a USER_INT cObject)
         * @var array
         */
        protected $nonCachableActions = array();
-       
+
        /**
         * Constructs the controller.
         *
@@ -72,6 +72,7 @@ abstract class TX_EXTMVC_Controller_AbstractController implements TX_EXTMVC_Cont
         * @param F3_FLOW3_Package_ManagerInterface $packageManager A reference to the Package Manager
         */
        public function __construct() {
+               // SK: Set $this->extensionKey, could be done the same way as it is done in Fluid
                $this->arguments = t3lib_div::makeInstance('TX_EXTMVC_Controller_Arguments');
        }
 
@@ -101,12 +102,12 @@ abstract class TX_EXTMVC_Controller_AbstractController implements TX_EXTMVC_Cont
                $this->initializeArguments();
                $this->mapRequestArgumentsToLocalArguments();
        }
-       
+       // SK: PHPDoc
        public function isCachableAction($action) {
                if (in_array($action, $this->nonCachableActions)) return FALSE;
                return TRUE;
        }
-       
+
        /**
         * Initializes (registers / defines) arguments of this controller.
         *
@@ -179,6 +180,7 @@ abstract class TX_EXTMVC_Controller_AbstractController implements TX_EXTMVC_Cont
         *
         * @return void
         */
+       // SK: needs to be adjusted, as $this->request->getArguments will only return an array (see the comments in the dispatcher)
        protected function mapRequestArgumentsToLocalArguments() {
                $requestArguments = $this->request->getArguments();
                foreach ($this->arguments as $argument) {
@@ -191,7 +193,7 @@ abstract class TX_EXTMVC_Controller_AbstractController implements TX_EXTMVC_Cont
                        }
                }
        }
-                       
+
 }
 
 ?>
\ No newline at end of file
index 0190a51..19d1e60 100644 (file)
@@ -29,6 +29,8 @@ require_once(t3lib_extMgm::extPath('extmvc') . 'Classes/Exception/TX_EXTMVC_Exce
  * @version $Id:$
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
+// SK: fill initializeArguments() so it parses the arguments for a given view. We need to discuss how this parsing can be
+// SK: done effectively.
 class TX_EXTMVC_Controller_ActionController extends TX_EXTMVC_Controller_AbstractController {
 
        /**
@@ -45,6 +47,9 @@ class TX_EXTMVC_Controller_ActionController extends TX_EXTMVC_Controller_Abstrac
         * By default a matching view will be resolved. If this property is set, automatic resolving is disabled and the specified object is used instead.
         * @var string
         */
+       // SK: rename to defaultViewObjectName. Should only be used if no custom view could be found.
+       // SK: How do we implement this with TYPO3 v4? How can we check if a class exists?
+       // SK: Changing the logic here makes it possible to write specific views for a given action, and use the default view for all other actions.
        protected $viewObjectName = NULL;
 
        /**
@@ -52,6 +57,7 @@ class TX_EXTMVC_Controller_ActionController extends TX_EXTMVC_Controller_Abstrac
         *
         * @var string
         */
+       // SK: Decision: Do we support "format"?
        protected $viewObjectNamePattern = 'TX_@extension_View_@controller@action';
 
        /**
@@ -59,7 +65,7 @@ class TX_EXTMVC_Controller_ActionController extends TX_EXTMVC_Controller_Abstrac
         * @var string
         */
        protected $actionMethodName = 'indexAction';
-       
+
        /**
         * Handles a request. The result output is returned by altering the given response.
         *
@@ -79,7 +85,7 @@ class TX_EXTMVC_Controller_ActionController extends TX_EXTMVC_Controller_Abstrac
                $this->initializeAction();
                $this->callActionMethod();
        }
-       
+
        /**
         * Determines the action method and assures that the method exists.
         *
@@ -118,24 +124,25 @@ class TX_EXTMVC_Controller_ActionController extends TX_EXTMVC_Controller_Abstrac
         */
        protected function initializeView() {
                // TODO Reslove View Object name
+               // SK: I think the above TODO can be removed, right?
                $viewObjectName = ($this->viewObjectName === NULL) ? $this->resolveViewObjectName() : $this->viewObjectName;
                if ($viewObjectName === FALSE) $viewObjectName = 'TX_EXTMVC_View_EmptyView';
 
                $this->view = t3lib_div::makeInstance($viewObjectName);
                $this->view->setRequest($this->request);
        }
-       
+
        /**
         * Determines the fully qualified view object name.
         *
         * @return string The fully qualified view object name
         */
        protected function resolveViewObjectName() {
-               $possibleViewName = $this->viewObjectNamePattern;               
+               $possibleViewName = $this->viewObjectNamePattern;
                $extensionKey = $this->request->getControllerExtensionKey();
-               $possibleViewName = str_replace('@extension', $extensionKey, $possibleViewName);                
-               $possibleViewName = str_replace('@controller', $this->request->getControllerName(), $possibleViewName);         
-               $possibleViewName = str_replace('@action', ucfirst($this->request->getControllerActionName()), $possibleViewName);              
+               $possibleViewName = str_replace('@extension', $extensionKey, $possibleViewName);
+               $possibleViewName = str_replace('@controller', $this->request->getControllerName(), $possibleViewName);
+               $possibleViewName = str_replace('@action', ucfirst($this->request->getControllerActionName()), $possibleViewName);
                return $possibleViewName;
        }
 
index dc9b5f5..4b7c18b 100644 (file)
@@ -29,27 +29,27 @@ require_once(t3lib_extMgm::extPath('extmvc') . 'Classes/Persistence/Mapper/TX_EX
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 abstract class TX_EXTMVC_DomainObject_AbstractDomainObject {
-       
+
        /**
         * @var string The uid
         */
        protected $uid;
 
        /**
-        * The generic constructor. If you want to implement your own __constructor() method in your Domain Object you have to call 
+        * The generic constructor. If you want to implement your own __constructor() method in your Domain Object you have to call
         * $this->initializeObject() in the first line of your constructor.
         *
         * @var array
         */
        private $cleanProperties = NULL;
-       
+
        public function __construct() {
                $this->initializeObject();
        }
-               
+
        /**
         * This is the magic __wakeup() method. It's invoked by the unserialize statement in the reconstitution process
-        * of the object. If you want to implement your own __wakeup() method in your Domain Object you have to call 
+        * of the object. If you want to implement your own __wakeup() method in your Domain Object you have to call
         * parent::__wakeup() first!
         *
         * @return void
@@ -61,15 +61,16 @@ abstract class TX_EXTMVC_DomainObject_AbstractDomainObject {
                $this->initializeObject();
                $this->initializeCleanProperties();
        }
-       
+
        /**
         * A template function to initialize an object
         *
         * @return void
         */
+       // SK: Add a short comment how this method can be used
        protected function initializeObject() {
        }
-       
+
        /**
         * Getter for uid
         *
@@ -78,14 +79,15 @@ abstract class TX_EXTMVC_DomainObject_AbstractDomainObject {
        public function getUid() {
                return $this->uid;
        }
-       
+
        /**
         * Reconstitutes a property. This method should only be called at reconstitution time!
         *
-        * @param string $propertyName 
-        * @param string $value 
+        * @param string $propertyName
+        * @param string $value
         * @return void
         */
+       // SK: add @internal annotation, and a big fat warning that this should not be used!!
        public function _reconstituteProperty($propertyName, $value) {
                if (property_exists($this, $propertyName)) {
                        $this->$propertyName = $value;
@@ -93,13 +95,14 @@ abstract class TX_EXTMVC_DomainObject_AbstractDomainObject {
                        // TODO throw new TX_EXTMVC_Persistence_Exception_UnknownProperty('The property "' . $propertyName . '" doesn\'t exist in this object.', 1233270476);
                }
        }
-       
+
        /**
         * Register an object's clean state, e.g. after it has been reconstituted
         * from the database
         *
         * @return void
         */
+       // SK: add @internal annotation, and a big fat warning that this should not be used!!
        public function _memorizeCleanState() {
                $this->initializeCleanProperties();
                $cleanProperties = array();
@@ -108,12 +111,13 @@ abstract class TX_EXTMVC_DomainObject_AbstractDomainObject {
                }
                $this->cleanProperties = $cleanProperties;
        }
-       
+
        /**
         * returns TRUE if the properties were modified after reconstitution
         *
         * @return boolean
         */
+       // SK: add @internal annotation, and a big fat warning that this should not be used!!
        public function _isDirty() {
                // if (!is_array($this->cleanProperties)) throw new TX_EXTMVC_Persistence_Exception_CleanStateNotMemorized('The clean state of the object "' . get_class($this) . '" has not been memorized before asking _isDirty().', 1233309106);
                if ($this->uid !== NULL && $this->uid != $this->cleanProperties['uid']) throw new TX_EXTMVC_Persistence_Exception_TooDirty('The uid "' . $this->uid . '" has been modified, that is simply too much.', 1222871239);
@@ -128,6 +132,7 @@ abstract class TX_EXTMVC_DomainObject_AbstractDomainObject {
         *
         * @return array The properties
         */
+       // SK: add @internal annotation, and a big fat warning that this should not be used!!
        public function _getProperties() {
                return get_object_vars($this);
        }
@@ -137,6 +142,7 @@ abstract class TX_EXTMVC_DomainObject_AbstractDomainObject {
         *
         * @return boolean
         */
+       // SK: add @internal annotation, and a big fat warning that this should not be used!!
        public function _getDirtyProperties() {
                if (!is_array($this->cleanProperties)) throw new TX_EXTMVC_Persistence_Exception_CleanStateNotMemorized('The clean state of the object "' . get_class($this) . '" has not been memorized before asking _isDirty().', 1233309106);
                if ($this->uid !== NULL && $this->uid != $this->cleanProperties['uid']) throw new TX_EXTMVC_Persistence_Exception_TooDirty('The uid "' . $this->uid . '" has been modified, that is simply too much.', 1222871239);
@@ -149,6 +155,7 @@ abstract class TX_EXTMVC_DomainObject_AbstractDomainObject {
                return $dirtyProperties;
        }
 
+       // SK: PHPDoc
        private function initializeCleanProperties() {
                $properties = get_object_vars($this);
                $dataMapper = t3lib_div::makeInstance('TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper');
@@ -159,6 +166,6 @@ abstract class TX_EXTMVC_DomainObject_AbstractDomainObject {
                }
                $this->cleanProperties['uid'] = NULL;
        }
-       
+
 }
 ?>
\ No newline at end of file
index 26e5166..ca5ff3e 100644 (file)
@@ -28,6 +28,7 @@ require_once(t3lib_extMgm::extPath('extmvc') . 'Classes/DomainObject/TX_EXTMVC_D
  * @version $Id:$
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
-class TX_EXTMVC_DomainObject_Entity extends TX_EXTMVC_DomainObject_AbstractDomainObject {      
+// TODO: PHPDoc explaining what an Entity is
+class TX_EXTMVC_DomainObject_Entity extends TX_EXTMVC_DomainObject_AbstractDomainObject {
 }
 ?>
\ No newline at end of file
index d7de31b..2006b96 100644 (file)
@@ -26,6 +26,7 @@
  * @version $Id:$
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
+// SK: What does "TooDirty" mean? The UID has been modified? I'd suggest a more understandable name :-)
 class TooDirty extends TX_EXTMVC_Persistence_Exception {
 }
 
index 7d5dec6..2e7a848 100644 (file)
@@ -26,6 +26,8 @@
  * @version $Id:$
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
+// SK: I did not do an in-depth check of this class
+// SK: PHPDoc ;-)
 class TX_EXTMVC_Persistence_Mapper_ColumnMap {
 
        /**
@@ -52,51 +54,51 @@ class TX_EXTMVC_Persistence_Mapper_ColumnMap {
         * @var string
         **/
        protected $propertyName;
-       
+
        /**
         * The column name
         *
         * @var string
         **/
        protected $columnName;
-       
+
        /**
         * The type of relation
         *
         * @var int
         **/
        protected $typeOfRelation;
-       
+
        /**
         * The type of value
         *
         * @var int
         **/
        protected $typeOfValue;
-       
+
        /**
         * The name of the child's class
         *
         * @var string
         **/
        protected $childClassName;
-       
+
        /**
         * The name of the child's table
         *
         * @var string
         **/
        protected $childTableName;
-       
+
        /**
         * The where clause to narrow down the selected child records
         *
         * @var string
         **/
        protected $childTableWhere;
-       
+
        /**
-        * The name of the field the results from the child's table are sorted by 
+        * The name of the field the results from the child's table are sorted by
         *
         * @var string
         **/
@@ -108,14 +110,14 @@ class TX_EXTMVC_Persistence_Mapper_ColumnMap {
         * @var string
         **/
        protected $relationTableName;
-       
+
        /**
         * The name of the field holding the parents key
         *
         * @var string
         **/
        protected $parentKeyFieldName;
-       
+
        /**
         * The name of the field holding the name of the table of the parent's records
         *
@@ -145,11 +147,11 @@ class TX_EXTMVC_Persistence_Mapper_ColumnMap {
        public function isRelation() {
                return $this->typeOfRelation !== NULL && $this->typeOfRelation !== self::RELATION_NONE;
        }
-       
+
        public function getTypeOfRelation() {
                return $this->typeOfRelation;
        }
-       
+
        public function setTypeOfValue($typeOfValue) {
                switch ($typeOfValue) {
                        case self::TYPE_UNKNOWN;
@@ -169,7 +171,7 @@ class TX_EXTMVC_Persistence_Mapper_ColumnMap {
        public function getTypeOfValue() {
                return $this->typeOfValue;
        }
-               
+
        public function setPropertyName($propertyName) {
                $this->propertyName = $propertyName;
        }
@@ -185,7 +187,7 @@ class TX_EXTMVC_Persistence_Mapper_ColumnMap {
        public function getColumnName() {
                return $this->columnName;
        }
-       
+
        public function setChildClassName($childClassName) {
                $this->childClassName = $childClassName;
        }
@@ -217,7 +219,7 @@ class TX_EXTMVC_Persistence_Mapper_ColumnMap {
        public function getChildSortByFieldName() {
                return $this->childSortByFieldName;
        }
-       
+
        public function setRelationTableName($relationTableName) {
                $this->relationTableName = $relationTableName;
        }
@@ -241,6 +243,6 @@ class TX_EXTMVC_Persistence_Mapper_ColumnMap {
        public function getParentTableFieldName() {
                return $this->parentTableFieldName;
        }
-       
+
 }
 ?>
\ No newline at end of file
index f321f3f..7deac87 100644 (file)
@@ -30,34 +30,36 @@ require_once(t3lib_extMgm::extPath('extmvc') . 'Classes/Persistence/Mapper/TX_EX
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 class TX_EXTMVC_Persistence_Mapper_DataMap {
-
+// SK: PHPDoc (even for getters and setters, sorry ;-) )
+// SK: I did not do an in-depth check of this class
        /**
         * The domain class name
         *
         * @var string
         **/
        protected $className;
-       
+
        /**
         * The table name corresponding to the domain class configured in $TCA
         *
         * @var string
         **/
        protected $tableName;
-       
+
        /**
         * An array of column maps configured in $TCA
         *
         * @var array
         **/
        protected $columnMaps;
-       
+
        public function __construct($className) {
                $this->setClassName($className);
+               // SK: strtolower(..) is the wrong conversion for the class name. See the notice in the dispatcher (tt_news ->tx_ttnews)
                $this->setTableName(strtolower($this->className));
                t3lib_div::loadTCA($this->getTableName());
        }
-       
+
        public function setClassName($className) {
                $this->className = $className;
        }
@@ -73,24 +75,26 @@ class TX_EXTMVC_Persistence_Mapper_DataMap {
        public function getTableName() {
                return $this->tableName;
        }
-       
+
+       // SK: Why is initialize() not called in the constructor? Without initialize(), the object cannot do anything - or am I wrong here?
        public function initialize() {
                $columns = $GLOBALS['TCA'][$this->getTableName()]['columns'];
                if (is_array($columns)) {
-                       $this->addCommonColumns();                      
+                       $this->addCommonColumns();
                        foreach ($columns as $columnName => $columnConfiguration) {
                                $columnMap = new TX_EXTMVC_Persistence_Mapper_ColumnMap($columnName, $this);
                                $this->setTypeOfValue($columnMap, $columnConfiguration);
                                // TODO support for IRRE
                                // TODO support for MM_insert_fields and MM_match_fields
+                               // SK: Discuss the above things
                                $this->setRelations($columnMap, $columnConfiguration);
                                $this->addColumnMap($columnMap);
                        }
                } else {
-                       // TODO Throw exception 
+                       // TODO Throw exception
                }
        }
-       
+
        protected function addCommonColumns() {
                $this->addColumn('uid', TX_EXTMVC_Persistence_Mapper_ColumnMap::TYPE_INTEGER);
                $this->addColumn('pid', TX_EXTMVC_Persistence_Mapper_ColumnMap::TYPE_INTEGER);
@@ -104,7 +108,7 @@ class TX_EXTMVC_Persistence_Mapper_DataMap {
                        $this->addColumn($this->getHiddenColumnName(), TX_EXTMVC_Persistence_Mapper_ColumnMap::TYPE_BOOLEAN);
                }
        }
-       
+
        protected function setTypeOfValue(TX_EXTMVC_Persistence_Mapper_ColumnMap &$columnMap, $columnConfiguration) {
                if (strpos($columnConfiguration['config']['eval'], 'date') !== FALSE
                        || strpos($columnConfiguration['config']['eval'], 'datetime') !== FALSE) {
@@ -119,7 +123,7 @@ class TX_EXTMVC_Persistence_Mapper_DataMap {
                        $columnMap->setTypeOfValue(TX_EXTMVC_Persistence_Mapper_ColumnMap::TYPE_STRING);
                }
        }
-       
+
        protected function setRelations(TX_EXTMVC_Persistence_Mapper_ColumnMap &$columnMap, $columnConfiguration) {
                if (array_key_exists('foreign_table', $columnConfiguration['config']) && !array_key_exists('MM', $columnConfiguration['config'])) {
                        $columnMap->setTypeOfRelation(TX_EXTMVC_Persistence_Mapper_ColumnMap::RELATION_HAS_MANY);
@@ -128,14 +132,14 @@ class TX_EXTMVC_Persistence_Mapper_DataMap {
                        $columnMap->setChildTableWhere($columnConfiguration['config']['foreign_table_where']);
                        $columnMap->setChildSortbyFieldName($columnConfiguration['config']['foreign_sortby']);
                        $columnMap->setParentKeyFieldName($columnConfiguration['config']['foreign_field']);
-                       $columnMap->setParentTableFieldName($columnConfiguration['config']['foreign_table_field']);                                     
+                       $columnMap->setParentTableFieldName($columnConfiguration['config']['foreign_table_field']);
                } elseif (array_key_exists('MM', $columnConfiguration['config'])) {
                        $columnMap->setTypeOfRelation(TX_EXTMVC_Persistence_Mapper_ColumnMap::RELATION_HAS_AND_BELONGS_TO_MANY);
                        $columnMap->setChildClassName($columnConfiguration['config']['foreign_class']);
                        $columnMap->setChildTableName($columnConfiguration['config']['foreign_table']);
                        $columnMap->setRelationTableName($columnConfiguration['config']['MM']);
                } else {
-                       $columnMap->setTypeOfRelation(TX_EXTMVC_Persistence_Mapper_ColumnMap::RELATION_NONE);                                   
+                       $columnMap->setTypeOfRelation(TX_EXTMVC_Persistence_Mapper_ColumnMap::RELATION_NONE);
                }
        }
 
@@ -146,7 +150,7 @@ class TX_EXTMVC_Persistence_Mapper_DataMap {
        public function addColumnMap(TX_EXTMVC_Persistence_Mapper_ColumnMap $columnMap) {
                $this->columnMaps[$columnMap->getPropertyName()] = $columnMap;
        }
-       
+
        public function addColumn($columnName, $typeOfValue = TX_EXTMVC_Persistence_Mapper_ColumnMap::TYPE_STRING, $typeOfRelation = TX_EXTMVC_Persistence_Mapper_ColumnMap::RELATION_NONE) {
                $columnMap = new TX_EXTMVC_Persistence_Mapper_ColumnMap($columnName);
                $columnMap->setTypeOfValue($typeOfValue);
@@ -158,11 +162,11 @@ class TX_EXTMVC_Persistence_Mapper_DataMap {
        public function getColumnMaps() {
                return $this->columnMaps;
        }
-       
+
        public function getColumnMap($propertyName) {
                return $this->columnMaps[$propertyName];
        }
-       
+
        public function getColumnList() {
                $columnList = '';
                foreach ($this->columnMaps as $columnMap) {
@@ -173,35 +177,35 @@ class TX_EXTMVC_Persistence_Mapper_DataMap {
                }
                return $columnList;
        }
-       
+
        /**
         * Returns TRUE if the property is persistable (configured in $TCA)
         *
         * @param string $propertyName The property name
         * @return boolean TRUE if the property is persistable (configured in $TCA)
-        */             
+        */
        public function isPersistableProperty($propertyName) {
                if (array_key_exists($propertyName, $this->columnMaps)) return TRUE;
                return FALSE;
        }
-       
+
        /**
         * Returns the name of a column indicating the 'deleted' state of the row
         *
         * @return string The class name
-        */     
+        */
        public function getDeletedColumnName() {
                return $GLOBALS['TCA'][$this->getTableName()]['ctrl']['delete'];
        }
-       
+
        /**
         * Returns the name of a column indicating the 'hidden' state of the row
         *
-        */     
+        */
        public function getHiddenColumnName() {;
                return $GLOBALS['TCA'][$this->getTableName()]['ctrl']['enablecolumns']['disabled'];
        }
-       
+
        /**
         * Converts a value from a database field type to a property type
         *
@@ -209,7 +213,7 @@ class TX_EXTMVC_Persistence_Mapper_DataMap {
         * @param string $propertyName The property name
         * @param mixed $fieldValue The field value
         * @return mixed The converted value
-        */             
+        */
        public function convertFieldValueToPropertyValue($propertyName, $fieldValue) {
                $columnMap = $this->getColumnMap($propertyName);
                if ($columnMap->getTypeOfValue() === TX_EXTMVC_Persistence_Mapper_ColumnMap::TYPE_DATE) {
@@ -225,13 +229,13 @@ class TX_EXTMVC_Persistence_Mapper_DataMap {
                }
                return $convertedValue;
        }
-       
+
        /**
         * Converts a value from a property type to a database field type
         *
         * @param mixed $propertyValue The property value
         * @return mixed The converted value
-        */             
+        */
        public function convertPropertyValueToFieldValue($propertyValue) {
                if ($propertyValue instanceof DateTime) {
                        $convertedValue = $propertyValue->format('U');
@@ -242,6 +246,6 @@ class TX_EXTMVC_Persistence_Mapper_DataMap {
                }
                return $convertedValue;
        }
-                                       
+
 }
 ?>
\ No newline at end of file
index e9a6eaa..bcfe6aa 100644 (file)
@@ -40,21 +40,21 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
         * @var tslib_cObj
         **/
        protected $cObj;
-               
+
        /**
         * The persistence session
         *
         * @var TX_EXTMVC_Persistence_Session
         **/
        protected $session;
-               
+
        /**
         * Cached data maps
         *
         * @var array
         **/
        protected $dataMaps = array();
-               
+
        /**
         * Constructs a new mapper
         *
@@ -64,7 +64,7 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                $this->session = t3lib_div::makeInstance('TX_EXTMVC_Persistence_Session');
                $GLOBALS['TSFE']->includeTCA();
        }
-       
+
        /**
         * Finds objects matching a given WHERE Clause
         *
@@ -74,11 +74,12 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
         */
        public function findWhere($className, $where = '1=1') {
                $dataMap = $this->getDataMap($className);
+               // SK: Support for GroupBy, OrderBy, Limit!
                $rows = $this->fetch($dataMap, $where);
                $objects = $this->reconstituteObjects($dataMap, $rows);
                return $objects;
        }
-       
+
        /**
         * Fetches rows from the database by given SQL statement snippets
         *
@@ -98,10 +99,11 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                        $orderBy,
                        $limit
                        );
+               // SK: Do we want to make it possible to ignore "enableFields"?
                // TODO language overlay; workspace overlay
                return $rows ? $rows : array();
        }
-               
+
        /**
         * Fetches a rows from the database by given SQL statement snippets taking a relation table into account
         *
@@ -110,6 +112,7 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
         * @param string Optional ORDER BY field(s), if none, supply blank string.
         * @param string Optional LIMIT value ([begin,]max), if none, supply blank string.
         */
+       // SK: Are SQL injections possible here? Can we somehow prevent them? I did not check it thoroughly yet, but I think they are possible
        public function fetchWithRelationTable($parentObject, $columnMap, $where = '1=1', $groupBy = '', $orderBy = '', $limit = '') {
                $rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
                        $columnMap->getChildTableName() . '.*, ' . $columnMap->getRelationTableName() . '.*',
@@ -120,9 +123,9 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                        $limit
                        );
                // TODO language overlay; workspace overlay; sorting
-               return $rows ? $rows : array();         
+               return $rows ? $rows : array();
        }
-       
+
        /**
         * reconstitutes domain objects from $rows (array)
         *
@@ -130,6 +133,9 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
         * @param array $rows The rows array fetched from the database
         * @return array An array of reconstituted domain objects
         */
+       // SK: I Need to check this method more thoroughly.
+       // SK: Are loops detected during reconstitution?
+       // SK: What about "1:1" relations?
        protected function reconstituteObjects($dataMap, array $rows) {
                $objects = array();
                foreach ($rows as $row) {
@@ -152,12 +158,12 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                                        $object->_reconstituteProperty($columnMap->getPropertyName(), $relatedObjects);
                                }
                        }
-                       $this->session->registerReconstitutedObject($object);                   
+                       $this->session->registerReconstitutedObject($object);
                        $objects[] = $object;
                }
                return $objects;
        }
-       
+
        /**
         * Reconstitutes the specified object and fills it with the given properties.
         *
@@ -172,7 +178,7 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                unset($GLOBALS['EXTMVC']['reconstituteObject']);
                return $object;
        }
-       
+
        /**
         * Persists all objects of a persistence session
         *
@@ -187,7 +193,7 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                // persist all remaining objects registered manually
                // $this->persistObjects();
        }
-       
+
        /**
         * Persists all objects of a persitance session that are of a given class. If there
         * is no class specified, it persits all objects of a session.
@@ -210,18 +216,19 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                        $this->session->unregisterObject($object);
                }
        }
-       
+
        /**
         * Inserts an object to the database.
         *
         * @return void
         */
+       // SK: I need to check this more thorougly
        protected function insertObject(TX_EXTMVC_DomainObject_AbstractDomainObject $object, $parentObject = NULL, $parentPropertyName = NULL) {
                $properties = $object->_getProperties();
                $dataMap = $this->getDataMap(get_class($object));
                $relations = $this->getRelations($dataMap, $properties);
                $row = $this->getRow($dataMap, $properties);
-               
+
                if ($parentObject instanceof TX_EXTMVC_DomainObject_AbstractDomainObject && $parentPropertyName !== NULL) {
                        $parentDataMap = $this->getDataMap(get_class($parentObject));
                        $parentColumnMap = $parentDataMap->getColumnMap($parentPropertyName);
@@ -238,25 +245,26 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                unset($row['uid']);
                $row['pid'] = !empty($this->cObj->data['pages']) ? $this->cObj->data['pages'] : $GLOBALS['TSFE']->id;
                $row['tstamp'] = time();
-               
+
                $tableName = $dataMap->getTableName();
                $res = $GLOBALS['TYPO3_DB']->exec_INSERTquery(
                        $tableName,
                        $row
                        );
                $object->_reconstituteProperty('uid', $GLOBALS['TYPO3_DB']->sql_insert_id());
-               
+
                $recursionMode = TRUE; // TODO make parametric
                if ($recursionMode === TRUE) {
                        $this->processRelations($object, $propertyName, 'persist', $relations);
                }
        }
-               
+
        /**
         * Updates a modified object in the database
         *
         * @return void
         */
+       // SK: I need to check this more thorougly
        protected function updateObject(TX_EXTMVC_DomainObject_AbstractDomainObject $object, $parentObject = NULL, $parentPropertyName = NULL) {
                $properties = $object->_getDirtyProperties();
                $dataMap = $this->getDataMap(get_class($object));
@@ -299,6 +307,7 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
         *
         * @return void
         */
+       // SK: I need to check this more thorougly
        protected function deleteObject(TX_EXTMVC_DomainObject_AbstractDomainObject $object, $parentObject = NULL, $parentPropertyName = NULL, $recursionMode = FALSE, $onlySetDeleted = TRUE) {
                $relations = array();
                $properties = $object->_getDirtyProperties();
@@ -319,12 +328,12 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                                'uid=' . $object->getUid()
                                );
                }
-               
+
                if ($recursionMode === TRUE) {
                        $this->processRelations($object, $propertyName, 'delete', $relations);
-               }               
+               }
        }
-       
+
        /**
         * Returns a table row to be inserted or updated in the database
         *
@@ -332,6 +341,7 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
         * @param string $properties The properties of the object
         * @return array A single row to be inserted in the database
         */
+       // SK: I need to check this more thorougly
        protected function getRow(TX_EXTMVC_Persistence_Mapper_DataMap $dataMap, $properties) {
                $relations = array();
                foreach ($dataMap->getColumnMaps() as $columnMap) {
@@ -349,7 +359,7 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                }
                return $row;
        }
-       
+
        /**
         * Returns all property values holding child objects
         *
@@ -368,7 +378,7 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                }
                return $relations;
        }
-       
+
        /**
         * Processes all relations of an object. It also updates relation tables.
         *
@@ -407,16 +417,16 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                                                $this->deleteRelation($relatedObject, $object, $propertyName);
                                        }
                                }
-                       }               
+                       }
                }
        }
-       
+
        /**
         * Inserts relation to a relation table
         *
         * @param TX_EXTMVC_DomainObject_AbstractDomainObject $relatedObject The related object
         * @param TX_EXTMVC_DomainObject_AbstractDomainObject $parentObject The parent object
-        * @param string $parentPropertyName The name of the parent object's property where the related objects are stored in 
+        * @param string $parentPropertyName The name of the parent object's property where the related objects are stored in
         * @return void
         */
        protected function insertRelationInRelationTable(TX_EXTMVC_DomainObject_AbstractDomainObject $relatedObject, TX_EXTMVC_DomainObject_AbstractDomainObject $parentObject, $parentPropertyName) {
@@ -433,13 +443,13 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                        $rowToInsert
                        );
        }
-       
+
        /**
         * Update relations in a relation table
         *
         * @param array $relatedObjects An array of related objects
         * @param TX_EXTMVC_DomainObject_AbstractDomainObject $parentObject The parent object
-        * @param string $parentPropertyName The name of the parent object's property where the related objects are stored in 
+        * @param string $parentPropertyName The name of the parent object's property where the related objects are stored in
         * @return void
         */
        protected function updateRelationsInRelationTable($relatedObjects, TX_EXTMVC_DomainObject_AbstractDomainObject $parentObject, $parentPropertyName) {
@@ -461,7 +471,7 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                                if (array_key_exists($relatedObjectUid, $relationsToDelete)) {
                                        unset($relationsToDelete[$relatedObjectUid]);
                                }
-                       }                       
+                       }
                }
                if (count($relationsToDelete) > 0) {
                        $relationsToDeleteList = implode(',', $relationsToDelete);
@@ -471,7 +481,7 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                                );
                }
        }
-               
+
        /**
         * Delegates the call to the Data Map.
         * Returns TRUE if the property is persistable (configured in $TCA)
@@ -479,13 +489,13 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
         * @param string $className The property name
         * @param string $propertyName The property name
         * @return boolean TRUE if the property is persistable (configured in $TCA)
-        */             
+        */
        public function isPersistableProperty($className, $propertyName) {
                $dataMap = new TX_EXTMVC_Persistence_Mapper_DataMap($className);
                $dataMap->initialize();
                return $dataMap->isPersistableProperty($propertyName);
        }
-       
+
        /**
         * Returns a data map for a given class name
         *
@@ -500,6 +510,6 @@ class TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper implements t3lib_Singl
                }
                return $this->dataMaps[$className];
        }
-       
+
 }
 ?>
\ No newline at end of file
index 6eb3051..18b9ee0 100644 (file)
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
 class TX_EXTMVC_Persistence_ObjectStorage implements Iterator, Countable, ArrayAccess {
-
+// SK: Why not use SplObjectStorage?
        /**
-               * The array holding references to the stored objects.
-               *
-               * @var string
-               **/
+        * The array holding references to the stored objects.
+        *
+        * @var string
+        */
        private $storage = array();
 
        public function rewind() {
@@ -81,7 +81,7 @@ class TX_EXTMVC_Persistence_ObjectStorage implements Iterator, Countable, ArrayA
        /**
         * Does the Storage contains the given object
         *
-        * @param Object $obj 
+        * @param Object $obj
         * @return boolean TRUE|FALSE The result TRUE if the Storage contains the object; the result FALSE if not
         */
        public function contains($obj) {
@@ -96,7 +96,7 @@ class TX_EXTMVC_Persistence_ObjectStorage implements Iterator, Countable, ArrayA
        /**
         * Attaches an object to the storage
         *
-        * @param Object $obj 
+        * @param Object $obj
         * @return void
         */
        public function attach($obj) {
@@ -108,7 +108,7 @@ class TX_EXTMVC_Persistence_ObjectStorage implements Iterator, Countable, ArrayA
        /**
         * Detaches an object to the storage
         *
-        * @param Object $obj 
+        * @param Object $obj
         * @return void
         */
        public function detach($obj) {
@@ -131,7 +131,7 @@ class TX_EXTMVC_Persistence_ObjectStorage implements Iterator, Countable, ArrayA
        public function removeAll() {
                $this->storage = array();
        }
-       
+
        /**
         * Returns this object storage as an array
         *
index f03c9a1..f87ac6c 100644 (file)
@@ -26,6 +26,7 @@
  * @version $Id:$
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
+// SK: We do not need this class currently, right?
 interface QueryFactoryInterface {
 
        /**
index 6daf741..9f0c63f 100644 (file)
@@ -26,6 +26,7 @@
  * @version $Id:$
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  */
+// SK: We do not need this class currently, right?
 interface QueryInterface {
 
        /**
index 9bf4331..d55626b 100644 (file)
@@ -35,6 +35,7 @@ require_once(t3lib_extMgm::extPath('extmvc') . 'Classes/Persistence/TX_EXTMVC_Pe
 class TX_EXTMVC_Persistence_Repository implements TX_EXTMVC_Persistence_RepositoryInterface, t3lib_Singleton {
 
 // TODO make abstract
+// SK: See above ;-)
 
        /**
         * Class Name of the aggregate root
@@ -63,7 +64,7 @@ class TX_EXTMVC_Persistence_Repository implements TX_EXTMVC_Persistence_Reposito
         * @var array
         */
        protected $blacklistedFindByProperties = array('passwd', 'password');
-       
+
        /**
         * The content object
         *
@@ -86,13 +87,14 @@ class TX_EXTMVC_Persistence_Repository implements TX_EXTMVC_Persistence_Reposito
                $this->session = t3lib_div::makeInstance('TX_EXTMVC_Persistence_Session'); // singleton
                $this->session->registerAggregateRootClassName($this->aggregateRootClassName);
                // FIXIT auto resolve findBy properties; black list
+               // SK: see above comment
                $this->allowedFindByProperties = array('name', 'blog');
        }
-       
+
        /**
-        * Sets the class name of the aggregare root
+        * Sets the class name of the aggregate root
         *
-        * @param string $aggregateRootClassName 
+        * @param string $aggregateRootClassName
         * @return void
         */
        public function setAggregateRootClassName($aggregateRootClassName) {
@@ -101,7 +103,7 @@ class TX_EXTMVC_Persistence_Repository implements TX_EXTMVC_Persistence_Reposito
        }
 
        /**
-        * Returns the class name of the aggregare root
+        * Returns the class name of the aggregate root
         *
         * @return string The class name of the aggregate root
         */
@@ -109,7 +111,7 @@ class TX_EXTMVC_Persistence_Repository implements TX_EXTMVC_Persistence_Reposito
                // TODO throw exception if not set
                return $this->aggregateRootClassName;
        }
-       
+
        /**
         * Adds an object to this repository
         *
@@ -156,6 +158,7 @@ class TX_EXTMVC_Persistence_Repository implements TX_EXTMVC_Persistence_Reposito
                                        return FALSE;
                                } else {
                                        return $result[0]; // TODO LIMIT
+                                       // SK: Implement LIMIT!
                                }
                        }
                }
@@ -171,7 +174,7 @@ class TX_EXTMVC_Persistence_Repository implements TX_EXTMVC_Persistence_Reposito
                // TODO implement support for SQL LIMIT
                return $this->dataMapper->findWhere($this->aggregateRootClassName);
        }
-       
+
        /**
         * Returns the first objects found in this repository
         *
@@ -182,7 +185,7 @@ class TX_EXTMVC_Persistence_Repository implements TX_EXTMVC_Persistence_Reposito
                $result = $this->dataMapper->findWhere($this->aggregateRootClassName);
                return $result[0];
        }
-       
+
        /**
         * Finds objects matching 'property=xyz'
         *
@@ -199,6 +202,6 @@ class TX_EXTMVC_Persistence_Repository implements TX_EXTMVC_Persistence_Reposito
                }
                return $this->dataMapper->findWhere($this->aggregateRootClassName, $where);
        }
-               
+
 }
 ?>
\ No newline at end of file
index c4b5a6b..01661de 100644 (file)
@@ -32,7 +32,8 @@ require_once(t3lib_extMgm::extPath('extmvc') . 'Classes/Persistence/TX_EXTMVC_Pe
  */
 class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
 // TODO Implement against SessionInterface
-               
+// SK: Why should we need to implement this against an interface?
+
        /**
         * Objects added to the repository but not yet persisted in the persistence backend
         *
@@ -48,10 +49,13 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
        protected $removedObjects;
 
        /**
+        * Objects which were reconstituted
+        *
         * @var TX_EXTMVC_Persistence_ObjectStorage
         */
        protected $reconstitutedObjects;
 
+       // SK: Add comment here please :-) As I do not know what this means or when it is set
        /**
         * @var array
         */
@@ -73,18 +77,20 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
         * @param TX_EXTMVC_DomainObject_AbstractDomainObject $object
         * @return void
         */
+       // SK: When is this method called?
        public function registerAddedObject(TX_EXTMVC_DomainObject_AbstractDomainObject $object) {
                if ($this->reconstitutedObjects->contains($object)) throw new InvalidArgumentException('The object was registered as reconstituted and can therefore not be registered as added.');
                $this->removedObjects->detach($object);
                $this->addedObjects->attach($object);
        }
-       
+
        /**
         * Unregisters an added object
         *
         * @param TX_EXTMVC_DomainObject_AbstractDomainObject $object
         * @return void
         */
+       // SK: When is this method called?
        public function unregisterAddedObject(TX_EXTMVC_DomainObject_AbstractDomainObject $object) {
                $this->addedObjects->detach($object);
        }
@@ -95,6 +101,7 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
         * @param string $objectClassName The class name of objects to be returned
         * @return TX_EXTMVC_Persistence_ObjectStorage All added objects
         */
+       // SK: Wrong PHPDoc. Returns a normal array, and no ObjectStorage
        public function getAddedObjects($objectClassName = NULL) {
                $addedObjects = array();
                foreach ($this->addedObjects as $object) {
@@ -103,11 +110,11 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
                }
                return $addedObjects;
        }
-       
+
        /**
         * Returns TRUE if the given object is registered as added
         *
-        * @param TX_EXTMVC_DomainObject_AbstractDomainObject $object 
+        * @param TX_EXTMVC_DomainObject_AbstractDomainObject $object
         * @return bool TRUE if the given object is registered as added; otherwise FALSE
         */
        public function isAddedObject(TX_EXTMVC_DomainObject_AbstractDomainObject $object) {
@@ -120,6 +127,7 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
         * @param TX_EXTMVC_DomainObject_AbstractDomainObject $object
         * @return void
         */
+       // SK: when is this called?
        public function registerRemovedObject(TX_EXTMVC_DomainObject_AbstractDomainObject $object) {
                if ($this->addedObjects->contains($object)) {
                        $this->addedObjects->detach($object);
@@ -127,7 +135,7 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
                        $this->removedObjects->attach($object);
                }
        }
-       
+
        /**
         * Unregisters a removed object
         *
@@ -144,6 +152,7 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
         * @param string $objectClassName The class name of objects to be returned
         * @return TX_EXTMVC_Persistence_ObjectStorage All removed objects
         */
+       // SK: Wrong PHPDoc. Returns a normal array, and no ObjectStorage
        public function getRemovedObjects($objectClassName = NULL) {
                $removedObjects = array();
                foreach ($this->removedObjects as $object) {
@@ -152,11 +161,11 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
                }
                return $removedObjects;
        }
-       
+
        /**
         * Returns TRUE if the given object is registered as removed
         *
-        * @param TX_EXTMVC_DomainObject_AbstractDomainObject $object 
+        * @param TX_EXTMVC_DomainObject_AbstractDomainObject $object
         * @return bool TRUE if the given object is registered as removed; otherwise FALSE
         */
        public function isRemovedObject(TX_EXTMVC_DomainObject_AbstractDomainObject $object) {
@@ -174,7 +183,7 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
                $this->reconstitutedObjects->attach($object);
                $object->_memorizeCleanState();
        }
-       
+
        /**
         * Unregisters a reconstituted object
         *
@@ -191,6 +200,7 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
         * @param string $objectClassName The class name of objects to be returned
         * @return TX_EXTMVC_Persistence_ObjectStorage All reconstituted objects
         */
+       // SK: Wrong PHPDoc. Returns a normal array, and no ObjectStorage
        public function getReconstitutedObjects($objectClassName = NULL) {
                $reconstitutedObjects = array();
                foreach ($this->reconstitutedObjects as $object) {
@@ -199,11 +209,11 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
                }
                return $reconstitutedObjects;
        }
-       
+
        /**
         * Returns TRUE if the given object is registered as reconstituted
         *
-        * @param TX_EXTMVC_DomainObject_AbstractDomainObject $object 
+        * @param TX_EXTMVC_DomainObject_AbstractDomainObject $object
         * @return bool TRUE if the given object is registered as reconstituted; otherwise FALSE
         */
        public function isReconstitutedObject(TX_EXTMVC_DomainObject_AbstractDomainObject $object) {
@@ -226,17 +236,17 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
                }
                return $dirtyObjects;
        }
-       
+
        /**
         * Returns TRUE if the given object is dirty
         *
-        * @param TX_EXTMVC_DomainObject_AbstractDomainObject $object 
+        * @param TX_EXTMVC_DomainObject_AbstractDomainObject $object
         * @return bool TRUE if the given object is dirty; otherwise FALSE
         */
        public function isDirtyObject(TX_EXTMVC_DomainObject_AbstractDomainObject $object) {
                return $object->_isDirty();
        }
-       
+
        /**
         * Unregisters an object from all states
         *
@@ -248,7 +258,7 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
                $this->unregisterRemovedObject($object);
                $this->unregisterReconstitutedObject($object);
        }
-       
+
        /**
         * Clears all ObjectStorages
         *
@@ -260,7 +270,7 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
                $this->reconstitutedObjects->removeAll();
                $this->aggregateRootClassNames = array();
        }
-       
+
        /**
         * Registers an aggregate root
         *
@@ -270,7 +280,7 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
        public function registerAggregateRootClassName($className) {
                $this->aggregateRootClassNames[] = $className;
        }
-       
+
        /**
         * Returns all aggregate root classes
         *
@@ -279,7 +289,7 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
        public function getAggregateRootClassNames() {
                return $this->aggregateRootClassNames;
        }
-       
+
        /**
         * Commits the current persistence session.
         *
@@ -289,6 +299,6 @@ class TX_EXTMVC_Persistence_Session implements t3lib_singleton {
                $dataMapper = t3lib_div::makeInstance('TX_EXTMVC_Persistence_Mapper_ObjectRelationalMapper'); // singleton;
                $dataMapper->persistAll();
        }
-               
+
 }
 ?>
\ No newline at end of file
index 5cfb4dc..3920440 100644 (file)
@@ -118,7 +118,7 @@ class TX_EXTMVC_Request {
        public function getControllerObjectName() {
                $lowercaseObjectName = str_replace('@extension', $this->controllerExtensionKey, $this->controllerObjectNamePattern);
                $lowercaseObjectName = str_replace('@controller', $this->controllerName, $lowercaseObjectName);
-               $objectName = $lowercaseObjectName; //$this->objectManager->getCaseSensitiveObjectName($lowercaseObjectName); // TODO implement getCaseSensitiveObjectName() 
+               $objectName = $lowercaseObjectName; //$this->objectManager->getCaseSensitiveObjectName($lowercaseObjectName); // TODO implement getCaseSensitiveObjectName()
                if ($objectName === FALSE) throw new TX_EXTMVC_Exception_NoSuchController('The controller object "' . $lowercaseObjectName . '" does not exist.', 1220884009);
 
                return $objectName;
@@ -196,7 +196,7 @@ class TX_EXTMVC_Request {
         * @throws TX_EXTMVC_Exception_InvalidExtensionKey if the extension key is not valid
         */
        public function setControllerExtensionKey($extensionKey) {
-               $upperCamelCasedExtensionKey = $extensionKey; //$this->packageManager->getCaseSensitiveExtensionKey($extensionKey);  // TODO implement getCaseSensitiveExtensionKey() 
+               $upperCamelCasedExtensionKey = $extensionKey; //$this->packageManager->getCaseSensitiveExtensionKey($extensionKey);  // TODO implement getCaseSensitiveExtensionKey()
                if ($upperCamelCasedExtensionKey === FALSE) throw new TX_EXTMVC_Exception_InvalidExtensionKey('"' . $extensionKey . '" is not a valid extension key.', 1217961104);
                $this->controllerExtensionKey = $upperCamelCasedExtensionKey;
        }
@@ -295,6 +295,7 @@ class TX_EXTMVC_Request {
         * @param string $format The desired format, something like "html", "xml", "png", "json" or the like.
         * @return void
         */
+       // SK: To be discussed. I think "*format" can be removed, or do we support multiple request formats currently??
        public function setFormat($format) {
                if (!preg_match(self::PATTERN_MATCH_FORMAT, $format)) throw new TX_EXTMVC_Exception_InvalidFormat('An invalid request format (' . $format . ') was given.', 1218015038);
                $this->format = $format;
index 01977f2..0d65d3d 100755 (executable)
@@ -27,6 +27,7 @@
  * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later
  * @scope prototype
  */
+// SK: Please implement setHeader(), getHeaders() and sendHeaders() as it is in FLOW3 to send custom HTTP headers.
 class TX_EXTMVC_Web_Response extends TX_EXTMVC_Response {
 
        /**
@@ -34,6 +35,7 @@ class TX_EXTMVC_Web_Response extends TX_EXTMVC_Response {
         *
         * @var array
         */
+       // SK: To be discussed: Is additionalHeaderData a better name?
        protected $additionalHeaderTags = array();
 
        /**
index 7f29fce..fc6cdc0 100644 (file)
@@ -74,6 +74,7 @@ class TX_EXTMVC_Dispatcher {
         *
         */
        public function __construct() {
+               // SK: $this->arguments is not needed here.
                $this->arguments = new ArrayObject;
                spl_autoload_register(array($this, 'autoLoadClasses'));
        }
@@ -93,11 +94,13 @@ class TX_EXTMVC_Dispatcher {
 
                $start_time = microtime(TRUE);
 
+               // SK: should the parameters really be prepended with tx_extmvc? Maybe it makes more sense to have a few "global" parameters, like:
+               // SK: "controller", "extensionKey", "action"?
                $parameters = t3lib_div::_GET('tx_extmvc');
                $extensionKey = isset($parameters['extension']) ? stripslashes($parameters['extension']) : $configuration['extension'];
                $controllerName = isset($parameters['controller']) ? stripslashes($parameters['controller']) : $configuration['controller'];
                $actionName = isset($parameters['action']) ? stripslashes($parameters['action']) : $configuration['action'];
-               
+
                $request = t3lib_div::makeInstance('TX_EXTMVC_Web_Request');
                $request->setControllerExtensionKey($extensionKey);
                $request->setControllerName($controllerName);
@@ -105,26 +108,33 @@ class TX_EXTMVC_Dispatcher {
 
                $controllerObjectName = $request->getControllerObjectName();
                $controller = t3lib_div::makeInstance($controllerObjectName);
-               
+
                if (!$controller instanceof TX_EXTMVC_Controller_AbstractController) throw new TX_EXTMVC_Exception_InvalidController('Invalid controller "' . $controllerObjectName . '". The controller must be a valid request handling controller.', 1202921619);
 
                if (!$controller->isCachableAction($actionName) && $this->cObj->getUserObjectType() === tslib_cObj::OBJECTTYPE_USER) {
                        // FIXME Caching does nort work because it's by default a USER object, so the dispatcher is never called
+                       // SK: does caching already work?
                        $this->cObj->convertToUserIntObject();
                        return $content;
                }
 
                $arguments = t3lib_div::makeInstance('TX_EXTMVC_Controller_Arguments');
+               // SK: strtolower($extensionKey) is wrong I think, as all underscores need to be removed as well.
+               // SK: Example: tt_news -> tx_ttnews
                foreach (t3lib_div::GParrayMerged('tx_' . strtolower($extensionKey)) as $key => $value) {
+                       // SK: This argument is passed attached to the Request - so do NOT use  TX_EXTMVC_Controller_Argument or TX_EXTMVC_Controller_Arguments here.
+                       // SK: Instead, just add an argument by using $request->addArgument('key', 'value');
+                       // SK: The real argument mapping and validation then happens in the AbstractController.
                        $argument = new TX_EXTMVC_Controller_Argument($key, 'Raw');
                        $argument->setValue($value);
                        $arguments->addArgument($argument);
                }
+               // SK: as shown above, this needs to be changed
                $request->setArguments($arguments);
                $request->setRequestURI(t3lib_div::getIndpEnv('TYPO3_REQUEST_URL'));
                $request->setBaseURI(t3lib_div::getIndpEnv('TYPO3_SITE_URL'));
                $response = t3lib_div::makeInstance('TX_EXTMVC_Web_Response');
-               
+
                $configurationSources = array();
                $configurationSources[] = t3lib_div::makeInstance('TX_EXTMVC_Configuration_Source_TS');
                if (!empty($this->cObj->data['pi_flexform'])) {
@@ -140,17 +150,20 @@ class TX_EXTMVC_Dispatcher {
 
                $session = t3lib_div::makeInstance('TX_EXTMVC_Persistence_Session');
                try {
-                       $controller->processRequest($request, $response);                       
-               } catch (TX_EXTMVC_Exception_StopAction $ignoredException) {                    
+                       $controller->processRequest($request, $response);
+               } catch (TX_EXTMVC_Exception_StopAction $ignoredException) {
                }
                $session->commit();
                $session->clear();
-               
+
                $GLOBALS['TSFE']->additionalHeaderData[$request->getControllerExtensionKey()] = implode("\n", $response->getAdditionalHeaderTags());
-               
+
+               // SK: TODO: Remove debug statements
                $end_time = microtime(TRUE);
                debug($end_time - $start_time, -1);
 
+               // SK: Handle $response->getStatus()
+               // SK: Call sendHeaders() on the response
                return $response->getContent();
        }
 
@@ -162,6 +175,7 @@ class TX_EXTMVC_Dispatcher {
         * @uses t3lib_extMgm::extPath()
         * @return void
         */
+       // SK: Remove autoloader as soon as we do not need it anymore
        protected function autoLoadClasses($className) {
                if (empty($this->registeredClassNames[$className])) {
                        $classNameParts = explode('_', $className);