Example #1
0
 /**
  * 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()));
 }
Example #4
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;
 }
Example #5
0
 /**
  * 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);
 }
Example #7
0
 /**
  * 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);
 }
Example #8
0
 /**
  * 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());
     }
 }
Example #9
0
 /**
  * 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();
 }
Example #10
0
 /**
  * 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);
 }
Example #11
0
 /**
  * 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);
 }
Example #12
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) {
         /*
             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;
 }
Example #13
0
 /**
  * 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();
 }
Example #18
0
 /**
  * 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());
     }
 }
Example #19
0
 /**
  * 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;
 }