vendor/pimcore/pimcore/models/DataObject/Fieldcollection/Dao.php line 126

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Model\DataObject\Fieldcollection;
  15. use Pimcore\Db\Helper;
  16. use Pimcore\Logger;
  17. use Pimcore\Model;
  18. use Pimcore\Model\DataObject;
  19. use Pimcore\Model\DataObject\ClassDefinition\Data\CustomResourcePersistingInterface;
  20. use Pimcore\Model\DataObject\ClassDefinition\Data\LazyLoadingSupportInterface;
  21. use Pimcore\Model\DataObject\ClassDefinition\Data\ResourcePersistenceAwareInterface;
  22. /**
  23.  * @internal
  24.  *
  25.  * @property \Pimcore\Model\DataObject\Fieldcollection $model
  26.  */
  27. class Dao extends Model\Dao\AbstractDao
  28. {
  29.     /**
  30.      * @param DataObject\Concrete $object
  31.      * @param array $params
  32.      *
  33.      * @return array
  34.      */
  35.     public function save(DataObject\Concrete $object$params = [])
  36.     {
  37.         return $this->delete($objecttrue);
  38.     }
  39.     /**
  40.      * @param DataObject\Concrete $object
  41.      *
  42.      * @return array
  43.      */
  44.     public function load(DataObject\Concrete $object)
  45.     {
  46.         /** @var DataObject\ClassDefinition\Data\Fieldcollections $fieldDef */
  47.         $fieldDef $object->getClass()->getFieldDefinition($this->model->getFieldname(), ['suppressEnrichment' => true]);
  48.         $object->__objectAwareFields[$this->model->getFieldname()] = true;
  49.         $values = [];
  50.         foreach ($fieldDef->getAllowedTypes() as $type) {
  51.             if (!$definition DataObject\Fieldcollection\Definition::getByKey($type)) {
  52.                 continue;
  53.             }
  54.             $tableName $definition->getTableName($object->getClass());
  55.             try {
  56.                 $results $this->db->fetchAllAssociative('SELECT * FROM ' $tableName ' WHERE o_id = ? AND fieldname = ? ORDER BY `index` ASC', [$object->getId(), $this->model->getFieldname()]);
  57.             } catch (\Exception $e) {
  58.                 $results = [];
  59.             }
  60.             $fieldDefinitions $definition->getFieldDefinitions(['suppressEnrichment' => true]);
  61.             $collectionClass '\\Pimcore\\Model\\DataObject\\Fieldcollection\\Data\\' ucfirst($type);
  62.             $modelFactory \Pimcore::getContainer()->get('pimcore.model.factory');
  63.             foreach ($results as $result) {
  64.                 /** @var DataObject\Fieldcollection\Data\AbstractData $collection */
  65.                 $collection $modelFactory->build($collectionClass);
  66.                 $collection->setIndex($result['index']);
  67.                 $collection->setFieldname($result['fieldname']);
  68.                 $collection->setObject($object);
  69.                 foreach ($fieldDefinitions as $key => $fd) {
  70.                     $params = [
  71.                         'context' => [
  72.                             'object' => $object,
  73.                             'containerType' => 'fieldcollection',
  74.                             'containerKey' => $type,
  75.                             'fieldname' => $this->model->getFieldname(),
  76.                             'index' => $result['index'],
  77.                         ],
  78.                         'owner' => $collection,
  79.                         'fieldname' => $key,
  80.                     ];
  81.                     if ($fd instanceof CustomResourcePersistingInterface) {
  82.                         $doLoad true;
  83.                         if ($fd instanceof LazyLoadingSupportInterface) {
  84.                             if ($fd->getLazyLoading()) {
  85.                                 $doLoad false;
  86.                             }
  87.                         }
  88.                         if ($doLoad) {
  89.                             // datafield has it's own loader
  90.                             $value $fd->load(
  91.                                 $collection,
  92.                                 $params
  93.                             );
  94.                             if ($value === || !empty($value)) {
  95.                                 $collection->setValue($key$value);
  96.                                 if ($collection instanceof Model\Element\DirtyIndicatorInterface) {
  97.                                     $collection->markFieldDirty($keyfalse);
  98.                                 }
  99.                             }
  100.                         }
  101.                     }
  102.                     if ($fd instanceof ResourcePersistenceAwareInterface) {
  103.                         if (is_array($fd->getColumnType())) {
  104.                             $multidata = [];
  105.                             foreach ($fd->getColumnType() as $fkey => $fvalue) {
  106.                                 $multidata[$key '__' $fkey] = $result[$key '__' $fkey];
  107.                             }
  108.                             $collection->setValue($key$fd->getDataFromResource($multidata$object$params));
  109.                         } else {
  110.                             $collection->setValue($key$fd->getDataFromResource($result[$key], $object$params));
  111.                         }
  112.                     }
  113.                 }
  114.                 $values[] = $collection;
  115.             }
  116.         }
  117.         $orderedValues = [];
  118.         foreach ($values as $value) {
  119.             $orderedValues[$value->getIndex()] = $value;
  120.         }
  121.         ksort($orderedValues);
  122.         $this->model->setItems($orderedValues);
  123.         return $orderedValues;
  124.     }
  125.     /**
  126.      * @param DataObject\Concrete $object
  127.      * @param bool $saveMode true if called from save method
  128.      *
  129.      * @return array
  130.      */
  131.     public function delete(DataObject\Concrete $object$saveMode false)
  132.     {
  133.         // empty or create all relevant tables
  134.         /** @var DataObject\ClassDefinition\Data\Fieldcollections $fieldDef */
  135.         $fieldDef $object->getClass()->getFieldDefinition($this->model->getFieldname(), ['suppressEnrichment' => true]);
  136.         $hasLocalizedFields false;
  137.         foreach ($fieldDef->getAllowedTypes() as $type) {
  138.             if (!$definition DataObject\Fieldcollection\Definition::getByKey($type)) {
  139.                 continue;
  140.             }
  141.             if ($definition->getFieldDefinition('localizedfields')) {
  142.                 $hasLocalizedFields true;
  143.             }
  144.             $tableName $definition->getTableName($object->getClass());
  145.             try {
  146.                 $dataExists $this->db->fetchOne('SELECT `o_id` FROM `'.$tableName."` WHERE
  147.          `o_id` = '".$object->getId()."' AND `fieldname` = '".$this->model->getFieldname()."' LIMIT 1");
  148.                 if ($dataExists) {
  149.                     $this->db->delete($tableName, [
  150.                         'o_id' => $object->getId(),
  151.                         'fieldname' => $this->model->getFieldname(),
  152.                     ]);
  153.                 }
  154.             } catch (\Exception $e) {
  155.                 // create definition if it does not exist
  156.                 $definition->createUpdateTable($object->getClass());
  157.             }
  158.             if ($definition->getFieldDefinition('localizedfields', ['suppressEnrichment' => true])) {
  159.                 $tableName $definition->getLocalizedTableName($object->getClass());
  160.                 try {
  161.                     $dataExists $this->db->fetchOne('SELECT `ooo_id` FROM `'.$tableName."` WHERE
  162.          `ooo_id` = '".$object->getId()."' AND `fieldname` = '".$this->model->getFieldname()."' LIMIT 1 ");
  163.                     if ($dataExists) {
  164.                         $this->db->delete($tableName, [
  165.                             'ooo_id' => $object->getId(),
  166.                             'fieldname' => $this->model->getFieldname(),
  167.                         ]);
  168.                     }
  169.                 } catch (\Exception $e) {
  170.                     Logger::error((string) $e);
  171.                 }
  172.             }
  173.             $childDefinitions $definition->getFieldDefinitions(['suppressEnrichment' => true]);
  174.             if (is_array($childDefinitions)) {
  175.                 foreach ($childDefinitions as $fd) {
  176.                     if (!DataObject::isDirtyDetectionDisabled() && $this->model instanceof Model\Element\DirtyIndicatorInterface) {
  177.                         if ($fd instanceof DataObject\ClassDefinition\Data\Relations\AbstractRelations && !$this->model->isFieldDirty(
  178.                             '_self'
  179.                         )) {
  180.                             continue;
  181.                         }
  182.                     }
  183.                     if ($fd instanceof CustomResourcePersistingInterface) {
  184.                         $fd->delete(
  185.                             $object,
  186.                             [
  187.                                 'isUpdate' => $saveMode,
  188.                                 'context' => [
  189.                                     'containerType' => 'fieldcollection',
  190.                                     'containerKey' => $type,
  191.                                     'fieldname' => $this->model->getFieldname(),
  192.                                 ],
  193.                             ]
  194.                         );
  195.                     }
  196.                 }
  197.             }
  198.         }
  199.         $isDirty $this->model->isFieldDirty('_self');
  200.         if (!$isDirty) {
  201.             if ($items $this->model->getItems()) {
  202.                 /** @var Model\Element\DirtyIndicatorInterface $item */
  203.                 foreach ($items as $item) {
  204.                     if ($item->hasDirtyFields()) {
  205.                         $this->model->markFieldDirty('_self');
  206.                         break;
  207.                     }
  208.                 }
  209.             }
  210.         }
  211.         if (!$this->model->isFieldDirty('_self') && !DataObject::isDirtyDetectionDisabled()) {
  212.             return [];
  213.         }
  214.         $whereLocalizedFields "(ownertype = 'localizedfield' AND "
  215.             Helper::quoteInto($this->db'ownername LIKE ?''/fieldcollection~'
  216.                 $this->model->getFieldname() . '/%')
  217.             . ' AND ' Helper::quoteInto($this->db'src_id = ?'$object->getId()). ')';
  218.         if ($saveMode) {
  219.             if (!DataObject::isDirtyDetectionDisabled() && !$this->model->hasDirtyFields() && $hasLocalizedFields) {
  220.                 // always empty localized fields
  221.                 $this->db->executeStatement('DELETE FROM object_relations_' $object->getClassId() . ' WHERE ' $whereLocalizedFields);
  222.                 return ['saveLocalizedRelations' => true];
  223.             }
  224.         }
  225.         $where "(ownertype = 'fieldcollection' AND " Helper::quoteInto($this->db'ownername = ?'$this->model->getFieldname())
  226.             . ' AND ' Helper::quoteInto($this->db'src_id = ?'$object->getId()) . ')';
  227.         // empty relation table
  228.         $this->db->executeStatement('DELETE FROM object_relations_' $object->getClassId() . ' WHERE ' $where);
  229.         $this->db->executeStatement('DELETE FROM object_relations_' $object->getClassId() . ' WHERE ' $whereLocalizedFields);
  230.         return ['saveFieldcollectionRelations' => true'saveLocalizedRelations' => true];
  231.     }
  232. }