[FOLLOWUP][BUGFIX] Extbase: Use fully populated records in insertObject() 21/42821/3
authorMorton Jonuschat <m.jonuschat@mojocode.de>
Fri, 21 Aug 2015 16:02:49 +0000 (18:02 +0200)
committerAnja Leichsenring <aleichsenring@ab-softlab.de>
Sun, 30 Aug 2015 09:26:30 +0000 (11:26 +0200)
As it is common practice to define object properties in Extbase models
without default values (resulting in a NULL value) while defining the
database columns as `DEFAULT '' NOT NULL` these columns need to be
skipped when preparing a new record for insertion into the database.
This allows the database to use the configured defaults for columns
not included in the insert statement.

To properly support strict databases in an Extbase extension/model it is
required to configure identical/compatible default values in the
database schema and the model. This problem cannot be solved completely
programmatically.

Resolves: #69247
Related: #69084
Releases: master
Change-Id: I9de6a68a9eac25e171e3bfde6314366dad1ae346
Reviewed-on: http://review.typo3.org/42821
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Markus Klein <markus.klein@typo3.org>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
typo3/sysext/core/Documentation/Changelog/master/Important-69084-AddingExtbaseObjectsWithNOTNULLColumnsHasChanged.rst [new file with mode: 0644]
typo3/sysext/extbase/Classes/Persistence/Generic/Backend.php

diff --git a/typo3/sysext/core/Documentation/Changelog/master/Important-69084-AddingExtbaseObjectsWithNOTNULLColumnsHasChanged.rst b/typo3/sysext/core/Documentation/Changelog/master/Important-69084-AddingExtbaseObjectsWithNOTNULLColumnsHasChanged.rst
new file mode 100644 (file)
index 0000000..dba50ef
--- /dev/null
@@ -0,0 +1,41 @@
+============================================================================
+Important: #69084 - Adding Extbase Objects with NOT NULL columns has changed
+============================================================================
+
+Description
+===========
+
+To better support databases that don't silently convert NULL values to
+an empty default value for database column defined as NOT NULL the
+`├ČnsertObject()`` method tries to determine the appropriate value for
+a column.
+
+Extbase object properties that have a value of NULL will be skipped when
+preparing the record to enable the DBMS default value to be used. This
+behavior has not changed compared to TYPO3 CMS 7.4 but allows proper
+support for DBMS that are strict about NOT NULL columns by defining
+appropriate default values for properties in the models.
+
+
+Example database schema:
+
+.. code-block:: sql
+
+       CREATE TABLE tx_blogexample_domain_model_blog (
+               title varchar(255) DEFAULT '' NOT NULL
+       );
+
+Example model definition:
+
+.. code-block:: php
+
+       class Blog extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
+
+               /**
+                * The blog's title.
+                *
+                * @var string
+                */
+               protected $title = '';
+
+       }
index 408f8b9..06af379 100644 (file)
@@ -657,11 +657,8 @@ class Backend implements \TYPO3\CMS\Extbase\Persistence\Generic\BackendInterface
                                        // MM type relation
                                        $row[$columnMap->getColumnName()] = 0;
                                }
-                       } else {
-                               // Check explicitly for NULL, as getPlainValue would convert this to 'NULL'
-                               $row[$columnMap->getColumnName()] = $propertyValue !== NULL
-                                       ? $this->dataMapper->getPlainValue($propertyValue)
-                                       : NULL;
+                       } elseif ($propertyValue !== NULL) {
+                               $row[$columnMap->getColumnName()] = $this->dataMapper->getPlainValue($propertyValue);
                        }
                }
                $this->addCommonFieldsToRow($object, $row);