/** * Translates the values of the jumpTo entries into the real array. * * @param DecodePropertyValueForWidgetEvent $event The event. * * @return void */ public function decodeJumpToValue(DecodePropertyValueForWidgetEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel_rendersettings' || $event->getProperty() !== 'jumpTo') { return; } $propInfo = $event->getEnvironment()->getDataDefinition()->getPropertiesDefinition()->getProperty($event->getProperty()); $value = deserialize($event->getValue(), true); if (!$value) { return; } $extra = $propInfo->getExtra(); $newValues = array(); $arrLanguages = $extra['columnFields']['langcode']['options']; foreach (array_keys($arrLanguages) as $key) { $newValue = ''; $intFilter = 0; if ($value) { foreach ($value as $arr) { if (!is_array($arr)) { break; } // Set the new value and exit the loop. if (array_search($key, $arr) !== false) { $newValue = '{{link_url::' . $arr['value'] . '}}'; $intFilter = $arr['filter']; break; } } } // Build the new array. $newValues[] = array('langcode' => $key, 'value' => $newValue, 'filter' => $intFilter); } $event->setValue($newValues); }
/** * 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; }
/** * Convert uuid to file source to see the right source in the rich text editor. * After convert this back to the original source. * * @param DecodePropertyValueForWidgetEvent $event The event to handle. * * @return void */ public function convertUuidToFileSource(DecodePropertyValueForWidgetEvent $event) { $environment = $event->getEnvironment(); $dataDefinition = $environment->getDataDefinition(); $propertiesDefinition = $dataDefinition->getPropertiesDefinition(); $property = $propertiesDefinition->getProperty($event->getProperty()); if (!array_key_exists('rte', $property->getExtra()) || strpos($property->getExtra()['rte'], 'tiny') !== 0) { return; } $event->setValue(StringUtil::insertTagToSrc($event->getValue())); }
/** * 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; }
/** * Decode a value from native data of the data provider to the widget via event. * * @param string $property The property. * * @param mixed $value The value of the property. * * @return mixed */ public function decodeValue($property, $value) { $environment = $this->getEnvironment(); $event = new DecodePropertyValueForWidgetEvent($environment, $this->model); $event->setProperty($property)->setValue($value); $environment->getEventPropagator()->propagate($event::NAME, $event, array($environment->getDataDefinition()->getName(), $property)); return $event->getValue(); }
/** * Update the value in the event. * * @param DecodePropertyValueForWidgetEvent $event The event being emitted. * * @param mixed $value The decoded value. * * @return void */ public function update($event, $value) { $event->setValue($value); }
/** * Decode the title value. * * @param DecodePropertyValueForWidgetEvent $event The event. * * @return void */ public function decodeLegendTitleValue(DecodePropertyValueForWidgetEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel_dcasetting' || $event->getProperty() !== 'legendtitle') { return; } $metaModel = $this->getMetaModelFromModel($event->getModel()); $values = Helper::decodeLangArray($event->getValue(), $metaModel); $event->setValue($values); }
/** * Translates an attribute id to a generated alias {@see getAttributeNames()}. * * @param DecodePropertyValueForWidgetEvent $event The event. * * @return void */ public function decodeAttributeIdValue(DecodePropertyValueForWidgetEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel_filtersetting' || $event->getProperty() !== 'attr_id') { return; } $model = $event->getModel(); $metaModel = $this->getMetaModel($model); $value = $event->getValue(); if (!($metaModel && $value)) { return; } $attribute = $metaModel->getAttributeById($value); if ($attribute) { $event->setValue($metaModel->getTableName() . '_' . $attribute->getColName()); } }
/** * Decode a value from native data of the data provider to the widget via event. * * @param EnvironmentInterface $environment The environment. * * @param ModelInterface $model The model. * * @param string $property The property. * * @param mixed $value The value of the property. * * @return mixed */ private static function decodeValue($environment, $model, $property, $value) { $event = new DecodePropertyValueForWidgetEvent($environment, $model); $event->setProperty($property)->setValue($value); $environment->getEventDispatcher()->dispatch(sprintf('%s', $event::NAME), $event); return $event->getValue(); }
/** * Decode the given value from a serialized language array into the real language array. * * @param DecodePropertyValueForWidgetEvent $event The event. * * @return void */ public function decodeDescriptionValue(DecodePropertyValueForWidgetEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel_attribute' || $event->getProperty() !== 'description') { return; } $this->decodeValue($event); }
/** * Decode a language array. * * @param DecodePropertyValueForWidgetEvent $event The event. * * @return void */ public function fixLanguageLangArray(DecodePropertyValueForWidgetEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel' || $event->getProperty() !== 'languages') { return; } $this->fixLangArray($event); }
/** * 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) { /* FIXME TEMPORARY WORKAROUND! To be fixed in the core: @see \Widget::getAttributesFromDca() */ $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 == '' && !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(); // 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' && 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; }
/** * Translates an attribute id to a generated alias {@see getAttributeNames()}. * * @param DecodePropertyValueForWidgetEvent $event The event. * * @return void */ public function decodeAttributeIdValue(DecodePropertyValueForWidgetEvent $event) { $isAllowed = $this->isAllowedContext($event->getEnvironment()->getDataDefinition(), $event->getProperty(), $event->getModel()); if (!$isAllowed) { return; } $model = $event->getModel(); $metaModel = $this->getMetaModel($model); $value = $event->getValue(); if (!($metaModel && $value)) { return; } $attribute = $metaModel->getAttributeById($value); if ($attribute) { $event->setValue($metaModel->getTableName() . '_' . $attribute->getColName()); } }
/** * The subscriber creates the timestamp from the widget value. * * @param string $format The given date format. * @param string $value The given date example * * @dataProvider dataProvider * @test */ public function it_creates_timestamp_from_widget_value($format, $value) { $dateTime = \DateTime::createFromFormat($format, $value); $timestamp = $dateTime->getTimestamp(); $attribute = $this->mockAttribute($format); $attribute->expects($this->any())->method('widgetToValue')->will($this->returnValue($timestamp)); $model = $this->mockModelWithAttribute($attribute); $event = new DecodePropertyValueForWidgetEvent($this->mockEnvironment(), $model); $event->setProperty('date'); $event->setValue($timestamp); $this->eventDispatcher->expects($this->atLeastOnce())->method('dispatch')->with($this->anything(), $this->callback(function (ParseDateEvent $event) use($value) { $event->setResult($value); return true; })); $this->backendSubscriber->handleDecodePropertyValueForWidgetEvent($event); $this->assertEquals($value, $event->getValue()); }
/** * Decode the values into a real table array. * * @param DecodePropertyValueForWidgetEvent $event The event. * * @return void * * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function loadValues(DecodePropertyValueForWidgetEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel_attribute' || $event->getProperty() !== 'translatedtabletext_cols') { return; } $objMetaModel = $this->getMetaModelById($event->getModel()->getProperty('pid')); $arrLanguages = $objMetaModel->getAvailableLanguages(); // Check model and input for the cols and get the max value. $intModelCols = $event->getModel()->getProperty('tabletext_quantity_cols'); $intInputCols = $event->getEnvironment()->getInputProvider()->getValue('tabletext_quantity_cols'); $intCols = max(intval($intModelCols), intval($intInputCols)); $varValue = $event->getValue(); // Kick unused lines. foreach ((array) $varValue as $strLanguage => $arrRows) { if (count($arrRows) > $intCols) { $varValue[$strLanguage] = array_slice($varValue[$strLanguage], 0, $intCols); } } $arrLangValues = deserialize($varValue); if (!$objMetaModel->isTranslated()) { // If we have an array, return the first value and exit, if not an array, return the value itself. if (is_array($arrLangValues)) { $event->setValue($arrLangValues[key($arrLangValues)]); } else { $event->setValue($arrLangValues); } return; } $arrOutput = array(); // Sort like in MetaModel definition. if ($arrLanguages) { foreach ($arrLanguages as $strLangCode) { if (is_array($arrLangValues)) { $varSubValue = $arrLangValues[$strLangCode]; } else { $varSubValue = $arrLangValues; } if (is_array($varSubValue)) { $arrOutput[] = array('langcode' => $strLangCode, 'rowLabels' => $varSubValue); } else { $arrOutput[] = array('langcode' => $strLangCode, 'value' => $varSubValue); } } } $event->setValue(serialize($arrOutput)); }
/** * Make email lowercase. * * @param DecodePropertyValueForWidgetEvent $event */ public function decodeEmail(DecodePropertyValueForWidgetEvent $event) { if ($event->getModel()->getProviderName() != 'orm_avisota_recipient' || $event->getProperty() != 'email') { return; } $event->setValue(strtolower($event->getValue())); }
/** * Decode a value from native data of the data provider to the widget via event. * * @param string $property The property. * * @param mixed $value The value of the property. * * @return mixed */ public function decodeValue($property, $value) { $environment = $this->getEnvironment(); $event = new DecodePropertyValueForWidgetEvent($environment, $this->model); $event->setProperty($property)->setValue($value); $environment->getEventDispatcher()->dispatch(EncodePropertyValueFromWidgetEvent::NAME, $event); return $event->getValue(); }
/** * Translates an value to a generated alias to allow numeric values. * * @param DecodePropertyValueForWidgetEvent $event The event. * * @return void */ public function decodeValueValue(DecodePropertyValueForWidgetEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel_dcasetting_condition' || $event->getProperty() !== 'value') { return; } if (is_array($event->getValue())) { $values = array(); foreach ($event->getValue() as $value) { $values[] = 'value_' . $value; } // Cut off the 'value_' prefix. $event->setValue($values); } else { $event->setValue('value_' . $event->getValue()); } }
/** * Translates an attribute id to a generated alias. * * @param DecodePropertyValueForWidgetEvent $event The event. * * @return void */ public function decodeAttrValue(DecodePropertyValueForWidgetEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel_dca_sortgroup' || $event->getProperty() !== 'rendergroupattr' && $event->getProperty() !== 'rendersortattr') { return; } $metaModel = self::getMetaModel($event->getEnvironment()); $value = $event->getValue(); if (!($metaModel && $value)) { return; } $attribute = $metaModel->getAttributeById($value); if ($attribute) { $event->setValue($metaModel->getTableName() . '_' . $attribute->getColName()); } }
/** * Get the supported attribute or null. * * @param EncodePropertyValueFromWidgetEvent|DecodePropertyValueForWidgetEvent $event The subscribed event. * * @return Timestamp|null */ private function getSupportedAttribute($event) { $model = $event->getModel(); // Not a metamodel model. if (!$model instanceof Model) { return null; } $property = $event->getProperty(); $attribute = $model->getItem()->getAttribute($property); if ($attribute instanceof Timestamp) { return $attribute; } return null; }