/** * Clear the button if the User is not admin. * * @param GetOperationButtonEvent $event The event. * * @return void */ public function getOperationButton(GetOperationButtonEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel') { return; } $command = $event->getCommand(); if ($command->getName() == 'dca_combine') { $event->setHref(UrlBuilder::fromUrl($event->getHref())->setQueryParameter('id', ModelId::fromValues('tl_metamodel_dca_combine', $event->getModel()->getId())->getSerialized())->getUrl()); } }
/** * {@inheritDoc} * * @throws \InvalidArgumentException When the model id is invalid. */ public function fetchModelFromProvider($modelId, $providerName = null) { if ($providerName === null) { if (is_string($modelId)) { $modelId = ModelId::fromSerialized($modelId); } } else { $modelId = ModelId::fromValues($providerName, $modelId); } if (!$modelId instanceof ModelIdInterface) { throw new \InvalidArgumentException('Invalid model id passed: ' . var_export($modelId, true)); } $dataProvider = $this->getEnvironment()->getDataProvider($modelId->getDataProviderName()); $item = $dataProvider->fetch($dataProvider->getEmptyConfig()->setId($modelId->getId())); return $item; }
/** * Create a new instance. * * @param EnvironmentInterface $environment The environment. */ public function __construct(EnvironmentInterface $environment) { $this->environment = $environment; $this->translator = $environment->getTranslator(); $this->eventDispatcher = $environment->getEventDispatcher(); $this->clipboardItems = $this->calculateClipboardItems(); $dataDefinition = $environment->getDataDefinition(); $basicDefinition = $dataDefinition->getBasicDefinition(); $this->isHierarchical = $basicDefinition::MODE_HIERARCHICAL === $basicDefinition->getMode(); $this->commands = $dataDefinition->getDefinition(Contao2BackendViewDefinitionInterface::NAME)->getModelCommands(); $controller = $environment->getController(); $this->clipboardModels = $controller->getModelsFromClipboardItems($this->clipboardItems); $this->circularModelIds = array(); // We must only check for CUT operation here as pasting copy'ed parents is allowed. $cutItems = array_filter($this->clipboardItems, function ($item) { /** @var ItemInterface $item */ return $item->getAction() === $item::CUT; }); $cutModels = $controller->getModelsFromClipboardItems($cutItems); foreach ($cutModels as $model) { $providerName = $model->getProviderName(); foreach ($controller->assembleAllChildrenFrom($model) as $subModel) { $this->circularModelIds[] = ModelId::fromValues($providerName, $subModel)->getSerialized(); } } if (null !== ViewHelpers::getManualSortingProperty($environment)) { $this->hasPasteButtons = !empty($this->clipboardItems); $this->hasPasteNewButton = empty($this->clipboardItems) && !$this->isHierarchical; } else { $this->hasPasteButtons = false; $this->hasPasteNewButton = false; } }
/** * This method exists only for being compatible when MetaModels are being used as child table from DC_Table context. * * @param string $idParameter The id parameter in use. * * @param array $arrRow The current data row. * * @param string $href The href to be appended. * * @param string $label The operation label. * * @param string $name The operation name. * * @param string $icon The icon path. * * @param string $attributes The button attributes. * * @param string $table The table name. * * @return string */ public function buildChildOperationButton($idParameter, $arrRow, $href, $label, $name, $icon, $attributes, $table) { $dispatcher = $this->getDispatcher(); $modelId = ModelId::fromValues($table, $arrRow['id']); $url = $href . '&' . $idParameter . '=' . $modelId->getSerialized(); // If id parameter different, we have to override it in the URL. if ('id' !== $idParameter) { $url .= '&id='; } $urlEvent = new AddToUrlEvent($url); $dispatcher->dispatch(ContaoEvents::BACKEND_ADD_TO_URL, $urlEvent); $url = $urlEvent->getUrl(); // If id parameter different, we have to clean out the id in the URL now. if ('id' !== $idParameter) { $url = preg_replace('#(&)id=(?:&)?#', '$1', $url); } $imageEvent = new GenerateHtmlEvent($icon, $label); $dispatcher->dispatch(ContaoEvents::IMAGE_GET_HTML, $imageEvent); $title = sprintf($label ?: $name, $arrRow['id']); return '<a href="' . $url . '" title="' . specialchars($title) . '"' . $attributes . '>' . $imageEvent->getHtml() . '</a> '; }
/** * {@inheritDoc} */ public function fetchModelFromProvider($modelId, $providerName = null) { if ($providerName === null) { if (is_string($modelId)) { $modelId = ModelId::fromSerialized($modelId); } } else { $modelId = ModelId::fromValues($providerName, $modelId); } $dataProvider = $this->getEnvironment()->getDataProvider($modelId->getDataProviderName()); $item = $dataProvider->fetch($dataProvider->getEmptyConfig()->setId($modelId->getId())); return $item; }
/** * Get the bread crumb elements. * * @param GetBreadcrumbEvent $event This event. * * @return void */ public function getBreadCrumb(GetBreadcrumbEvent $event) { $environment = $event->getEnvironment(); $dataDefinition = $environment->getDataDefinition(); $inputProvider = $environment->getInputProvider(); $translator = $environment->getTranslator(); $newsletterParameter = $inputProvider->hasParameter('act') ? 'id' : 'pid'; if ($dataDefinition->getName() !== 'orm_avisota_message' || !$inputProvider->hasParameter($newsletterParameter)) { return; } $newsletterModelId = ModelId::fromSerialized($inputProvider->getParameter($newsletterParameter)); if ($newsletterModelId->getDataProviderName() !== 'orm_avisota_message') { return; } $elements = $event->getElements(); $urlNewsletterBuilder = new UrlBuilder(); $urlNewsletterBuilder->setPath('contao/main.php')->setQueryParameter('do', $inputProvider->getParameter('do'))->setQueryParameter('ref', TL_REFERER_ID); $elements[] = array('icon' => 'assets/avisota/message/images/newsletter.png', 'text' => $translator->translate('avisota_newsletter.0', 'MOD'), 'url' => $urlNewsletterBuilder->getUrl()); $dataProvider = $environment->getDataProvider($newsletterModelId->getDataProviderName()); $model = $dataProvider->fetch($dataProvider->getEmptyConfig()->setId($newsletterModelId->getId())); $newsletter = $model->getEntity(); $newsletterCategory = $newsletter->getCategory(); $urlNewsletterBuilder = new UrlBuilder(); $urlNewsletterBuilder->setPath('contao/main.php')->setQueryParameter('do', $inputProvider->getParameter('do'))->setQueryParameter('table', $newsletterModelId->getDataProviderName())->setQueryParameter('pid', ModelId::fromValues('orm_avisota_message_category', $newsletterCategory->getId())->getSerialized())->setQueryParameter('ref', TL_REFERER_ID); $elements[] = array('text' => $newsletterCategory->getTitle(), 'url' => $urlNewsletterBuilder->getUrl()); $event->setElements($elements); }
/** * Return the edit wizard. * * @param \DC_Table $dataContainer The data container. * * @param string $table The table name. * * @return string * * @SuppressWarnings(PHPMD.Superglobals) * @SuppressWarnings(PHPMD.CamelCaseVariableName) */ public function editRenderSettingButton(\DC_Table $dataContainer, $table) { if ($dataContainer->value < 1) { return ''; } $event = new GenerateHtmlEvent('alias.gif', $GLOBALS['TL_LANG'][$table]['editrendersetting'][0], 'style="vertical-align:top"'); $dispatcher = $this->getEventDispatcher(); $dispatcher->dispatch(ContaoEvents::IMAGE_GET_HTML, $event); $url = BackendUrlBuilder::fromUrl('contao/main.php?do=metamodels&table=tl_metamodel_rendersetting')->setQueryParameter('pid', ModelId::fromValues('tl_metamodel_rendersettings', $dataContainer->value)->getSerialized()); return sprintf('<a href="%s" title="%s" style="padding-left:3px">%s</a>', $url->getUrl(), sprintf(specialchars($GLOBALS['TL_LANG'][$table]['editrendersetting'][1]), $dataContainer->value), $event->getHtml()); }
/** * Retrieve a list of html buttons to use in the top panel (submit area). * * @param ModelInterface $parentModel The parent model. * * @return string */ protected function getHeaderButtons($parentModel) { $environment = $this->getEnvironment(); $definition = $environment->getDataDefinition(); $clipboard = $environment->getClipboard(); $basicDefinition = $definition->getBasicDefinition(); $headerButtons = array(); if ($this->isSelectModeActive()) { return ''; } $dispatcher = $environment->getEventDispatcher(); $objConfig = $this->getEnvironment()->getBaseConfigRegistry()->getBaseConfig(); $this->getPanel()->initialize($objConfig); $sorting = $objConfig->getSorting(); $headerButtons['editHeader'] = $this->getHeaderEditButtons($parentModel); $filter = new Filter(); $filter->andModelIsFromProvider($basicDefinition->getDataProvider()); if ($parentDataProviderName = $basicDefinition->getParentDataProvider()) { $filter->andParentIsFromProvider($parentDataProviderName); } else { $filter->andHasNoParent(); } if ($sorting && $clipboard->isEmpty($filter) && $basicDefinition->isCreatable()) { /** @var AddToUrlEvent $urlEvent */ $urlEvent = $dispatcher->dispatch(ContaoEvents::BACKEND_ADD_TO_URL, new AddToUrlEvent('act=edit&pid=' . ModelId::fromModel($parentModel)->getSerialized())); /** @var GenerateHtmlEvent $imageEvent */ $imageEvent = $dispatcher->dispatch(ContaoEvents::IMAGE_GET_HTML, new GenerateHtmlEvent('new.gif', $this->translate('pastenew.0', $definition->getName()))); $headerButtons['pasteNew'] = sprintf('<a href="%s" title="%s" onclick="Backend.getScrollOffset()">%s</a>', $urlEvent->getUrl(), specialchars($this->translate('pastenew.1', $definition->getName())), $imageEvent->getHtml()); } $filter = new Filter(); $filter->andModelIsFromProvider($basicDefinition->getDataProvider()); $filter->andParentIsFromProvider($basicDefinition->getParentDataProvider()); if ($sorting && $clipboard->isNotEmpty($filter)) { $allowPasteTop = ViewHelpers::getManualSortingProperty($this->environment); if (!$allowPasteTop) { $subFilter = new Filter(); $subFilter->andActionIsNotIn(array(ItemInterface::COPY, ItemInterface::DEEP_COPY)); $subFilter->andParentIsNot(ModelId::fromModel($parentModel)); $subFilter->orActionIsIn(array(ItemInterface::COPY, ItemInterface::DEEP_COPY)); $filter = new Filter(); $filter->andModelIsFromProvider($basicDefinition->getDataProvider()); $filter->andParentIsFromProvider($basicDefinition->getParentDataProvider()); $filter->andSub($subFilter); $allowPasteTop = (bool) $clipboard->fetch($filter); } if ($allowPasteTop) { /** @var AddToUrlEvent $urlEvent */ $urlEvent = $dispatcher->dispatch(ContaoEvents::BACKEND_ADD_TO_URL, new AddToUrlEvent('act=paste' . '&pid=' . ModelId::fromModel($parentModel)->getSerialized() . '&after=' . ModelId::fromValues($basicDefinition->getDataProvider(), '0')->getSerialized())); /** @var GenerateHtmlEvent $imageEvent */ $imageEvent = $dispatcher->dispatch(ContaoEvents::IMAGE_GET_HTML, new GenerateHtmlEvent('pasteafter.gif', $this->translate('pasteafter.0', $definition->getName()), 'class="blink"')); $headerButtons['pasteAfter'] = sprintf('<a href="%s" title="%s" onclick="Backend.getScrollOffset()">%s</a>', $urlEvent->getUrl(), specialchars($this->translate('pasteafter.0', $definition->getName())), $imageEvent->getHtml()); } else { /** @var GenerateHtmlEvent $imageEvent */ $imageEvent = $dispatcher->dispatch(ContaoEvents::IMAGE_GET_HTML, new GenerateHtmlEvent('pasteafter_.gif', $this->translate('pasteafter.0', $definition->getName()), 'class="blink"')); $headerButtons['pasteAfter'] = $imageEvent->getHtml(); } } return implode(' ', $headerButtons); }
/** * Test remove() method. * * @return void */ public function testRemoveRemovesOnlyOneOfModel() { $modelId = ModelId::fromValues('dummy-provider', '15'); $otherModelId = ModelId::fromValues('dummy-provider', '16'); $clipboard = new Clipboard(); $filterGetAll = new Filter(); $cutItem = new Item(Item::CUT, null, $modelId); $copyItem = new Item(Item::COPY, null, $modelId); $copyOtherItem = new Item(Item::COPY, null, $otherModelId); $clipboard->push($cutItem); $clipboard->push($copyItem); $clipboard->push($copyOtherItem); $clipboard->remove($copyItem); $this->assertTrue($clipboard->hasId($modelId)); $this->assertTrue($clipboard->hasId($otherModelId)); $items = $clipboard->fetch($filterGetAll); $this->assertCount(2, $items); $this->assertArraySubset([$cutItem, $copyOtherItem], $items); }
/** * Create an serialized id from the passed values. * * @param string $dataProviderName The data provider name. * * @param mixed $modelId The id. * * @return string */ public function seralizeId($dataProviderName, $modelId) { return ModelId::fromValues($dataProviderName, $modelId)->getSerialized(); }
/** * Get the bread crumb elements. * * @param GetBreadcrumbEvent $event This event. * * @return void * * @SuppressWarnings(PHPMD.LongVariable) */ public function getBreadCrumb(GetBreadcrumbEvent $event) { $environment = $event->getEnvironment(); $dataDefinition = $environment->getDataDefinition(); $inputProvider = $environment->getInputProvider(); $translator = $environment->getTranslator(); if ($dataDefinition->getName() !== 'orm_avisota_message_content' || (!$inputProvider->hasParameter('act') || $inputProvider->getParameter('act') === 'create') || !$inputProvider->hasParameter('id')) { return; } $messageContentModelId = ModelId::fromSerialized($inputProvider->getParameter('id')); if ($messageContentModelId->getDataProviderName() !== 'orm_avisota_message_content') { return; } $elements = $event->getElements(); $dataProvider = $environment->getDataProvider($messageContentModelId->getDataProviderName()); $model = $dataProvider->fetch($dataProvider->getEmptyConfig()->setId($messageContentModelId->getId())); $messageContent = $model->getEntity(); $message = $messageContent->getMessage(); $messageCategory = $message->getCategory(); $urlNewsletterBuilder = new UrlBuilder(); $urlNewsletterBuilder->setPath('contao/main.php')->setQueryParameter('do', $inputProvider->getParameter('do'))->setQueryParameter('ref', TL_REFERER_ID); $elements[] = array('icon' => 'assets/avisota/message/images/newsletter.png', 'text' => $translator->translate('avisota_newsletter.0', 'MOD'), 'url' => $urlNewsletterBuilder->getUrl()); global $container; $entityManager = $container['doctrine.orm.entityManager']; $messageMeta = $entityManager->getClassMetadata(get_class($message)); $messageCategoryMeta = $entityManager->getClassMetadata(get_class($messageCategory)); $messageContentMeta = $entityManager->getClassMetadata(get_class($messageContent)); $urlMessageCategoryBuilder = new UrlBuilder(); $urlMessageCategoryBuilder->setPath('contao/main.php')->setQueryParameter('do', $inputProvider->getParameter('do'))->setQueryParameter('table', $messageMeta->getTableName())->setQueryParameter('pid', ModelId::fromValues($messageCategoryMeta->getTableName(), $messageCategory->getId())->getSerialized())->setQueryParameter('ref', TL_REFERER_ID); $elements[] = array('text' => $messageCategory->getTitle(), 'url' => $urlMessageCategoryBuilder->getUrl()); $urlMessageBuilder = new UrlBuilder(); $urlMessageBuilder->setPath('contao/main.php')->setQueryParameter('do', $inputProvider->getParameter('do'))->setQueryParameter('table', $messageContentMeta->getTableName())->setQueryParameter('pid', ModelId::fromValues($messageMeta->getTableName(), $message->getId())->getSerialized())->setQueryParameter('ref', TL_REFERER_ID); $elements[] = array('text' => $message->getSubject(), 'url' => $urlMessageBuilder->getUrl()); $event->setElements($elements); }