/** * 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']); }
/** * 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; }
/** * 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); }
/** * {@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); }
/** * 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; }
/** * 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); }
/** * 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); } }
/** * 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(); }
/** * 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); } } }
/** * 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); } }
/** * 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; }
/** * {@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; }
/** * 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() . '&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(); }
/** * 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; }
/** * 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); } }
/** * {@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; }
/** * {@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; }
/** * 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; }
/** * 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; }