/** * Default handler for formatting a model. * * @param FormatModelLabelEvent $event The event. * * @return void */ public function handleFormatModelLabel(FormatModelLabelEvent $event) { $environment = $event->getEnvironment(); $model = $event->getModel(); $dataDefinition = $environment->getDataDefinition(); /** @var Contao2BackendViewDefinitionInterface $viewSection */ $viewSection = $dataDefinition->getDefinition(Contao2BackendViewDefinitionInterface::NAME); $listing = $viewSection->getListingConfig(); $properties = $dataDefinition->getPropertiesDefinition(); $formatter = $listing->getLabelFormatter($model->getProviderName()); $sorting = ViewHelpers::getGroupingMode($environment); $sortingDefinition = $sorting['sorting']; $firstSorting = ''; if ($sortingDefinition) { /** @var GroupAndSortingDefinitionInterface $sortingDefinition */ foreach ($sortingDefinition as $information) { /** @var GroupAndSortingInformationInterface $information */ if ($information->getProperty()) { $firstSorting = reset($sorting); break; } } } $args = array(); foreach ($formatter->getPropertyNames() as $propertyName) { if ($properties->hasProperty($propertyName)) { $property = $properties->getProperty($propertyName); $args[$propertyName] = (string) ViewHelpers::getReadableFieldValue($environment, $property, $model); } else { $args[$propertyName] = '-'; } } $modelToLabelEvent = new ModelToLabelEvent($environment, $model); $modelToLabelEvent->setArgs($args)->setLabel($formatter->getFormat())->setFormatter($formatter); $environment->getEventDispatcher()->dispatch(ModelToLabelEvent::NAME, $modelToLabelEvent); $label = array(); // Add columns. if ($listing->getShowColumns()) { $fields = $formatter->getPropertyNames(); $args = $modelToLabelEvent->getArgs(); if (!is_array($args)) { $label[] = array('colspan' => count($fields), 'class' => 'tl_file_list col_1', 'content' => $args); } else { foreach ($fields as $j => $propertyName) { $label[] = array('colspan' => 1, 'class' => 'tl_file_list col_' . $j . ($propertyName == $firstSorting ? ' ordered_by' : ''), 'content' => $args[$propertyName] != '' ? $args[$propertyName] : '-'); } } } else { if (!is_array($modelToLabelEvent->getArgs())) { $string = $modelToLabelEvent->getArgs(); } else { $string = vsprintf($modelToLabelEvent->getLabel(), $modelToLabelEvent->getArgs()); } if ($formatter->getMaxLength() !== null && strlen($string) > $formatter->getMaxLength()) { $string = substr($string, 0, $formatter->getMaxLength()); } $label[] = array('colspan' => null, 'class' => 'tl_file_list', 'content' => $string); } $event->setLabel($label); }
/** * Render the html for the input screen. * * @param ModelToLabelEvent $event The event. * * @return void */ public function modelToLabel(ModelToLabelEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel_dca') { return; } $environment = $event->getEnvironment(); $translator = $environment->getTranslator(); $model = $event->getModel(); if (!$model->getProperty('isdefault')) { return; } $event->setArgs(array_merge($event->getArgs(), array($translator->translate('MSC.fallback'))))->setLabel(sprintf('%s <span style="color:#b3b3b3; padding-left:3px">[%%s]</span>', $event->getLabel())); }
/** * Format a model accordingly to the current configuration. * * Returns either an array when in tree mode or a string in (parented) list mode. * * @param ModelInterface $model The model that shall be formatted. * * @param bool $treeMode Flag if we are running in tree mode or not (optional, default: true). * * @return array */ public function formatModel(ModelInterface $model, $treeMode = true) { /** @var ListingConfigInterface $listing */ $definition = $this->getEnvironment()->getDataDefinition(); $listing = $definition->getDefinition(Contao2BackendViewDefinitionInterface::NAME)->getListingConfig(); $properties = $definition->getPropertiesDefinition(); $sorting = array_keys((array) $listing->getDefaultSortingFields()); $firstSorting = reset($sorting); $formatter = $this->getFormatter($model, $treeMode); $args = array(); foreach ($formatter->getPropertyNames() as $propertyName) { if ($properties->hasProperty($propertyName)) { $args[$propertyName] = (string) $model->getProperty($propertyName); } else { $args[$propertyName] = '-'; } } $event = new ModelToLabelEvent($this->getEnvironment(), $model); $event->setArgs($args)->setLabel($formatter->getFormat())->setFormatter($formatter); $this->getEnvironment()->getEventDispatcher()->dispatch($event::NAME, $event); $arrLabel = array(); // Add columns. if ($listing->getShowColumns()) { $fields = $formatter->getPropertyNames(); $args = $event->getArgs(); if (!is_array($args)) { $arrLabel[] = array('colspan' => count($fields), 'class' => 'tl_file_list col_1', 'content' => $args); } else { foreach ($fields as $j => $propertyName) { $arrLabel[] = array('colspan' => 1, 'class' => 'tl_file_list col_' . $j . ($propertyName == $firstSorting ? ' ordered_by' : ''), 'content' => $args[$propertyName] != '' ? $args[$propertyName] : '-'); } } } else { if (!is_array($event->getArgs())) { $string = $event->getArgs(); } else { $string = vsprintf($event->getLabel(), $event->getArgs()); } if ($formatter->getMaxLength() !== null && strlen($string) > $formatter->getMaxLength()) { $string = substr($string, 0, $formatter->getMaxLength()); } $arrLabel[] = array('colspan' => null, 'class' => 'tl_file_list', 'content' => $string); } return $arrLabel; }
/** * Render the current item using the specified render setting. * * @param ModelToLabelEvent $event The event. * * @return void */ public static function render(ModelToLabelEvent $event) { $environment = $event->getEnvironment(); /** @var IMetaModelDataDefinition $definition */ $definition = $environment->getDataDefinition(); /** @var Contao2BackendViewDefinitionInterface $viewSection */ $viewSection = $definition->getDefinition(Contao2BackendViewDefinitionInterface::NAME); $listing = $viewSection->getListingConfig(); /** @var Model $model */ $model = $event->getModel(); if (!$model instanceof Model) { return; } $nativeItem = $model->getItem(); $metaModel = $nativeItem->getMetaModel(); $renderSetting = $metaModel->getServiceContainer()->getRenderSettingFactory()->createCollection($metaModel, $definition->getMetaModelDefinition()->getActiveRenderSetting()); if (!$renderSetting) { return; } $data = array($nativeItem->parseValue('html5', $renderSetting)); if ($listing->getShowColumns()) { $event->setArgs($data[0]['html5']); return; } $template = new Template($renderSetting->get('template')); $renderSetting = self::removeInvariantAttributes($nativeItem, $renderSetting); $template->setData(array('settings' => $renderSetting, 'items' => new Items(array($nativeItem)), 'view' => $renderSetting, 'data' => $data)); $event->setArgs(array($template->parse('html5'))); }