/**
  * 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);
 }
Beispiel #4
0
 /**
  * @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);
 }
Beispiel #5
0
 /**
  * @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);
 }
Beispiel #7
0
 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);
     }
 }
Beispiel #8
0
 /**
  * {@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());
 }
Beispiel #10
0
 /**
  * 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);
         }
     }
 }
Beispiel #12
0
 /**
  * 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);
 }
Beispiel #13
0
 /**
  * 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;
 }
Beispiel #15
0
 /**
  * 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();
 }
Beispiel #16
0
 /**
  * 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;
 }
Beispiel #17
0
 /**
  * {@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);
 }
Beispiel #18
0
 /**
  * {@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;
 }
Beispiel #19
0
 /**
  * {@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);
     }
 }
Beispiel #20
0
 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();
 }
Beispiel #21
0
 /**
  * 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());
     }
 }
Beispiel #22
0
 /**
  * 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;
 }