/** * Fetch the options for a certain property. * * @param EnvironmentInterface $environment The environment. * * @param ModelInterface $model The model. * * @param PropertyInterface $property The property. * * @return array */ protected function getOptions($environment, $model, $property) { $options = $property->getOptions(); $event = new GetPropertyOptionsEvent($environment, $model); $event->setPropertyName($property->getName()); $event->setOptions($options); $environment->getEventPropagator()->propagate($event::NAME, $event, $environment->getDataDefinition()->getName(), $property->getName()); if ($event->getOptions() !== $options) { $options = $event->getOptions(); } return $options; }
/** * Fetch the options for a certain property. * * @param EnvironmentInterface $environment The environment. * * @param ModelInterface $model The model. * * @param PropertyInterface $property The property. * * @return array */ protected static function getOptions($environment, $model, $property) { $options = $property->getOptions(); $event = new GetPropertyOptionsEvent($environment, $model); $event->setPropertyName($property->getName()); $event->setOptions($options); $environment->getEventDispatcher()->dispatch(sprintf('%s', $event::NAME), $event); if ($event->getOptions() !== $options) { $options = $event->getOptions(); } return $options; }
/** * Get special labels. * * @param PropertyInterface $propInfo The property for which the X label shall be generated. * * @param ModelInterface $model The model. * * @return string */ protected function getOptionsForWidget($propInfo, $model) { if (!$this->isGetOptionsAllowed($propInfo)) { return null; } $environment = $this->getEnvironment(); $dispatcher = $environment->getEventDispatcher(); $options = $propInfo->getOptions(); $event = new GetPropertyOptionsEvent($environment, $model); $event->setPropertyName($propInfo->getName()); $event->setOptions($options); $dispatcher->dispatch(GetPropertyOptionsEvent::NAME, $event); if ($event->getOptions() !== $options) { return $event->getOptions(); } return $options; }
/** * 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; }
/** * Get special labels. * * @param EnvironmentInterface $environment The environment. * * @param PropertyInterface $propInfo The property for which the options shall be retrieved. * * @param ModelInterface $model The model. * * @return string */ private function getOptionsForWidget(EnvironmentInterface $environment, PropertyInterface $propInfo, ModelInterface $model) { $dispatcher = $environment->getEventDispatcher(); $options = $propInfo->getOptions(); $event = new GetPropertyOptionsEvent($environment, $model); $event->setPropertyName($propInfo->getName()); $event->setOptions($options); $dispatcher->dispatch(GetPropertyOptionsEvent::NAME, $event); if ($event->getOptions() !== $options) { return $event->getOptions(); } return $options; }
/** * Obtain the values of a property within a dc-general instance. * * @param IMetaModel $metaModel The metamodel instance to obtain the values from. * * @param EnvironmentInterface $environment The environment used in the input screen table dc-general. * * @param IAttribute $attribute The attribute to obtain the values for. * * @return array */ private function getOptionsViaDcGeneral($metaModel, $environment, $attribute) { $factory = new DcGeneralFactory(); $dcGeneral = $factory->setContainerName($metaModel->getTableName())->setEventDispatcher($environment->getEventDispatcher())->setTranslator($environment->getTranslator())->createDcGeneral(); $subEnv = $dcGeneral->getEnvironment(); $optEv = new GetPropertyOptionsEvent($subEnv, $subEnv->getDataProvider()->getEmptyModel()); $optEv->setPropertyName($attribute->getColName()); $subEnv->getEventDispatcher()->dispatch(GetPropertyOptionsEvent::NAME, $optEv); $options = $optEv->getOptions(); return $options; }