/** * Generate the paste button. * * @param GetPasteButtonEvent $event The event. * * @return void */ public function generatePasteButton(GetPasteButtonEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel_filtersetting') { return; } $environment = $event->getEnvironment(); $model = $event->getModel(); $clipboard = $environment->getClipboard(); $filter = new Filter(); $filter->andModelIs(ModelId::fromModel($model))->andActionIs($clipboard::MODE_CUT); // Disable all buttons if there is a circular reference. if ($event->isCircularReference() || !$clipboard->isEmpty($filter)) { $event->setPasteAfterDisabled(true)->setPasteIntoDisabled(true); return; } $factory = $this->getServiceContainer()->getFilterFactory()->getTypeFactory($model->getProperty('type')); // If setting does not support children, omit them. if ($model->getId() && !($factory && $factory->isNestedType())) { $event->setPasteIntoDisabled(true); } }
/** * Render the paste after button. * * @param GetPasteButtonEvent $event The event that has been triggered. * * @return string */ private function renderPasteAfterButton(GetPasteButtonEvent $event) { if (null !== ($value = $event->getHtmlPasteAfter())) { return $value; } $label = $this->translate('pasteafter.0'); if ($event->isPasteAfterDisabled()) { return $this->renderImageAsHtml('pasteafter_.gif', $label, 'class="blink"'); } if ('pasteafter.1' !== ($opDesc = $this->translate('pasteafter.1'))) { $title = sprintf($opDesc, $event->getModel()->getId()); } else { $title = sprintf('%s id %s', $label, $event->getModel()->getId()); } return sprintf(' <a href="%s" title="%s" onclick="Backend.getScrollOffset()">%s</a>', $event->getHrefAfter(), specialchars($title), $this->renderImageAsHtml('pasteafter.gif', $label, 'class="blink"')); }
/** * Generate the paste button. * * @param GetPasteButtonEvent $event The event. * * @return void * * @SuppressWarnings(PHPMD.Superglobals) * @SuppressWarnings(PHPMD.CamelCaseVariableName) */ public function generatePasteButton(GetPasteButtonEvent $event) { if ($event->getEnvironment()->getDataDefinition()->getName() !== 'tl_metamodel_dcasetting_condition') { return; } $environment = $event->getEnvironment(); $model = $event->getModel(); $clipboard = $environment->getClipboard(); // Disable all buttons if there is a circular reference. if ($clipboard->fetch(Filter::create()->andActionIs(ItemInterface::CUT)->andModelIs(ModelId::fromModel($model)))) { $event->setPasteAfterDisabled(true)->setPasteIntoDisabled(true); return; } $flags = $GLOBALS['METAMODELS']['inputscreen_conditions'][$model->getProperty('type')]; // If setting does not support children, omit them. if ($model->getId() && !$flags['nestingAllowed']) { $event->setPasteIntoDisabled(true); return; } if (isset($flags['maxChildren']) && count($event->getEnvironment()->getController()->assembleAllChildrenFrom($model)) > $flags['maxChildren']) { $event->setPasteIntoDisabled(true); } }
/** * Handle the paste into and after buttons. * * @param GetPasteButtonEvent $event The event. * * @return void * * @throws \RuntimeException When more than one model is contained within the clipboard. */ public function handle(GetPasteButtonEvent $event) { $this->circularReference = $event->isCircularReference(); $this->environment = $event->getEnvironment(); $this->provider = $this->environment->getDataProvider(); $this->providerName = $this->provider->getEmptyModel()->getProviderName(); $clipboard = $this->environment->getClipboard(); $this->currentModel = $event->getModel(); $this->disablePI = true; $this->disablePA = true; // Only run for a MetaModels and if both values already disabled return here. if (substr($this->providerName, 0, 3) !== 'mm_' || $event->isPasteIntoDisabled() && $event->isPasteAfterDisabled()) { return; } $this->checkForAction($clipboard, 'copy'); $this->checkForAction($clipboard, 'create'); $this->checkForAction($clipboard, 'cut'); $event->setPasteAfterDisabled($this->disablePA)->setPasteIntoDisabled($this->disablePI); }
/** * Retrieve the arguments for the callback. * * @param GetPasteButtonEvent $event The event being emitted. * * @return array */ public function getArgs($event) { return array(new DcCompat($event->getEnvironment(), $event->getModel()), $event->getModel()->getPropertiesAsArray(), $event->getEnvironment()->getDataDefinition()->getName(), $event->isCircularReference(), $event->getContainedModels(), $event->getPrevious() ? $event->getPrevious()->getId() : null, $event->getNext() ? $event->getNext()->getId() : null); }
/** * Render the paste after button. * * @param GetPasteButtonEvent $event The event that has been triggered. * * @return string */ public function renderPasteAfterButton(GetPasteButtonEvent $event) { if ($event->getHtmlPasteAfter() !== null) { return $event->getHtmlPasteAfter(); } $model = $event->getModel(); $modelId = IdSerializer::fromModel($model); $environment = $event->getEnvironment(); $controller = $environment->getController(); $clipboard = $environment->getClipboard(); $dataDefinition = $environment->getDataDefinition(); $basicDefinition = $dataDefinition->getBasicDefinition(); $pasteAfterIsDisabled = $event->isPasteAfterDisabled(); if (!$pasteAfterIsDisabled) { // pre-build filter, to fetch other items $filter = new Filter(); $filter->andModelIsFromProvider($basicDefinition->getDataProvider()); if ($parentDataProviderName = $basicDefinition->getParentDataProvider()) { $filter->andParentIsFromProvider($parentDataProviderName); } else { $filter->andHasNoParent(); } $filter->andModelIsNot($modelId); /* * FIXME to be discussed, allow pasting only in the same grouping } /** @var Filter $filter Prevent IDE from saying $filter may be undefined! ;-D * / if (!$pasteAfterIsDisabled) { // Determine if the grouping is the same $groupingMode = ViewHelpers::getGroupingMode($environment); if ($groupingMode) { $items = $clipboard->fetch($filter); $models = $controller->getModelsFromClipboardItems($items); $propertyName = $groupingMode['property']; $propertyValue = $model->getProperty($propertyName); $pasteAfterIsDisabled = true; foreach ($models as $clipboardModel) { if ($propertyValue === $clipboardModel->getProperty($propertyName)) { // there exist at least one item, with the same grouping $pasteAfterIsDisabled = false; break; } } } } if (!$pasteAfterIsDisabled) { */ $pasteAfterIsDisabled = $clipboard->isEmpty($filter); } $strLabel = $this->translate('pasteafter.0', $model->getProviderName()); if ($pasteAfterIsDisabled) { /** @var GenerateHtmlEvent $imageEvent */ $imageEvent = $environment->getEventDispatcher()->dispatch(ContaoEvents::IMAGE_GET_HTML, new GenerateHtmlEvent('pasteafter_.gif', $strLabel, 'class="blink"')); return $imageEvent->getHtml(); } /** @var GenerateHtmlEvent $imageEvent */ $imageEvent = $environment->getEventDispatcher()->dispatch(ContaoEvents::IMAGE_GET_HTML, new GenerateHtmlEvent('pasteafter.gif', $strLabel, 'class="blink"')); $opDesc = $this->translate('pasteafter.1', $environment->getDataDefinition()->getName()); if (strlen($opDesc)) { $title = sprintf($opDesc, $model->getId()); } else { $title = sprintf('%s id %s', $strLabel, $model->getId()); } return sprintf(' <a href="%s" title="%s" %s>%s</a>', $event->getHrefAfter(), specialchars($title), 'onclick="Backend.getScrollOffset()"', $imageEvent->getHtml()); }
/** * Render the paste after button. * * @param GetPasteButtonEvent $event The event that has been triggered. * * @return string */ public function renderPasteAfterButton(GetPasteButtonEvent $event) { if (!is_null($event->getHtmlPasteAfter())) { return $event->getHtmlPasteAfter(); } $strLabel = $this->translate('pasteafter.0', $event->getModel()->getProviderName()); if ($event->isPasteAfterDisabled()) { /** @var GenerateHtmlEvent $imageEvent */ $imageEvent = $this->getEnvironment()->getEventPropagator()->propagate(ContaoEvents::IMAGE_GET_HTML, new GenerateHtmlEvent('pasteafter_.gif', $strLabel, 'class="blink"')); return $imageEvent->getHtml(); } /** @var GenerateHtmlEvent $imageEvent */ $imageEvent = $this->getEnvironment()->getEventPropagator()->propagate(ContaoEvents::IMAGE_GET_HTML, new GenerateHtmlEvent('pasteafter.gif', $strLabel, 'class="blink"')); $opDesc = $this->translate('pasteafter.1', $this->getEnvironment()->getDataDefinition()->getName()); if (strlen($opDesc)) { $title = sprintf($opDesc, $event->getModel()->getId()); } else { $title = sprintf('%s id %s', $strLabel, $event->getModel()->getId()); } return sprintf(' <a href="%s" title="%s" %s>%s</a>', $event->getHrefAfter(), specialchars($title), 'onclick="Backend.getScrollOffset()"', $imageEvent->getHtml()); }