/**
  * Retrieve the parameters for the label.
  *
  * @param EnvironmentInterface $environment The translator in use.
  *
  * @param ModelInterface       $model       The model.
  *
  * @return array
  */
 protected function getLabelParameters(EnvironmentInterface $environment, ModelInterface $model)
 {
     if ($model->getProperty('type') == 'simplelookup') {
         return $this->getLabelParametersWithAttributeAndUrlParam($environment, $model);
     }
     return $this->getLabelParametersNormal($environment, $model);
 }
 /**
  * Build a widget for a given property.
  *
  * @param EnvironmentInterface $environment The environment.
  *
  * @param PropertyInterface    $property    The property.
  *
  * @param ModelInterface       $model       The current model.
  *
  * @return \Widget
  */
 public function buildWidget(EnvironmentInterface $environment, PropertyInterface $property, ModelInterface $model)
 {
     $dispatcher = $environment->getEventDispatcher();
     $propertyName = $property->getName();
     $propExtra = $property->getExtra();
     $defName = $environment->getDataDefinition()->getName();
     $strClass = $this->getWidgetClass($property);
     $event = new DecodePropertyValueForWidgetEvent($environment, $model);
     $event->setProperty($propertyName)->setValue($model->getProperty($propertyName));
     $dispatcher->dispatch($event::NAME, $event);
     $varValue = $event->getValue();
     $propExtra['required'] = $varValue == '' && !empty($propExtra['mandatory']);
     $propExtra['tableless'] = true;
     $arrConfig = array('inputType' => $property->getWidgetType(), 'label' => array($property->getLabel(), $property->getDescription()), 'options' => $this->getOptionsForWidget($environment, $property, $model), 'eval' => $propExtra);
     if (isset($propExtra['reference'])) {
         $arrConfig['reference'] = $propExtra['reference'];
     }
     $event = new GetAttributesFromDcaEvent($arrConfig, $property->getName(), $varValue, $propertyName, $defName, new DcCompat($environment, $model, $propertyName));
     $dispatcher->dispatch(ContaoEvents::WIDGET_GET_ATTRIBUTES_FROM_DCA, $event);
     $preparedConfig = $event->getResult();
     $widget = new $strClass($preparedConfig, new DcCompat($environment, $model, $propertyName));
     $widget->currentRecord = $model->getId();
     $event = new ManipulateWidgetEvent($environment, $model, $property, $widget);
     $dispatcher->dispatch(ManipulateWidgetEvent::NAME, $event);
     return $widget;
 }
 /**
  * Get the group header.
  *
  * @param EnvironmentInterface $environment    The environment.
  *
  * @param ModelInterface       $model          The model interface.
  *
  * @param string               $field          The grouping field name.
  *
  * @param int                  $groupingMode   The grouping mode.
  *
  * @param int                  $groupingLength The grouping length.
  *
  * @return string
  */
 public function formatGroupHeader($environment, $model, $field, $groupingMode, $groupingLength)
 {
     $property = $environment->getDataDefinition()->getPropertiesDefinition()->getProperty($field);
     // No property? Get out!
     if (!$property) {
         return '-';
     }
     $translator = $environment->getTranslator();
     $value = $model->getProperty($property->getName());
     $evaluation = $property->getExtra();
     if ($property->getWidgetType() == 'checkbox' && !$evaluation['multiple']) {
         return $this->formatCheckboxOptionLabel($value, $translator);
     } elseif ($groupingMode != GroupAndSortingInformationInterface::GROUP_NONE) {
         return $this->formatByGroupingMode($value, $groupingMode, $groupingLength, $environment, $property, $model);
     }
     $value = ViewHelpers::getReadableFieldValue($environment, $property, $model);
     if (isset($evaluation['reference'])) {
         $remoteNew = $evaluation['reference'][$value];
     } elseif (array_is_assoc($property->getOptions())) {
         $options = $property->getOptions();
         $remoteNew = $options[$value];
     } else {
         $remoteNew = $value;
     }
     if (is_array($remoteNew)) {
         $remoteNew = $remoteNew[0];
     }
     if (empty($remoteNew)) {
         $remoteNew = '-';
     }
     return $remoteNew;
 }
 /**
  * Extract a condition value depending if it is a remote value or property.
  *
  * @param array          $condition The condition array.
  *
  * @param ModelInterface $parent    The parent model.
  *
  * @return mixed
  */
 protected static function getConditionValue($condition, $parent)
 {
     if (isset($condition['remote_value'])) {
         return $condition['remote_value'];
     }
     return $parent->getProperty($condition['property']);
 }
示例#5
0
 /**
  * Get the MetaModel instance referenced in the pid property of the Model.
  *
  * @param ModelInterface $model The model.
  *
  * @return IMetaModel
  *
  * @throws \InvalidArgumentException When the MetaModel could not be retrieved.
  */
 private function getMetaModelByModelPid($model)
 {
     $metaModel = $this->getMetaModelById($model->getProperty('pid'));
     if ($metaModel === null) {
         throw new \InvalidArgumentException('Could not retrieve MetaModel ' . $model->getProperty('pid'));
     }
     return $metaModel;
 }
示例#6
0
 /**
  * Retrieve the MetaModel instance from a render settings model.
  *
  * @param ModelInterface $model The model to fetch the MetaModel instance for.
  *
  * @return IMetaModel
  */
 protected function getMetaModel($model)
 {
     if (!isset($this->metaModelCache[$model->getProperty('pid')])) {
         $dbResult = $this->getDatabase()->prepare('SELECT * FROM tl_metamodel_rendersettings WHERE id=?')->execute($model->getProperty('pid'))->row();
         $this->metaModelCache[$model->getProperty('pid')] = $this->getMetaModelById($dbResult['pid']);
     }
     return $this->metaModelCache[$model->getProperty('pid')];
 }
 /**
  * Check if entity is satisfied by
  * @param Entity $entity   The entity.
  * @param array  $condtion The condition.
  *
  * @return bool
  */
 private function satisfiesCondition(Entity $entity, $condtion)
 {
     if ($condtion['operation'] === static::OPERATION_EQUALS) {
         $operation = Comparison::EQUALS;
     } else {
         $operation = $condtion['operation'];
     }
     return Comparison::compare($entity->getProperty($condtion['property']), $condtion['value'], $operation);
 }
示例#8
0
 /**
  * {@inheritdoc}
  */
 public function match(ModelInterface $model = null, PropertyValueBag $input = null, PropertyInterface $property = null, LegendInterface $legend = null)
 {
     if ($property === null) {
         return false;
     }
     /** @var $model \MetaModels\DcGeneral\Data\Model */
     $nativeItem = $model->getItem();
     $metaModel = $nativeItem->getMetaModel();
     if ($metaModel->hasVariants() && !$nativeItem->isVariantBase()) {
         return !in_array($property->getName(), array_keys($metaModel->getInVariantAttributes()));
     }
     return true;
 }
 /**
  * @param ModelInterface $objItem
  *
  * @return ModelInterface|void
  */
 public function save(ModelInterface $objItem)
 {
     global $container;
     /** @var EventDispatcher $eventDispatcher */
     $eventDispatcher = $container['event-dispatcher'];
     $migrationSettings = $objItem->getPropertiesAsArray();
     $session = \Session::getInstance();
     do {
         $migrationId = substr(md5(mt_rand()), 0, 8);
     } while ($session->get('AVISOTA_MIGRATE_RECIPIENT_' . $migrationId));
     $session->set('AVISOTA_MIGRATE_RECIPIENT_' . $migrationId, $migrationSettings);
     $addToUrlEvent = new AddToUrlEvent('act=migrate&migration=' . rawurlencode($migrationId));
     $eventDispatcher->dispatch(ContaoEvents::BACKEND_ADD_TO_URL, $addToUrlEvent);
     $redirectEvent = new RedirectEvent($addToUrlEvent->getUrl());
     $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_REDIRECT, $redirectEvent);
 }
示例#10
0
 /**
  * Update the sorting property values of all models.
  *
  * @return void
  */
 private function updateSorting()
 {
     $ids = $this->getModelIds();
     // If no "next" sibling, simply increment the sorting as we are at the end of the list.
     if (!$this->marker) {
         foreach ($this->results as $model) {
             $this->position += 128;
             /** @var ModelInterface $model */
             $model->setProperty($this->getSortingProperty(), $this->position);
         }
         return;
     }
     $delta = $this->determineDelta();
     // Loop over all models and increment sorting value.
     foreach ($this->results as $model) {
         $this->position += $delta;
         /** @var ModelInterface $model */
         $model->setProperty($this->getSortingProperty(), $this->position);
     }
     // When the sorting exceeds the sorting of the "next" sibling, we need to push the remaining siblings to the
     // end of the list.
     if ($this->marker->getProperty($this->getSortingProperty()) <= $this->position) {
         do {
             // Skip models about to be pasted.
             if (in_array($this->marker->getId(), $ids)) {
                 $this->marker = $this->siblingsCopy->shift();
                 continue;
             }
             $this->position += $delta;
             $this->marker->setProperty($this->getSortingProperty(), $this->position);
             $this->results->push($this->marker);
             $this->marker = $this->siblingsCopy->shift();
         } while ($this->marker);
     }
 }
 /**
  * @param ModelInterface $objItem
  *
  * @return ModelInterface|void
  * @SuppressWarnings(PHPMD.ExitExpression)
  */
 public function save(ModelInterface $objItem)
 {
     $exportSettings = $objItem->getPropertiesAsArray();
     $session = \Session::getInstance();
     $recipientRepository = EntityHelper::getRepository('Avisota\\Contao:Recipient');
     $session->set(static::SESSION_NAME, $exportSettings);
     switch ($exportSettings['delimiter']) {
         case 'semicolon':
             $delimiter = ';';
             break;
         case 'space':
             $delimiter = ' ';
             break;
         case 'tabulator':
             $delimiter = "\t";
             break;
         case 'linebreak':
             $delimiter = "\n";
             break;
         default:
             $delimiter = ',';
     }
     switch ($exportSettings['enclosure']) {
         case 'single':
             $enclosure = "'";
             break;
         default:
             $enclosure = '"';
     }
     $length = 0;
     $csv = tmpfile();
     $recipients = $recipientRepository->findAll();
     /** @var Recipient $recipient */
     foreach ($recipients as $recipient) {
         $row = $this->generateCSVRows($recipient, $exportSettings);
         $length += fputcsv($csv, $row, $delimiter, $enclosure);
     }
     if (!headers_sent()) {
         header('Content-Type: text/csv; charset=utf-8');
         header('Content-Length: ' . $length);
         header('Content-Disposition: attachment; filename="export.csv"');
     }
     rewind($csv);
     fpassthru($csv);
     fclose($csv);
     exit;
 }
示例#12
0
 /**
  * Check if the contect of the event is a allowed one.
  *
  * @param ContainerInterface $dataDefinition The data definition from the environment.
  *
  * @param string             $propertyName   The current property name.
  *
  * @param ModelInterface     $model          The current model.
  *
  * @return bool True => It is a allowed one | False => nope
  */
 protected function isAllowedContext($dataDefinition, $propertyName, $model)
 {
     // Check the name of the data def.
     if ($dataDefinition->getName() !== 'tl_metamodel_filtersetting') {
         return false;
     }
     // Check the name of the property.
     if ($propertyName !== 'attr_id2') {
         return false;
     }
     // Check the type.
     if ($model->getProperty('type') !== 'range' && $model->getProperty('type') !== 'rangedate') {
         return false;
     }
     // At the end, return true.
     return true;
 }
 /**
  * Retrieve the instance of a widget for the given property.
  *
  * @param string           $property Name of the property for which the widget shall be retrieved.
  *
  * @param PropertyValueBag $valueBag The input values to use (optional).
  *
  * @return \Widget
  *
  * @throws DcGeneralRuntimeException         When No widget could be build.
  * @throws DcGeneralInvalidArgumentException When property is not defined in the property definitions.
  */
 public function getWidget($property, PropertyValueBag $valueBag = null)
 {
     $environment = $this->getEnvironment();
     $dispatcher = $environment->getEventDispatcher();
     $propertyDefinitions = $environment->getDataDefinition()->getPropertiesDefinition();
     if (!$propertyDefinitions->hasProperty($property)) {
         throw new DcGeneralInvalidArgumentException('Property ' . $property . ' is not defined in propertyDefinitions.');
     }
     $model = clone $this->model;
     $model->setId($this->model->getId());
     if ($valueBag) {
         $values = new PropertyValueBag($valueBag->getArrayCopy());
         $this->environment->getController()->updateModelFromPropertyBag($model, $values);
     }
     $propertyDefinition = $propertyDefinitions->getProperty($property);
     $event = new BuildWidgetEvent($environment, $model, $propertyDefinition);
     $dispatcher->dispatch(DcGeneralFrontendEvents::BUILD_WIDGET, $event);
     if (!$event->getWidget()) {
         throw new DcGeneralRuntimeException(sprintf('Widget was not build for property %s::%s.', $this->model->getProviderName(), $property));
     }
     return $event->getWidget();
 }
 /**
  * Handle the persisting of the currently loaded model.
  *
  * @return void
  */
 private function doPersist()
 {
     if (!$this->model->getMeta(ModelInterface::IS_CHANGED)) {
         return;
     }
     $this->handlePrePersist();
     // FIXME: manual sorting property handling is not enabled here as it originates from the backend defininiton.
     // Save the model.
     $dataProvider = $this->environment->getDataProvider($this->model->getProviderName());
     $dataProvider->save($this->model);
     $this->handlePostPersist();
     $this->storeVersion($this->model);
 }
示例#15
0
 /**
  * Calculate the resulting list.
  *
  * @return void
  */
 protected function calculate()
 {
     if (isset($this->results) || $this->models->length() == 0) {
         return;
     }
     $ids = $this->getModelIds();
     $this->results = clone $this->models;
     $this->siblingsCopy = clone $this->siblings;
     $this->scanToDesiredPosition();
     // If no "next" sibling, simply increment the sorting as we are at the end of the list.
     if (!$this->marker) {
         foreach ($this->results as $model) {
             $this->position += 128;
             /** @var ModelInterface $model */
             $model->setProperty($this->getSortingProperty(), $this->position);
         }
         return;
     }
     // Determine delta value: ((next sorting - current sorting) / amount of insert models).
     $delta = ($this->marker->getProperty($this->getSortingProperty()) - $this->position) / $this->results->length();
     // If delta too narrow, we need to make room.
     if ($delta < 2) {
         $delta = 128;
     }
     // Loop over all models and increment sorting value.
     foreach ($this->results as $model) {
         $this->position += $delta;
         /** @var ModelInterface $model */
         $model->setProperty($this->getSortingProperty(), $this->position);
     }
     // When the sorting exceeds the sorting of the "next" sibling, we need to push the remaining siblings to the
     // end of the list.
     if ($this->marker->getProperty($this->getSortingProperty()) <= $this->position) {
         do {
             // Skip models about to be pasted.
             if (in_array($this->marker->getId(), $ids)) {
                 $this->marker = $this->siblingsCopy->shift();
                 continue;
             }
             $this->position += $delta;
             $this->marker->setProperty($this->getSortingProperty(), $this->position);
             $this->results->push($this->marker);
             $this->marker = $this->siblingsCopy->shift();
         } while ($this->marker);
     }
 }
示例#16
0
 /**
  * Create the edit mask.
  *
  * @return string
  *
  * @throws DcGeneralRuntimeException         If the data container is not editable, closed.
  *
  * @throws DcGeneralInvalidArgumentException If an unknown property is encountered in the palette.
  *
  * @SuppressWarnings(PHPMD.LongVariable)
  */
 public function execute()
 {
     $environment = $this->getEnvironment();
     $definition = $this->getDataDefinition();
     $dataProvider = $environment->getDataProvider($this->model->getProviderName());
     $dataProviderDefinition = $definition->getDataProviderDefinition();
     $dataProviderInformation = $dataProviderDefinition->getInformation($this->model->getProviderName());
     $inputProvider = $environment->getInputProvider();
     $palettesDefinition = $definition->getPalettesDefinition();
     $blnSubmitted = $inputProvider->getValue('FORM_SUBMIT') === $definition->getName();
     $blnIsAutoSubmit = $inputProvider->getValue('SUBMIT_TYPE') === 'auto';
     $widgetManager = new ContaoWidgetManager($environment, $this->model);
     $this->checkEditable($this->model);
     $this->checkCreatable($this->model);
     $environment->getEventDispatcher()->dispatch(PreEditModelEvent::NAME, new PreEditModelEvent($environment, $this->model));
     $environment->getEventDispatcher()->dispatch(DcGeneralEvents::ENFORCE_MODEL_RELATIONSHIP, new EnforceModelRelationshipEvent($this->getEnvironment(), $this->model));
     // Pass 1: Get the palette for the values stored in the model.
     $palette = $palettesDefinition->findPalette($this->model);
     $propertyValues = $this->processInput($widgetManager);
     if ($blnSubmitted && $propertyValues) {
         // Pass 2: Determine the real palette we want to work on if we have some data submitted.
         $palette = $palettesDefinition->findPalette($this->model, $propertyValues);
         // Update the model - the model might add some more errors to the propertyValueBag via exceptions.
         $this->getEnvironment()->getController()->updateModelFromPropertyBag($this->model, $propertyValues);
     }
     $fieldSets = $this->buildFieldSet($widgetManager, $palette, $propertyValues);
     if (!$blnIsAutoSubmit && $blnSubmitted && empty($this->errors)) {
         if ($this->doPersist()) {
             $this->handleSubmit($this->model);
         }
     }
     $objTemplate = new ContaoBackendViewTemplate('dcbe_general_edit');
     $objTemplate->setData(array('fieldsets' => $fieldSets, 'versions' => $dataProviderInformation->isVersioningEnabled() ? $dataProvider->getVersions($this->model->getId()) : null, 'subHeadline' => $this->getHeadline(), 'table' => $definition->getName(), 'enctype' => 'multipart/form-data', 'error' => $this->errors, 'editButtons' => $this->getEditButtons(), 'noReload' => (bool) $this->errors, 'breadcrumb' => $this->breadcrumb));
     if (in_array('ContaoCommunityAlliance\\DcGeneral\\Data\\MultiLanguageDataProviderInterface', class_implements($environment->getDataProvider($this->model->getProviderName())))) {
         /** @var MultiLanguageDataProviderInterface $dataProvider */
         $langsNative = array();
         require TL_ROOT . '/system/config/languages.php';
         $objTemplate->set('languages', $environment->getController()->getSupportedLanguages($this->model->getId()))->set('language', $dataProvider->getCurrentLanguage())->set('languageHeadline', $langsNative[$dataProvider->getCurrentLanguage()]);
     } else {
         $objTemplate->set('languages', null)->set('languageHeadline', '');
     }
     return $objTemplate->parse();
 }
示例#17
0
 /**
  * Load property values.
  *
  * @return void
  */
 private function loadPropertyValues()
 {
     $flatten = $this->flatten($this->getData());
     $this->propertyValues = new PropertyValueBag($flatten);
     $this->model->setPropertiesAsArray($flatten);
     foreach ($this->getForms() as $form) {
         foreach ($form->getFields() as $field) {
             $defintion = $this->environment->getDataDefinition()->getPropertiesDefinition();
             $defintion->addProperty($field);
             if (!$this->isSubmit()) {
                 continue;
             }
             $value = $this->environment->getInputProvider()->getValue($field->getName(), true);
             // Set value to property values and to model. If validation failed, the widget manager loads data
             // from the model.
             $this->model->setProperty($field->getName(), $value);
             $this->propertyValues->setPropertyValue($field->getName(), $value);
         }
     }
 }
示例#18
0
 /**
  * Add the parent filtering to the given data config if any defined.
  *
  * @param ConfigInterface $config      The data config.
  *
  * @param ModelInterface  $parentModel The parent model.
  *
  * @return void
  *
  * @throws \RuntimeException When the parent provider does not match.
  */
 private function addParentFilter(ConfigInterface $config, ModelInterface $parentModel)
 {
     $environment = $this->getEnvironment();
     $definition = $environment->getDataDefinition();
     $basicDefinition = $definition->getBasicDefinition();
     $relationships = $definition->getModelRelationshipDefinition();
     if ($basicDefinition->getParentDataProvider() !== $parentModel->getProviderName()) {
         throw new \RuntimeException(sprintf('Parent provider mismatch: %s vs. %s', $basicDefinition->getParentDataProvider(), $parentModel->getProviderName()));
     }
     if (!$basicDefinition->getParentDataProvider()) {
         return;
     }
     // Apply parent filtering, do this only for root elements.
     if ($parentCondition = $relationships->getChildCondition($basicDefinition->getParentDataProvider(), $basicDefinition->getRootDataProvider())) {
         $baseFilter = $config->getFilter();
         $filter = $parentCondition->getFilter($parentModel);
         if ($baseFilter) {
             $filter = array_merge($baseFilter, $filter);
         }
         $config->setFilter($filter);
     }
 }
示例#19
0
文件: Driver.php 项目: designs2/core
 /**
  * Check if two models have the same values in all properties.
  *
  * @param ModelInterface $objModel1 The first model to compare.
  *
  * @param ModelInterface $objModel2 The second model to compare.
  *
  * @return boolean True - If both models are same, false if not.
  *
  * @throws \InvalidArgumentException If not both models are compatible with this data provider.
  */
 public function sameModels($objModel1, $objModel2)
 {
     if (!($objModel1 instanceof Model && $objModel2 instanceof Model)) {
         throw new \InvalidArgumentException('Passed models are not valid.');
     }
     $objNative1 = $objModel1->getItem();
     $objNative2 = $objModel2->getItem();
     if ($objNative1->getMetaModel() != $objNative2->getMetaModel()) {
         return false;
     }
     foreach ($objNative1->getMetaModel()->getAttributes() as $objAttribute) {
         if ($objNative1->get($objAttribute->getColName()) != $objNative2->get($objAttribute->getColName())) {
             return false;
         }
     }
     return true;
 }
示例#20
0
 /**
  * {@inheritdoc}
  */
 public function match(ModelInterface $model = null, PropertyValueBag $input = null, PropertyInterface $property = null, LegendInterface $legend = null)
 {
     if ($input && $input->hasPropertyValue('attr_id')) {
         $value = $input->getPropertyValue('attr_id');
     } elseif ($model) {
         $value = $model->getProperty('attr_id');
     } else {
         return false;
     }
     return $this->getTypeOfAttribute($value) == $this->getAttributeType();
 }
 /**
  * Save a model to the database.
  *
  * In general, this method fetches the solely property "rows" from the model and updates the local table against
  * these contents.
  *
  * The parent id (id of the model) will get checked and reflected also for new items.
  *
  * When rows with duplicate ids are encountered (like from MCW for example), the dupes are inserted as new rows.
  *
  * @param ModelInterface $objItem   The model to save.
  *
  * @param bool           $recursive Ignored as not relevant in this data provider.
  *
  * @return ModelInterface The passed Model.
  *
  * @throws DcGeneralException When the passed model does not contain a property named "rows", an Exception is
  *                            thrown.
  *
  * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  */
 public function save(ModelInterface $objItem, $recursive = false)
 {
     $arrData = $objItem->getProperty('rows');
     if (!($objItem->getID() && $arrData)) {
         throw new DcGeneralException('invalid input data in model.', 1);
     }
     $arrKeep = array();
     foreach ($arrData as $arrRow) {
         $arrSQL = $arrRow;
         // Update all.
         $intId = intval($arrRow['id']);
         // Work around the fact that multicolumnwizard does not clear any hidden fields when copying a dataset.
         // therefore we do consider any dupe as new dataset and save it accordingly.
         if (in_array($intId, $arrKeep)) {
             $intId = 0;
             unset($arrSQL['id']);
         }
         if ($intId > 0) {
             $this->objDatabase->prepare(sprintf('UPDATE %s %%s WHERE id=? AND %s=?', $this->strSource, $this->strGroupCol))->set($arrSQL)->execute($intId, $objItem->getId());
             $arrKeep[] = $intId;
         } else {
             // Force group col value.
             $arrSQL[$this->strGroupCol] = $objItem->getId();
             $arrKeep[] = $this->objDatabase->prepare(sprintf('INSERT INTO %s %%s', $this->strSource))->set($arrSQL)->execute()->insertId;
         }
     }
     // House keeping, kill the rest.
     $this->objDatabase->prepare(sprintf('DELETE FROM  %s WHERE %s=? AND id NOT IN (%s)', $this->strSource, $this->strGroupCol, implode(',', $arrKeep)))->execute($objItem->getId());
     return $objItem;
 }
示例#22
0
 /**
  * Render a given model.
  *
  * @param ModelInterface $objModel    The model to render.
  *
  * @param string         $strToggleID The id of the toggler.
  *
  * @return string
  */
 protected function parseModel($objModel, $strToggleID)
 {
     $objModel->setMeta(DCGE::MODEL_BUTTONS, $this->generateButtons($objModel));
     $objModel->setMeta(DCGE::MODEL_LABEL_VALUE, $this->formatModel($objModel));
     $objTemplate = $this->getTemplate('dcbe_general_treeview_entry');
     if ($objModel->getMeta(DCGE::TREE_VIEW_IS_OPEN)) {
         $toggleTitle = $this->getEnvironment()->getTranslator()->translate('collapseNode', 'MSC');
     } else {
         $toggleTitle = $this->getEnvironment()->getTranslator()->translate('expandNode', 'MSC');
     }
     $toggleScript = sprintf('Backend.getScrollOffset(); return BackendGeneral.loadSubTree(this, ' . '{\'toggler\':\'%s\', \'id\':\'%s\', \'providerName\':\'%s\', \'level\':\'%s\', \'mode\':\'%s\'});', $strToggleID, $objModel->getId(), $objModel->getProviderName(), $objModel->getMeta('dc_gen_tv_level'), 6);
     $toggleUrlEvent = new AddToUrlEvent('ptg=' . $objModel->getId() . '&amp;provider=' . $objModel->getProviderName());
     $this->getEnvironment()->getEventPropagator()->propagate(ContaoEvents::BACKEND_ADD_TO_URL, $toggleUrlEvent);
     $this->addToTemplate('environment', $this->getEnvironment(), $objTemplate)->addToTemplate('objModel', $objModel, $objTemplate)->addToTemplate('intMode', 6, $objTemplate)->addToTemplate('strToggleID', $strToggleID, $objTemplate)->addToTemplate('toggleUrl', $toggleUrlEvent->getUrl(), $objTemplate)->addToTemplate('toggleTitle', $toggleTitle, $objTemplate)->addToTemplate('toggleScript', $toggleScript, $objTemplate);
     return $objTemplate->parse();
 }
示例#23
0
 /**
  * Build a widget for a given property.
  *
  * @param PropertyInterface $property The property.
  *
  * @param ModelInterface    $model    The current model.
  *
  * @return \Widget
  *
  * @throws DcGeneralRuntimeException When not running in TL_MODE BE.
  *
  * @SuppressWarnings(PHPMD.Superglobals)
  * @SuppressWarnings(PHPMD.CamelCaseVariableName)
  */
 public function buildWidget(PropertyInterface $property, ModelInterface $model)
 {
     if (TL_MODE !== 'BE') {
         throw new DcGeneralRuntimeException(sprintf('WidgetBuilder only supports TL_MODE "BE". Running in TL_MODE "%s".', TL_MODE));
     }
     $environment = $this->getEnvironment();
     $dispatcher = $environment->getEventDispatcher();
     $propertyName = $property->getName();
     $propExtra = $property->getExtra();
     $defName = $environment->getDataDefinition()->getName();
     $strClass = $this->getWidgetClass($property);
     $event = new DecodePropertyValueForWidgetEvent($environment, $model);
     $event->setProperty($propertyName)->setValue($model->getProperty($propertyName));
     $dispatcher->dispatch($event::NAME, $event);
     $varValue = $event->getValue();
     if (isset($propExtra['rgxp']) && in_array($propExtra['rgxp'], array('date', 'time', 'datim')) && empty($propExtra['mandatory']) && is_numeric($varValue) && $varValue == 0) {
         $varValue = '';
     }
     $propExtra['required'] = $varValue == '' && !empty($propExtra['mandatory']);
     $arrConfig = array('inputType' => $property->getWidgetType(), 'label' => array($property->getLabel(), $property->getDescription()), 'options' => $this->getOptionsForWidget($property, $model), 'eval' => $propExtra);
     if (isset($propExtra['reference'])) {
         $arrConfig['reference'] = $propExtra['reference'];
     }
     $event = new GetAttributesFromDcaEvent($arrConfig, $property->getName(), $varValue, $propertyName, $defName, new DcCompat($environment, $model, $propertyName));
     $dispatcher->dispatch(ContaoEvents::WIDGET_GET_ATTRIBUTES_FROM_DCA, $event);
     $arrPrepared = $event->getResult();
     if ($arrConfig['inputType'] == 'checkbox' && isset($GLOBALS['TL_DCA'][$defName]['subpalettes']) && is_array($GLOBALS['TL_DCA'][$defName]['subpalettes']) && in_array($propertyName, array_keys($GLOBALS['TL_DCA'][$defName]['subpalettes'])) && $arrConfig['eval']['submitOnChange']) {
         // We have to override the onclick, do not append to it as Contao adds it's own code here in
         // \Widget::getAttributesFromDca() which kills our sub palette handling!
         $arrPrepared['onclick'] = "Backend.autoSubmit('" . $defName . "');";
     }
     $objWidget = new $strClass($arrPrepared, new DcCompat($environment, $model, $propertyName));
     // OH: what is this? source: DataContainer 232.
     $objWidget->currentRecord = $model->getId();
     $objWidget->xlabel .= $this->getXLabel($property);
     $event = new ManipulateWidgetEvent($environment, $model, $property, $objWidget);
     $dispatcher->dispatch(ManipulateWidgetEvent::NAME, $event);
     return $objWidget;
 }
示例#24
0
 /**
  * Retrieve the instance of a widget for the given property.
  *
  * @param string           $property    Name of the property for which the widget shall be retrieved.
  *
  * @param PropertyValueBag $inputValues The input values to use (optional).
  *
  * @throws DcGeneralInvalidArgumentException When an unknown property has been passed.
  *
  * @return \Widget
  */
 public function getWidget($property, PropertyValueBag $inputValues = null)
 {
     $environment = $this->getEnvironment();
     $defName = $environment->getDataDefinition()->getName();
     $propertyDefinitions = $environment->getDataDefinition()->getPropertiesDefinition();
     if (!$propertyDefinitions->hasProperty($property)) {
         throw new DcGeneralInvalidArgumentException('Property ' . $property . ' is not defined in propertyDefinitions.');
     }
     $event = new BuildWidgetEvent($environment, $this->model, $propertyDefinitions->getProperty($property));
     $environment->getEventPropagator()->propagate($event::NAME, $event, array($defName, $property));
     if ($event->getWidget()) {
         return $event->getWidget();
     }
     $propInfo = $propertyDefinitions->getProperty($property);
     $propExtra = $propInfo->getExtra();
     $varValue = $this->decodeValue($property, $this->model->getProperty($property));
     $xLabel = $this->getXLabel($propInfo);
     $strClass = $GLOBALS['BE_FFL'][$propInfo->getWidgetType()];
     if (!class_exists($strClass)) {
         return null;
     }
     // FIXME TEMPORARY WORKAROUND! To be fixed in the core: Controller::prepareForWidget(..).
     if (in_array($propExtra['rgxp'], array('date', 'time', 'datim')) && !$propExtra['mandatory'] && is_numeric($varValue) && $varValue == 0) {
         $varValue = '';
     }
     // OH: why not $required = $mandatory always? source: DataContainer 226.
     // OH: the whole prepareForWidget(..) thing is an only mess
     // Widgets should parse the configuration by themselves, depending on what they need.
     $propExtra['required'] = $varValue == '' && $propExtra['mandatory'];
     if ($inputValues) {
         $model = clone $this->model;
         $model->setId($this->model->getId());
         $this->environment->getController()->updateModelFromPropertyBag($model, $inputValues);
     } else {
         $model = $this->model;
     }
     $options = $propInfo->getOptions();
     $event = new GetPropertyOptionsEvent($environment, $model);
     $event->setPropertyName($property);
     $event->setOptions($options);
     $environment->getEventPropagator()->propagate($event::NAME, $event, $environment->getDataDefinition()->getName(), $property);
     if ($event->getOptions() !== $options) {
         $options = $event->getOptions();
     }
     $arrConfig = array('inputType' => $propInfo->getWidgetType(), 'label' => array($propInfo->getLabel(), $propInfo->getDescription()), 'options' => $options, 'eval' => $propExtra);
     if (isset($propExtra['reference'])) {
         $arrConfig['reference'] = $propExtra['reference'];
     }
     $event = new GetAttributesFromDcaEvent($arrConfig, $propInfo->getName(), $varValue, $property, $defName, new DcCompat($environment, $this->model, $property));
     $environment->getEventPropagator()->propagate(ContaoEvents::WIDGET_GET_ATTRIBUTES_FROM_DCA, $event, $environment->getDataDefinition()->getName(), $property);
     $arrPrepared = $event->getResult();
     // Bugfix CS: ajax subpalettes are really broken.
     // Therefore we reset to the default checkbox behaviour here and submit the entire form.
     // This way, the javascript needed by the widget (wizards) will be correctly evaluated.
     if ($arrConfig['inputType'] == 'checkbox' && is_array($GLOBALS['TL_DCA'][$defName]['subpalettes']) && in_array($property, array_keys($GLOBALS['TL_DCA'][$defName]['subpalettes'])) && $arrConfig['eval']['submitOnChange']) {
         $arrPrepared['onclick'] = $arrConfig['eval']['submitOnChange'] ? "Backend.autoSubmit('" . $defName . "')" : '';
     }
     $objWidget = new $strClass($arrPrepared);
     // OH: what is this? source: DataContainer 232.
     $objWidget->currentRecord = $this->model->getId();
     $objWidget->wizard .= $xLabel;
     $event = new ManipulateWidgetEvent($environment, $this->model, $propInfo, $objWidget);
     $environment->getEventPropagator()->propagate($event::NAME, $event, array($defName, $property));
     return $objWidget;
 }
 /**
  * Handle a property in a cloned model.
  *
  * @param ModelInterface        $model        The cloned model.
  *
  * @param PropertyInterface     $property     The property to handle.
  *
  * @param DataProviderInterface $dataProvider The data provider the model originates from.
  *
  * @return void
  */
 private function handleClonedModelProperty(ModelInterface $model, PropertyInterface $property, DataProviderInterface $dataProvider)
 {
     $extra = $property->getExtra();
     $propName = $property->getName();
     // Check doNotCopy.
     if (isset($extra['doNotCopy']) && $extra['doNotCopy'] === true) {
         $model->setProperty($propName, null);
         return;
     }
     // Check uniqueness.
     if (isset($extra['unique']) && $extra['unique'] === true && !$dataProvider->isUniqueValue($propName, $model->getProperty($propName))) {
         // Implicit "do not copy" unique values, they cannot be unique anymore.
         $model->setProperty($propName, null);
     }
 }
示例#26
0
 /**
  * {@inheritdoc}
  */
 public function getMatchCount(ModelInterface $model = null, PropertyValueBag $input = null)
 {
     if (!$this->propertyName) {
         return false;
     }
     if ($input && $input->hasPropertyValue($this->propertyName)) {
         $value = $input->getPropertyValue($this->propertyName);
     } elseif ($model) {
         $value = $model->getProperty($this->propertyName);
     } else {
         return false;
     }
     return $this->strict ? $value === false : !$value ? $this->getWeight() : false;
 }
示例#27
0
 /**
  * {@inheritdoc}
  */
 public function getMatchCount(ModelInterface $model = null, PropertyValueBag $input = null)
 {
     if ($input && $input->hasPropertyValue('attr_id')) {
         $value = $input->getPropertyValue('attr_id');
     } elseif ($model) {
         $value = $model->getProperty('attr_id');
     } else {
         return false;
     }
     return $this->getTypeOfAttribute($value) == $this->getAttributeType() ? $this->getWeight() : false;
 }
示例#28
0
 /**
  * Retrieve the label pattern.
  *
  * @param EnvironmentInterface $environment The translator in use.
  *
  * @param ModelInterface       $model       The filter setting to render.
  *
  * @return string
  */
 protected function getLabelPattern(EnvironmentInterface $environment, ModelInterface $model)
 {
     $translator = $environment->getTranslator();
     $type = $model->getProperty('type');
     $combined = 'typedesc.' . $type;
     if (($resultPattern = $translator->translate($combined, 'tl_metamodel_filtersetting')) == $combined) {
         $resultPattern = $translator->translate('typedesc._default_', 'tl_metamodel_filtersetting');
     }
     return $resultPattern;
 }
示例#29
0
 /**
  * Determine the toggle state of a toggle command.
  *
  * @param ToggleCommandInterface $command The toggle command.
  *
  * @param ModelInterface         $model   The model in scope.
  *
  * @return bool
  */
 private function isTogglerInActiveState($command, $model)
 {
     $dataProvider = $this->environment->getDataProvider($model->getProviderName());
     if ($command instanceof TranslatedToggleCommandInterface && $dataProvider instanceof MultiLanguageDataProviderInterface) {
         $language = $dataProvider->getCurrentLanguage();
         $dataProvider->setCurrentLanguage($command->getLanguage());
         $propModel = $dataProvider->fetch($dataProvider->getEmptyConfig()->setId($model->getId())->setFields($command->getToggleProperty()));
         $dataProvider->setCurrentLanguage($language);
     } else {
         $propModel = $model;
     }
     if ($command->isInverse()) {
         return !$propModel->getProperty($command->getToggleProperty());
     }
     return (bool) $propModel->getProperty($command->getToggleProperty());
 }
 /**
  * {@inheritdoc}
  */
 public function match(ModelInterface $model = null, PropertyValueBag $input = null, PropertyInterface $property = null, LegendInterface $legend = null)
 {
     if ($input && $input->hasPropertyValue($this->propertyName)) {
         $value = $input->getPropertyValue($this->propertyName);
     } elseif ($model) {
         $value = $model->getProperty($this->propertyName);
     } else {
         return false;
     }
     return $this->strict ? $value === $this->propertyValue : $value == $this->propertyValue;
 }