/** * Serialize an entity and return its ID. * * @param EntityInterface $entity * * @return string */ public function serializeEntityId(EntityInterface $entity) { /** @var EntityAccessor $entityAccessor */ $entityAccessor = $GLOBALS['container']['doctrine.orm.entityAccessor']; $serializer = new IdSerializer(); $serializer->setDataProviderName($entity->entityTableName()); $serializer->setId($entityAccessor->getPrimaryKey($entity)); return $serializer->getSerialized(); }
protected function execute(Message $message, \BackendUser $user) { global $container; /** @var \Symfony\Component\EventDispatcher\EventDispatcher $eventDispatcher */ $eventDispatcher = $GLOBALS['container']['event-dispatcher']; $input = \Input::getInstance(); $user = $input->get('recipient_user'); /** @var \Doctrine\DBAL\Connection $connection */ $connection = $container['doctrine.connection.default']; $queryBuilder = $connection->createQueryBuilder(); /** @var \Doctrine\DBAL\Statement $statement */ $statement = $queryBuilder->select('u.*')->from('tl_user', 'u')->where('id=:id')->setParameter(':id', $user)->execute(); $userData = $statement->fetch(); if (!$userData) { $_SESSION['AVISOTA_SEND_PREVIEW_TO_USER_EMPTY'] = true; header('Location: ' . $url); exit; } $idSerializer = new IdSerializer(); $idSerializer->setDataProviderName('orm_avisota_message'); $idSerializer->setId($message->getId()); $pidSerializer = new IdSerializer(); $pidSerializer->setDataProviderName('orm_avisota_message_category'); $pidSerializer->setId($message->getCategory()->getId()); $environment = Environment::getInstance(); $url = sprintf('%scontao/main.php?do=avisota_newsletter&table=orm_avisota_message&act=preview&id=%s&pid=%s', $environment->base, $idSerializer->getSerialized(), $pidSerializer->getSerialized()); if ($message->getCategory()->getViewOnlinePage()) { $event = new LoadLanguageFileEvent('avisota_message'); $eventDispatcher->dispatch(ContaoEvents::SYSTEM_LOAD_LANGUAGE_FILE, $event); $viewOnlineLink = sprintf($GLOBALS['TL_LANG']['avisota_message']['viewOnline'], $url); } else { $viewOnlineLink = false; } $event = new \Avisota\Contao\Core\Event\CreateFakeRecipientEvent($message); $eventDispatcher->dispatch(\Avisota\Contao\Core\CoreEvents::CREATE_FAKE_RECIPIENT, $event); $recipient = $event->getRecipient(); $recipient->setEmail($userData['email']); $additionalData = array('view_online_link' => $viewOnlineLink); /** @var \Avisota\Contao\Message\Core\Renderer\MessageRendererInterface $renderer */ $renderer = $container['avisota.message.renderer']; $messageTemplate = $renderer->renderMessage($message); $messageMail = $messageTemplate->render($recipient, $additionalData); /** @var \Avisota\Transport\TransportInterface $transport */ $transport = $GLOBALS['container']['avisota.transport.' . $message->getQueue()->getTransport()->getId()]; $transport->send($messageMail); $event = new \ContaoCommunityAlliance\Contao\Bindings\Events\System\LoadLanguageFileEvent('avisota_message_preview'); $eventDispatcher->dispatch(\ContaoCommunityAlliance\Contao\Bindings\ContaoEvents::SYSTEM_LOAD_LANGUAGE_FILE, $event); $_SESSION['TL_CONFIRM'][] = sprintf($GLOBALS['TL_LANG']['avisota_message_preview']['previewSend'], $recipient->getEmail()); header('Location: ' . $url); exit; }
/** * Retrieve the options for the attributes. * * @param GetOptionsEvent $event The event. * * @return void */ public function getOptions(GetOptionsEvent $event) { if (self::isEventForMe($event)) { return; } $model = $event->getModel(); $metaModelId = $model->getProperty('pid'); if (!$metaModelId) { $metaModelId = IdSerializer::fromSerialized($event->getEnvironment()->getInputProvider()->getValue('pid'))->getId(); } $factory = $this->getServiceContainer()->getFactory(); $metaModelName = $factory->translateIdToMetaModelName($metaModelId); $metaModel = $factory->getMetaModel($metaModelName); if (!$metaModel) { return; } $result = array(); // Fetch all attributes except for the current attribute. foreach ($metaModel->getAttributes() as $attribute) { if ($attribute->get('id') === $model->getId()) { continue; } $result[$attribute->getColName()] = sprintf('%s [%s]', $attribute->getName(), $attribute->get('type')); } $event->setOptions($result); }
/** * @param DC_General $dc */ public function renderPreviewView(EnvironmentInterface $environment) { /** @var EventDispatcher $eventDispatcher */ $eventDispatcher = $GLOBALS['container']['event-dispatcher']; $eventDispatcher->dispatch(ContaoEvents::SYSTEM_LOAD_LANGUAGE_FILE, new LoadLanguageFileEvent('avisota_message_preview')); $eventDispatcher->dispatch(ContaoEvents::SYSTEM_LOAD_LANGUAGE_FILE, new LoadLanguageFileEvent('orm_avisota_message')); $input = \Input::getInstance(); $messageRepository = EntityHelper::getRepository('Avisota\\Contao:Message'); $messageId = IdSerializer::fromSerialized($input->get('id') ? $input->get('id') : $input->get('pid')); $message = $messageRepository->find($messageId->getId()); if (!$message) { $environment = \Environment::getInstance(); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_REDIRECT, new RedirectEvent(preg_replace('#&(act=preview|id=[a-f0-9\\-]+)#', '', $environment->request))); } $modules = new \StringBuilder(); /** @var \Avisota\Contao\Message\Core\Send\SendModuleInterface $module */ foreach ($GLOBALS['AVISOTA_SEND_MODULE'] as $className) { $class = new \ReflectionClass($className); $module = $class->newInstance(); $modules->append($module->run($message)); } $context = array('message' => $message, 'modules' => $modules); $template = new \TwigTemplate('avisota/backend/preview', 'html5'); return $template->parse($context); }
/** * @return MessageCategory|null */ public static function resolveCategoryFromInput() { $input = \Input::getInstance(); $id = $input->get('id'); $pid = $input->get('pid'); $modelId = null; $parentModelId = null; /** @var MessageCategory $category */ $category = null; /** @var Message $message */ $message = null; /** @var MessageContent $content */ $content = null; if ($id) { $modelId = IdSerializer::fromSerialized($id); } if ($pid) { $parentModelId = IdSerializer::fromSerialized($pid); } // $id or $pid is a category ID if ($modelId && $modelId->getDataProviderName() == 'orm_avisota_message_category') { $repository = EntityHelper::getRepository('Avisota\\Contao:MessageCategory'); $category = $repository->find($modelId->getId()); } else { if ($parentModelId && $parentModelId->getDataProviderName() == 'orm_avisota_message_category') { $repository = EntityHelper::getRepository('Avisota\\Contao:MessageCategory'); $category = $repository->find($parentModelId->getId()); } else { if ($modelId && $modelId->getDataProviderName() == 'orm_avisota_message') { $repository = EntityHelper::getRepository('Avisota\\Contao:Message'); $message = $repository->find($modelId->getId()); $category = $message->getCategory(); } else { if ($parentModelId && $parentModelId->getDataProviderName() == 'orm_avisota_message') { $repository = EntityHelper::getRepository('Avisota\\Contao:Message'); $message = $repository->find($parentModelId->getId()); $category = $message->getCategory(); } else { if ($modelId && $modelId->getDataProviderName() == 'orm_avisota_message_content') { $repository = EntityHelper::getRepository('Avisota\\Contao:MessageContent'); $content = $repository->find($modelId->getId()); $message = $content->getMessage(); $category = $message->getCategory(); } else { if ($parentModelId && $parentModelId->getDataProviderName() == 'orm_avisota_message_content') { $repository = EntityHelper::getRepository('Avisota\\Contao:MessageContent'); $content = $repository->find($parentModelId->getId()); $message = $content->getMessage(); $category = $message->getCategory(); } } } } } } return $category; }
/** * Prepares a option list with alias => name connection for all attributes. * * This is used in the attr_id select box. * * @param GetPropertyOptionsEvent $event The event. * * @return void */ public function getAttributeIdOptions(GetPropertyOptionsEvent $event) { // Check the context. $allowedProperties = array('first_attr_id', 'second_attr_id', 'single_attr_id'); if (!$this->isAllowedProperty($event, 'tl_metamodel_attribute', $allowedProperties)) { return; } $result = array(); $model = $event->getModel(); $metaModelId = $model->getProperty('pid'); if (!$metaModelId) { $metaModelId = IdSerializer::fromSerialized($event->getEnvironment()->getInputProvider()->getValue('pid'))->getId(); } $factory = $this->getServiceContainer()->getFactory(); $metaModelName = $factory->translateIdToMetaModelName($metaModelId); $metaModel = $factory->getMetaModel($metaModelName); if (!$metaModel) { return; } $typeFactory = $this->getServiceContainer()->getFilterFactory()->getTypeFactory($model->getProperty('type')); $typeFilter = array(); if ($typeFactory) { $typeFilter = $typeFactory->getKnownAttributeTypes(); } if ($event->getPropertyName() === 'single_attr_id') { $typeFilter = array('geolocation'); } else { $key = array_search('geolocation', $typeFilter); if ($key !== null) { unset($typeFilter[$key]); } } foreach ($metaModel->getAttributes() as $attribute) { $typeName = $attribute->get('type'); if ($typeFilter && !in_array($typeName, $typeFilter)) { continue; } $strSelectVal = $attribute->getColName(); $result[$strSelectVal] = $attribute->getName() . ' [' . $typeName . ']'; } $event->setOptions($result); }
public function handleAction(ActionEvent $event) { $environment = $event->getEnvironment(); if ($environment->getDataDefinition()->getName() != 'orm_avisota_queue') { return; } $action = $event->getAction(); if ($action->getName() == 'clear') { $input = $environment->getInputProvider(); $id = IdSerializer::fromSerialized($input->getParameter('id')); $repository = EntityHelper::getRepository('Avisota\\Contao:Queue'); /** @var \Avisota\Contao\Entity\Queue $queueData */ $queueData = $repository->find($id->getId()); /** @var QueueInterface $queue */ $queue = $GLOBALS['container'][sprintf('avisota.queue.%s', $queueData->getAlias())]; $queue->execute(new NullTransport()); $message = new AddMessageEvent(sprintf($GLOBALS['TL_LANG']['orm_avisota_queue']['queueCleared'], $queueData->getTitle()), AddMessageEvent::TYPE_CONFIRM); $event->getDispatcher()->dispatch(ContaoEvents::MESSAGE_ADD, $message); $redirect = new RedirectEvent('contao/main.php?do=avisota_queue&ref=' . TL_REFERER_ID); $event->getDispatcher()->dispatch(ContaoEvents::CONTROLLER_REDIRECT, $redirect); } }
/** * {@inheritdoc} * * @throws DcGeneralRuntimeException When no source id is provided by the input provider. */ public function copy() { if ($this->environment->getDataDefinition()->getBasicDefinition()->isEditOnlyMode()) { return $this->edit(); } // TODO sorting is still hardcoded :-( if ($this->environment->getDataProvider()->fieldExists('sorting')) { $this->checkClipboard('copy'); $this->redirectHome(); } $this->checkLanguage(); $environment = $this->getEnvironment(); $dataProvider = $environment->getDataProvider(); $modelId = IdSerializer::fromSerialized($environment->getInputProvider()->getParameter('source')); if ($modelId) { $model = $dataProvider->fetch($dataProvider->getEmptyConfig()->setId($modelId->getId())); } else { throw new DcGeneralRuntimeException('Missing model id.'); } // We need to keep the original data here. $copyModel = $environment->getController()->createClonedModel($model); $copyModel->setId(null); $preFunction = function (EnvironmentInterface $environment, $model, $originalModel) { $copyEvent = new PreDuplicateModelEvent($environment, $model); $environment->getEventPropagator()->propagate($copyEvent::NAME, $copyEvent, array($environment->getDataDefinition()->getName())); }; $postFunction = function (EnvironmentInterface $environment, $model, $originalModel) { $copyEvent = new PostDuplicateModelEvent($environment, $model, $originalModel); $environment->getEventPropagator()->propagate($copyEvent::NAME, $copyEvent, array($environment->getDataDefinition()->getName())); }; return $this->createEditMask($copyModel, $model, $preFunction, $postFunction); }
/** * Check if the language has been switched. * * If so, the value in the session will be updated and the page reloaded. * * @param EnvironmentInterface $environment The environment. * * @return void */ private function checkLanguageSubmit($environment) { $sessionStorage = $environment->getSessionStorage(); $inputProvider = $environment->getInputProvider(); if ($inputProvider->getValue('FORM_SUBMIT') !== 'language_switch') { return; } $modelId = $inputProvider->getParameter('id') && $inputProvider->getParameter('id') ? IdSerializer::fromSerialized($inputProvider->getParameter('id'))->getId() : null; $languages = $environment->getController()->getSupportedLanguages($modelId); $providerName = $environment->getDataDefinition()->getName(); // Get/Check the new language. if ($inputProvider->hasValue('language') && array_key_exists($inputProvider->getValue('language'), $languages)) { $session['ml_support'][$providerName][$modelId] = $inputProvider->getValue('language'); $sessionStorage->set('dc_general', $session); } $environment->getEventDispatcher()->dispatch(ContaoEvents::CONTROLLER_RELOAD, new ReloadEvent()); }
/** * Render the entries for parent view. * * @param CollectionInterface $collection The collection to render. * * @param array $groupingInformation The grouping information as retrieved via * BaseView::getGroupingMode(). * * @return void */ protected function renderEntries($collection, $groupingInformation) { $environment = $this->getEnvironment(); $clipboard = $environment->getClipboard(); $view = $this->getViewSection(); $listing = $view->getListingConfig(); $remoteCur = null; $groupClass = 'tl_folder_tlist'; $eoCount = -1; $objConfig = $environment->getDataProvider()->getEmptyConfig(); $this->getPanel()->initialize($objConfig); // Generate buttons - only if not in select mode! if (!$this->isSelectModeActive()) { $buttonRenderer = new ButtonRenderer($this->environment); $buttonRenderer->renderButtonsForCollection($collection); } // Run each model. $index = 0; foreach ($collection as $model) { /** @var ModelInterface $model */ $index++; // Add the group header. if ($groupingInformation) { $remoteNew = $this->formatCurrentValue($groupingInformation['property'], $model, $groupingInformation['mode'], $groupingInformation['length']); // Add the group header if it differs from the last header. if (!$listing->getShowColumns() && $groupingInformation['mode'] !== GroupAndSortingInformationInterface::GROUP_NONE && ($remoteNew != $remoteCur || $remoteCur === null)) { $eoCount = -1; $model->setMeta($model::GROUP_VALUE, array('class' => $groupClass, 'value' => $remoteNew)); $groupClass = 'tl_folder_list'; $remoteCur = $remoteNew; } } if ($listing->getItemCssClass()) { $model->setMeta($model::CSS_CLASS, $listing->getItemCssClass()); } $event = new ParentViewChildRecordEvent($this->getEnvironment(), $model); $environment->getEventDispatcher()->dispatch($event::NAME, $event); $cssClasses = array(++$eoCount % 2 == 0 ? 'even' : 'odd'); $modelId = IdSerializer::fromModel($model); if ($clipboard->hasId($modelId)) { $cssClasses[] = 'tl_folder_clipped'; } $model->setMeta($model::CSS_ROW_CLASS, implode(' ', $cssClasses)); if ($event->getHtml() !== null) { $information = array(array('colspan' => 1, 'class' => 'tl_file_list col_1', 'content' => $event->getHtml())); $model->setMeta($model::LABEL_VALUE, $information); } else { $event = new FormatModelLabelEvent($this->environment, $model); $this->environment->getEventDispatcher()->dispatch(DcGeneralEvents::FORMAT_MODEL_LABEL, $event); $model->setMeta($model::LABEL_VALUE, $event->getLabel()); } } }
/** * Handle "old" add to clipboard actions. * * @param ActionEvent $event The action event. * * @return void */ private function addToClipboard(ActionEvent $event) { $actionName = $event->getAction()->getName(); $environment = $event->getEnvironment(); $input = $environment->getInputProvider(); $clipboard = $environment->getClipboard(); if ('create' === $actionName) { $modelId = IdSerializer::fromValues($environment->getDataDefinition()->getBasicDefinition()->getDataProvider(), null); } else { $modelIdRaw = $input->getParameter('source'); $modelId = IdSerializer::fromSerialized($modelIdRaw); } $parentIdRaw = $input->getParameter('pid'); if ($parentIdRaw) { $parentId = IdSerializer::fromSerialized($parentIdRaw); } else { $parentId = null; } // Push some entry into clipboard. if ($modelId) { $clipboardActionName = $this->translateActionName($actionName); if ($clipboardActionName) { // Remove other create items, there can only be one create item in the clipboard or many others if (Item::CREATE === $clipboardActionName) { $clipboard->clear(); } else { $filter = new Filter(); $filter->andActionIs(ItemInterface::CREATE); $items = $clipboard->fetch($filter); foreach ($items as $item) { $clipboard->remove($item); } } // Only push item to clipboard if manual sorting is used. if (Item::COPY === $clipboardActionName && !ViewHelpers::getManualSortingProperty($environment)) { return; } // create the new item $item = new Item($clipboardActionName, $parentId, $modelId); // Let the clipboard save it's values persistent. // TODO remove clear and allow adding multiple items $clipboard->clear()->push($item)->saveTo($environment); ViewHelpers::redirectHome($environment); } } }
/** * Create an instance from an serialized id. * * @param string $serialized The id. * * @return IdSerializer * * @throws DcGeneralRuntimeException When invalid data is encountered. */ public static function fromSerialized($serialized) { $instance = new IdSerializer(); $serialized = rawurldecode($serialized); $serialized = html_entity_decode($serialized, ENT_QUOTES, 'UTF-8'); $chunks = explode('::', $serialized); if (count($chunks) !== 2) { throw new DcGeneralRuntimeException('Unparsable encoded id value: ' . var_export($serialized, true)); } $instance->setDataProviderName($chunks[0]); if (is_numeric($chunks[1])) { return $instance->setId($chunks[1]); } $decodedSource = base64_decode($chunks[1]); $decodedJson = json_decode($decodedSource, true); return $instance->setId($decodedJson ?: $decodedSource); }
/** * Compile buttons from the table configuration array and return them as HTML. * * @param ModelInterface $model The model for which the buttons shall be generated for. * @param ModelInterface $previous The previous model in the collection. * @param ModelInterface $next The next model in the collection. * * @return string */ protected function generateButtons(ModelInterface $model, ModelInterface $previous = null, ModelInterface $next = null) { $environment = $this->getEnvironment(); $dataDefinition = $environment->getDataDefinition(); $basicDefinition = $dataDefinition->getBasicDefinition(); $commands = $this->getViewSection()->getModelCommands(); $clipboard = $environment->getClipboard(); $dispatcher = $environment->getEventDispatcher(); $filter = new Filter(); $filter->andModelIsFromProvider($basicDefinition->getDataProvider()); if ($parentDataProviderName = $basicDefinition->getParentDataProvider()) { $filter->andParentIsFromProvider($parentDataProviderName); } else { $filter->andHasNoParent(); } if ($clipboard->isNotEmpty($filter)) { $circularIds = $clipboard->getCircularIds(); $isCircular = in_array(ModelId::fromModel($model)->getSerialized(), $circularIds); } else { $circularIds = array(); $isCircular = false; } $arrButtons = array(); foreach ($commands->getCommands() as $command) { $arrButtons[$command->getName()] = $this->buildCommand($command, $model, $isCircular, $circularIds, $previous, $next); } if (ViewHelpers::getManualSortingProperty($this->environment)) { $clipboardIsEmpty = $clipboard->isEmpty($filter); if ($clipboardIsEmpty && BasicDefinitionInterface::MODE_HIERARCHICAL !== $basicDefinition->getMode()) { /** @var AddToUrlEvent $urlEvent */ $urlEvent = $dispatcher->dispatch(ContaoEvents::BACKEND_ADD_TO_URL, new AddToUrlEvent('act=create&after=' . ModelId::fromModel($model)->getSerialized())); /** @var GenerateHtmlEvent $imageEvent */ $imageEvent = $dispatcher->dispatch(ContaoEvents::IMAGE_GET_HTML, new GenerateHtmlEvent('new.gif', $this->translate('pastenew.0', $this->getDataDefinition()->getName()))); $arrButtons['pasteNew'] = sprintf('<a href="%s" title="%s" onclick="Backend.getScrollOffset()">%s</a>', $urlEvent->getUrl(), specialchars($this->translate('pastenew.1', $this->getDataDefinition()->getName())), $imageEvent->getHtml()); } // Add paste into/after icons. if (!$clipboardIsEmpty) { if ($clipboard->isCreate()) { // Add ext. information. $add2UrlAfter = sprintf('act=create&after=%s&', ModelId::fromModel($model)->getSerialized()); $add2UrlInto = sprintf('act=create&into=%s&', ModelId::fromModel($model)->getSerialized()); } else { // Add ext. information. $add2UrlAfter = sprintf('act=paste&after=%s&', ModelId::fromModel($model)->getSerialized()); $add2UrlInto = sprintf('act=paste&into=%s&', ModelId::fromModel($model)->getSerialized()); } /** @var AddToUrlEvent $urlAfter */ $urlAfter = $dispatcher->dispatch(ContaoEvents::BACKEND_ADD_TO_URL, new AddToUrlEvent($add2UrlAfter)); /** @var AddToUrlEvent $urlInto */ $urlInto = $dispatcher->dispatch(ContaoEvents::BACKEND_ADD_TO_URL, new AddToUrlEvent($add2UrlInto)); $models = $this->environment->getController()->getModelsFromClipboard($parentDataProviderName ? IdSerializer::fromValues($parentDataProviderName, null) : null); $buttonEvent = new GetPasteButtonEvent($this->getEnvironment()); $buttonEvent->setModel($model)->setCircularReference($isCircular)->setPrevious($previous)->setNext($next)->setHrefAfter($urlAfter->getUrl())->setHrefInto($urlInto->getUrl())->setPasteAfterDisabled($clipboard->isCut() && $isCircular)->setPasteIntoDisabled($clipboard->isCut() && $isCircular)->setContainedModels($models); $this->getEnvironment()->getEventDispatcher()->dispatch(GetPasteButtonEvent::NAME, $buttonEvent); $arrButtons['pasteafter'] = $this->renderPasteAfterButton($buttonEvent); if ($this->getDataDefinition()->getBasicDefinition()->getMode() == BasicDefinitionInterface::MODE_HIERARCHICAL) { $arrButtons['pasteinto'] = $this->renderPasteIntoButton($buttonEvent); } } } return implode(' ', $arrButtons); }
protected function execute(Message $message, \BackendUser $user) { global $container; $input = \Input::getInstance(); $environment = Environment::getInstance(); $eventDispatcher = $this->getEventDispatcher(); $entityManager = EntityHelper::getEntityManager(); $queueData = $message->getQueue(); $serviceName = sprintf('avisota.queue.%s', $queueData->getId()); $queue = $container[$serviceName]; $recipientSourceData = $message->getRecipients(); $serviceName = sprintf('avisota.recipientSource.%s', $recipientSourceData->getId()); /** @var \Avisota\RecipientSource\RecipientSourceInterface $recipientSource */ $recipientSource = $container[$serviceName]; /** @var \Avisota\Contao\Message\Core\Renderer\MessageRendererInterface $renderer */ $renderer = $container['avisota.message.renderer']; $messageTemplate = $renderer->renderMessage($message); $event = new LoadLanguageFileEvent('avisota_message'); $eventDispatcher->dispatch(ContaoEvents::SYSTEM_LOAD_LANGUAGE_FILE, $event); $idSerializer = new IdSerializer(); $idSerializer->setDataProviderName('orm_avisota_message'); $idSerializer->setId($message->getId()); $pidSerializer = new IdSerializer(); $pidSerializer->setDataProviderName('orm_avisota_message_category'); $pidSerializer->setId($message->getCategory()->getId()); $viewOnlinePage = $message->getCategory()->getViewOnlinePage(); if ($viewOnlinePage) { $getPageDetailsEvent = new GetPageDetailsEvent($viewOnlinePage); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_GET_PAGE_DETAILS, $getPageDetailsEvent); $pageDetails = $getPageDetailsEvent->getPageDetails(); $generateUrlEvent = new GenerateFrontendUrlEvent($pageDetails, '/' . $message->getAlias(), $pageDetails['language']); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_GENERATE_FRONTEND_URL, $generateUrlEvent); $url = $generateUrlEvent->getUrl(); if (!preg_match('~^\\w+:~', $url)) { $url = $environment->base . $url; } $generateViewOnlineUrlEvent = new GenerateViewOnlineUrlEvent($message, $url); $eventDispatcher->dispatch(MessageEvents::GENERATE_VIEW_ONLINE_URL, $generateViewOnlineUrlEvent); $url = sprintf($GLOBALS['TL_LANG']['avisota_message']['viewOnline'], $generateViewOnlineUrlEvent->getUrl()); } else { $url = false; } // TODO fix view online link $additionalData = array('view_online_link' => $url); $turn = $input->get('turn'); if (!$turn) { $turn = 0; } $loop = $input->get('loop'); if (!$loop) { $loop = uniqid(); } $event = new \Avisota\Contao\Core\Event\PreSendImmediateEvent($message, $turn, $loop); $eventDispatcher->dispatch('avisota.pre-send-immediate', $event); $queueHelper = new \Avisota\Queue\QueueHelper(); $queueHelper->setEventDispatcher($GLOBALS['container']['event-dispatcher']); $queueHelper->setQueue($queue); $queueHelper->setRecipientSource($recipientSource); $queueHelper->setMessageTemplate($messageTemplate); $queueHelper->setNewsletterData($additionalData); $count = $queueHelper->enqueue(30, $turn * 30); $event = new \Avisota\Contao\Core\Event\PostSendImmediateEvent($count, $message, $turn, $loop); $eventDispatcher->dispatch('avisota.post-send-immediate', $event); if ($count || $turn * 30 + 30 < $recipientSource->countRecipients()) { $eventDispatcher->dispatch(ContaoEvents::SYSTEM_LOAD_LANGUAGE_FILE, new LoadLanguageFileEvent('avisota_message_preview')); $_SESSION['TL_CONFIRM'][] = sprintf($GLOBALS['TL_LANG']['avisota_message_preview']['messagesEnqueued'], $count, $turn + 1); $parameters = array('id' => $message->getId(), 'turn' => $turn + 1, 'loop' => $loop); $url = sprintf('%ssystem/modules/avisota-message/web/send_immediate.php?%s', $environment->base, http_build_query($parameters)); $entityManager->flush(); } else { $parameters = array('do' => 'avisota_outbox', 'execute' => $queueData->getId()); $url = sprintf('%scontao/main.php?%s', $environment->base, http_build_query($parameters)); $message->setSendOn(new \DateTime()); $entityManager->persist($message); $entityManager->flush(); } echo '<html><head><meta http-equiv="refresh" content="0; URL=' . $url . '"></head><body>Still generating...</body></html>'; exit; }
/** * Serialize a model and return its ID. * * @param ModelInterface $model The model. * * @return string */ public function serializeModelId(ModelInterface $model) { $serializer = IdSerializer::fromModel($model); return $serializer->getSerialized(); }
/** * Handle the persisting of the currently loaded model. * * @return bool True means everything is okay, False error. */ protected function doPersist() { $environment = $this->getEnvironment(); $dataProvider = $environment->getDataProvider($this->model->getProviderName()); $inputProvider = $environment->getInputProvider(); if (!$this->model->getMeta(ModelInterface::IS_CHANGED)) { return true; } $this->handlePrePersist(); if ($this->model->getId() === null && $this->getManualSortingProperty()) { $models = $dataProvider->getEmptyCollection(); $models->push($this->model); $controller = $environment->getController(); if ($inputProvider->hasParameter('after')) { $after = IdSerializer::fromSerialized($inputProvider->getParameter('after')); $previousDataProvider = $environment->getDataProvider($after->getDataProviderName()); $previousFetchConfig = $previousDataProvider->getEmptyConfig(); $previousFetchConfig->setId($after->getId()); $previousModel = $previousDataProvider->fetch($previousFetchConfig); if ($previousModel) { $controller->pasteAfter($previousModel, $models, $this->getManualSortingProperty()); } else { $controller->pasteTop($models, $this->getManualSortingProperty()); } } elseif ($inputProvider->hasParameter('into')) { $into = IdSerializer::fromSerialized($inputProvider->getParameter('into')); $parentDataProvider = $environment->getDataProvider($into->getDataProviderName()); $parentFetchConfig = $parentDataProvider->getEmptyConfig(); $parentFetchConfig->setId($into->getId()); $parentModel = $parentDataProvider->fetch($parentFetchConfig); if ($parentModel) { $controller->pasteInto($parentModel, $models, $this->getManualSortingProperty()); } else { $controller->pasteTop($models, $this->getManualSortingProperty()); } } else { $controller->pasteTop($models, $this->getManualSortingProperty()); } $environment->getClipboard()->clear()->saveTo($environment); } else { if (!$this->allValuesUnique()) { return false; } // Save the model. $dataProvider->save($this->model); } $this->handlePostPersist(); $this->storeVersion($this->model); return true; }
/** * {@inheritdoc} * * @throws DcGeneralRuntimeException When the model could not be found by the data provider. */ public function edit(Action $action) { $environment = $this->getEnvironment(); $inputProvider = $environment->getInputProvider(); $modelId = $inputProvider->hasParameter('id') && $inputProvider->getParameter('id') ? IdSerializer::fromSerialized($inputProvider->getParameter('id')) : null; $dataProvider = $environment->getDataProvider($modelId ? $modelId->getDataProviderName() : null); $this->checkRestoreVersion(); if ($modelId && $modelId->getId()) { $model = $dataProvider->fetch($dataProvider->getEmptyConfig()->setId($modelId->getId())); } else { $model = $this->getEnvironment()->getController()->createEmptyModelWithDefaults(); } if (!$model) { throw new DcGeneralRuntimeException('Could not retrieve model with id ' . $modelId->getSerialized()); } // We need to keep the original data here. $originalModel = clone $model; $originalModel->setId($model->getId()); return $this->createEditMask($model, $originalModel, null, null); }
/** * {@inheritDoc} */ public function fetchModelFromProvider($id, $providerName = null) { if ($providerName === null) { if (is_string($id)) { $id = IdSerializer::fromSerialized($id); } } else { $id = IdSerializer::fromValues($providerName, $id); } $dataProvider = $this->getEnvironment()->getDataProvider($id->getDataProviderName()); $item = $dataProvider->fetch($dataProvider->getEmptyConfig()->setId($id->getId())); return $item; }
/** * {@inheritDoc} */ public function enforceModelRelationship($model) { $environment = $this->getEnvironment(); $input = $environment->getInputProvider(); $controller = $environment->getController(); if ($input->hasParameter('into')) { $into = IdSerializer::fromSerialized($input->getParameter('into')); // If we have a null, it means insert into the tree root. if ($into->getId() == 0) { $controller->setRootModel($model); } else { $parent = $controller->fetchModelFromProvider($into); $controller->setParent($model, $parent); } } elseif ($input->hasParameter('after')) { $after = IdSerializer::fromSerialized($input->getParameter('after')); $sibling = $controller->fetchModelFromProvider($after); if (!$sibling || $controller->isRootModel($sibling)) { $controller->setRootModel($model); } else { $parent = $controller->searchParentOf($sibling); $controller->setParent($model, $parent); } } // Also enforce the parent condition of the parent provider (if any). if ($input->hasParameter('pid')) { $parent = $controller->fetchModelFromProvider($input->getParameter('pid')); $controller->setParent($model, $parent); } }
public function handleListAction(EnvironmentInterface $environment) { $input = $environment->getInputProvider(); $id = IdSerializer::fromSerialized($input->getParameter('id')); $repository = EntityHelper::getRepository('Avisota\\Contao:RecipientSource'); /** @var \Avisota\Contao\Entity\RecipientSource $recipientSourceEntity */ $recipientSourceEntity = $repository->find($id->getId()); /** @var RecipientSourceInterface $recipientSource */ $recipientSource = $GLOBALS['container'][sprintf('avisota.recipientSource.%s', $recipientSourceEntity->getId())]; if ($input->getValue('page')) { /** @var EventDispatcher $eventDispatcher */ $eventDispatcher = $GLOBALS['container']['event-dispatcher']; $addToUrlEvent = new AddToUrlEvent('page=' . (int) $input->getValue('page')); $eventDispatcher->dispatch(ContaoEvents::BACKEND_ADD_TO_URL, $addToUrlEvent); $redirectEvent = new RedirectEvent($addToUrlEvent->getUrl()); $eventDispatcher->dispatch(ContaoEvents::CONTROLLER_REDIRECT, $redirectEvent); } $total = $recipientSource->countRecipients(); $page = $input->getParameter('page') ?: 0; $pages = ceil($total / 30); $recipients = $recipientSource->getRecipients(30, $page * 30); $template = new \TwigBackendTemplate('avisota/backend/recipient_source_list'); $template->total = $total; $template->page = $page; $template->pages = $pages; $template->recipients = $recipients; return $template->parse(); }
/** * Set label for list view. * * @param CollectionInterface $collection The collection containing the models. * * @param array $groupingInformation The grouping information as retrieved via * BaseView::getGroupingMode(). * * @return void */ protected function setListViewLabel($collection, $groupingInformation) { $clipboard = $this->environment->getClipboard(); $viewDefinition = $this->getViewSection(); $listingConfig = $viewDefinition->getListingConfig(); $remoteCur = null; $groupClass = 'tl_folder_tlist'; $eoCount = -1; foreach ($collection as $objModelRow) { /** @var ModelInterface $objModelRow */ // Build the sorting groups. if ($groupingInformation) { $remoteNew = $this->formatCurrentValue($groupingInformation['property'], $objModelRow, $groupingInformation['mode'], $groupingInformation['length']); // Add the group header if it differs from the last header. if (!$listingConfig->getShowColumns() && $groupingInformation['mode'] !== GroupAndSortingInformationInterface::GROUP_NONE && ($remoteNew != $remoteCur || $remoteCur === null)) { $eoCount = -1; $objModelRow->setMeta($objModelRow::GROUP_VALUE, array('class' => $groupClass, 'value' => $remoteNew)); $groupClass = 'tl_folder_list'; $remoteCur = $remoteNew; } } $cssClasses = array(++$eoCount % 2 == 0 ? 'even' : 'odd'); $modelId = IdSerializer::fromModel($objModelRow); if ($clipboard->hasId($modelId)) { $cssClasses[] = 'tl_folder_clipped'; } $objModelRow->setMeta($objModelRow::CSS_ROW_CLASS, implode(' ', $cssClasses)); $event = new FormatModelLabelEvent($this->environment, $objModelRow); $this->environment->getEventDispatcher()->dispatch(DcGeneralEvents::FORMAT_MODEL_LABEL, $event); $objModelRow->setMeta($objModelRow::LABEL_VALUE, $event->getLabel()); } }
/** * Reload the file tree. * * @param string $strType The type. * * @param DataContainerInterface $objDc The data container. * * @return void */ protected function reloadTree($strType, DataContainerInterface $objDc) { $environment = $objDc->getEnvironment(); $input = $environment->getInputProvider(); $serializedId = $input->hasParameter('id') ? $input->getParameter('id') : null; $fieldName = $input->hasValue('name') ? $input->getValue('name') : null; // Handle the keys in "edit multiple" mode. if (self::getGet('act') == 'editAll') { // TODO: change here when implementing editAll. $serializedId = preg_replace('/.*_([0-9a-zA-Z]+)$/', '$1', $fieldName); $field = preg_replace('/(.*)_[0-9a-zA-Z]+$/', '$1', $fieldName); } if (!is_null($serializedId)) { $id = IdSerializer::fromSerialized($serializedId); $dataProvider = $objDc->getEnvironment()->getDataProvider($id->getDataProviderName()); $model = $dataProvider->fetch($dataProvider->getEmptyConfig()->setId($id->getId())); if (is_null($model)) { $this->log('A record with the ID "' . $serializedId . '" does not exist in "' . $objDc->getEnvironment()->getDataDefinition()->getName() . '"', 'Ajax executePostActions()', TL_ERROR); header('HTTP/1.1 400 Bad Request'); die('Bad Request'); } } $varValue = $this->getTreeValue($strType, $input->getValue('value')); $strKey = $strType . 'Tree'; // Set the new value. if (isset($model)) { $model->setProperty($fieldName, $varValue); $arrAttribs['activeRecord'] = $model; } else { $arrAttribs['activeRecord'] = null; } $arrAttribs['id'] = $fieldName; $arrAttribs['name'] = $fieldName; $arrAttribs['value'] = $varValue; $arrAttribs['strTable'] = $objDc->getEnvironment()->getDataDefinition()->getName(); $arrAttribs['strField'] = $fieldName; /** @var \Widget $objWidget */ $objWidget = new $GLOBALS['BE_FFL'][$strKey]($arrAttribs); echo $objWidget->generate(); exit; }