/**
  * Parse the root condition.
  *
  * @param ContainerInterface                   $container  The container where the data shall be stored.
  *
  * @param ModelRelationshipDefinitionInterface $definition The relationship definition.
  *
  * @return void
  *
  * @throws DcGeneralRuntimeException If no root data provider is defined.
  */
 protected function parseRootCondition(ContainerInterface $container, ModelRelationshipDefinitionInterface $definition)
 {
     if (($rootCondition = $this->getFromDca('dca_config/rootEntries')) !== null) {
         $rootProvider = $container->getBasicDefinition()->getRootDataProvider();
         if (!$rootProvider) {
             throw new DcGeneralRuntimeException('Root data provider name not specified in DCA but rootEntries section specified.');
         }
         if (!$container->getDataProviderDefinition()->hasInformation($rootProvider)) {
             throw new DcGeneralRuntimeException('Unknown root data provider but rootEntries section specified.');
         }
         if (isset($rootCondition[$rootProvider])) {
             $rootCondition = $rootCondition[$rootProvider];
             $mySetter = $rootCondition['setOn'];
             if (($relationship = $definition->getRootCondition()) === null) {
                 $relationship = new RootCondition();
                 $setter = $mySetter;
                 $builder = FilterBuilder::fromArrayForRoot()->getFilter();
             } else {
                 /** @var RootConditionInterface $relationship */
                 if ($relationship->getSetters()) {
                     $setter = array_merge_recursive($mySetter, $relationship->getSetters());
                 } else {
                     $setter = $mySetter;
                 }
                 $builder = FilterBuilder::fromArrayForRoot($relationship->getFilterArray())->getFilter();
             }
             $builder->append(FilterBuilder::fromArrayForRoot((array) $rootCondition['filter']));
             $relationship->setSourceName($rootProvider)->setFilterArray($builder->getAllAsArray())->setSetters($setter);
             $definition->setRootCondition($relationship);
         }
     }
 }
 /**
  * This method parses the parent-child conditions.
  *
  * @param ContainerInterface $container The container where the data shall be stored.
  *
  * @return void
  */
 protected function parseParentChildConditions(ContainerInterface $container)
 {
     if ($container->hasDefinition(ModelRelationshipDefinitionInterface::NAME)) {
         $definition = $container->getDefinition(ModelRelationshipDefinitionInterface::NAME);
     } else {
         $definition = new DefaultModelRelationshipDefinition();
     }
     // If mode is 5, we need to define tree view.
     if ($this->getFromDca('list/sorting/mode') === 5) {
         $rootProvider = $this->getRootProviderName($container);
         if (($relationship = $definition->getRootCondition()) === null) {
             $relationship = new RootCondition();
             $relationship->setSourceName($rootProvider);
             $definition->setRootCondition($relationship);
             $builder = FilterBuilder::fromArrayForRoot()->getFilter();
         } else {
             $builder = FilterBuilder::fromArrayForRoot($relationship->getFilterArray())->getFilter();
         }
         $relationship->setSetters(array_merge_recursive(array(array('property' => 'pid', 'value' => '0'))), $relationship->getSetters());
         $builder->andPropertyEquals('pid', '0');
         $relationship->setFilterArray($builder->getAllAsArray());
         if (($relationship = $definition->getChildCondition($rootProvider, $rootProvider)) === null) {
             $relationship = new ParentChildCondition();
             $relationship->setSourceName($rootProvider)->setDestinationName($rootProvider);
             $definition->addChildCondition($relationship);
             $builder = FilterBuilder::fromArray()->getFilter();
         } else {
             $builder = FilterBuilder::fromArray($relationship->getFilterArray())->getFilter();
         }
         $relationship->setSetters(array_merge_recursive(array(array('to_field' => 'pid', 'from_field' => 'id'))), $relationship->getSetters());
         $builder->andRemotePropertyEquals('pid', 'id');
         $relationship->setFilterArray($builder->getAllAsArray());
         $container->setDefinition(ModelRelationshipDefinitionInterface::NAME, $definition);
     }
     // If ptable defined and no root setter we need to add (Contao default id=>pid mapping).
     if ($this->getFromDca('config/ptable') !== null) {
         $rootProvider = $this->getRootProviderName($container);
         if (($relationship = $definition->getRootCondition()) === null) {
             $relationship = new RootCondition();
             $relationship->setSourceName($rootProvider);
             $definition->setRootCondition($relationship);
         }
         if (!$relationship->getSetters()) {
             $relationship->setSetters(array_merge_recursive(array(array('property' => 'pid', 'value' => '0'))), $relationship->getSetters());
         }
         $container->setDefinition(ModelRelationshipDefinitionInterface::NAME, $definition);
     }
 }
示例#3
0
文件: Builder.php 项目: zonky2/core
 /**
  * Parse the correct conditions for a MetaModel with variant support.
  *
  * @param IMetaModelDataDefinition             $container  The data container.
  *
  * @param ModelRelationshipDefinitionInterface $definition The relationship container.
  *
  * @return RootConditionInterface
  */
 protected function getRootCondition($container, $definition)
 {
     $rootProvider = $container->getName();
     if (($relationship = $definition->getRootCondition()) === null) {
         $relationship = new RootCondition();
         $relationship->setSourceName($rootProvider);
         $definition->setRootCondition($relationship);
     }
     return $relationship;
 }