/** * @param Request $request * * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function getActionFormAction(Request $request) { $dataArray = ['success' => 0, 'html' => '']; $type = InputHelper::clean($request->request->get('actionType')); if (!empty($type)) { //get the HTML for the form /** @var \Mautic\PointBundle\Model\PointModel $model */ $model = $this->getModel('point'); $actions = $model->getPointActions(); if (isset($actions['actions'][$type])) { $themes = ['MauticPointBundle:FormTheme\\Action']; if (!empty($actions['actions'][$type]['formTheme'])) { $themes[] = $actions['actions'][$type]['formTheme']; } $formType = !empty($actions['actions'][$type]['formType']) ? $actions['actions'][$type]['formType'] : 'genericpoint_settings'; $formTypeOptions = !empty($actions['actions'][$type]['formTypeOptions']) ? $actions['actions'][$type]['formTypeOptions'] : []; $form = $this->get('form.factory')->create('pointaction', [], ['formType' => $formType, 'formTypeOptions' => $formTypeOptions]); $html = $this->renderView('MauticPointBundle:Point:actionform.html.php', ['form' => $this->setFormTheme($form, 'MauticPointBundle:Point:actionform.html.php', $themes)]); //replace pointaction with point $html = str_replace('pointaction', 'point', $html); $dataArray['html'] = $html; $dataArray['success'] = 1; } } return $this->sendJsonResponse($dataArray); }
/** * @param Request $request * * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function getActionFormAction(Request $request) { $dataArray = array('success' => 0, 'html' => ''); $type = InputHelper::clean($request->request->get('actionType')); if (!empty($type)) { //get the HTML for the form /** @var \Mautic\StageBundle\Model\StageModel $model */ $model = $this->getModel('stage'); $actions = $model->getStageActions(); if (isset($actions['actions'][$type])) { $themes = array('MauticStageBundle:FormTheme\\Action'); if (!empty($actions['actions'][$type]['formTheme'])) { $themes[] = $actions['actions'][$type]['formTheme']; } $formType = !empty($actions['actions'][$type]['formType']) ? $actions['actions'][$type]['formType'] : 'genericstage_settings'; $formTypeOptions = !empty($actions['actions'][$type]['formTypeOptions']) ? $actions['actions'][$type]['formTypeOptions'] : array(); $form = $this->get('form.factory')->create('stageaction', array(), array('formType' => $formType, 'formTypeOptions' => $formTypeOptions)); $html = $this->renderView('MauticStageBundle:Stage:actionform.html.php', array('form' => $this->setFormTheme($form, 'MauticStageBundle:Stage:actionform.html.php', $themes))); $html = str_replace('stageaction', 'stage', $html); $dataArray['html'] = $html; $dataArray['success'] = 1; } } return $this->sendJsonResponse($dataArray); }
/** * @param Request $request * @param $modelName * @param $abSettingsFormName * @param $parentFormName * @param $abFormTemplate * @param array $formThemes * * @return mixed */ private function getAbTestForm(Request $request, $modelName, $abSettingsFormName, $parentFormName, $abFormTemplate, $formThemes = []) { $dataArray = ['success' => 0, 'html' => '']; $type = InputHelper::clean($request->request->get('abKey')); $id = InputHelper::int($request->request->get('id')); if (!empty($type)) { //get the HTML for the form $model = $this->getModel($modelName); $entity = $model->getEntity($id); $abTestComponents = $model->getBuilderComponents($entity, 'abTestWinnerCriteria'); $abTestSettings = $abTestComponents['criteria']; if (isset($abTestSettings[$type])) { $html = ''; $formType = !empty($abTestSettings[$type]['formType']) ? $abTestSettings[$type]['formType'] : ''; if (!empty($formType)) { $formOptions = !empty($abTestSettings[$type]['formTypeOptions']) ? $abTestSettings[$type]['formTypeOptions'] : []; $form = $this->get('form.factory')->create($abSettingsFormName, [], ['formType' => $formType, 'formTypeOptions' => $formOptions]); $html = $this->renderView($abFormTemplate, ['form' => $this->setFormTheme($form, $formThemes)]); } $html = str_replace(["{$abSettingsFormName}[", "{$abSettingsFormName}_", $abSettingsFormName], ["{$parentFormName}[variantSettings][", "{$parentFormName}_variantSettings_", $parentFormName], $html); $dataArray['html'] = $html; $dataArray['success'] = 1; } } return $this->sendJsonResponse($dataArray); }
/** * @param Request $request * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function saveApiKeyAction(Request $request) { $apiKey = InputHelper::clean($request->request->get('apiKey')); $dataArray = ['success' => 0]; /** @var \Mautic\InstallBundle\Configurator\Configurator $configurator */ $configurator = $this->get('mautic.configurator'); if ($configurator->isFileWritable()) { try { $cronfigConfig = array('api_key' => $apiKey); // Ensure the config has a secret key $params = $configurator->getParameters(); if (!isset($params['cronfig']) || empty($params['cronfig']['secret_key'])) { $cronfigConfig['secret_key'] = EncryptionHelper::generateKey(); $dataArray['secret_key'] = $cronfigConfig['secret_key']; } // Save the API key only if it doesn't exist or has changed if (!isset($params['cronfig']['api_key']) || !isset($params['cronfig']['secret_key']) || isset($params['cronfig']['api_key']) && $params['cronfig']['api_key'] == $apiKey || isset($params['cronfig']['secret_key']) && $params['cronfig']['secret_key'] == $apiKey) { $configurator->mergeParameters(array('cronfig' => $cronfigConfig)); $configurator->write(); $dataArray['success'] = 1; // We must clear the application cache for the updated values to take effect /** @var \Mautic\CoreBundle\Helper\CacheHelper $cacheHelper */ $cacheHelper = $this->factory->getHelper('cache'); $cacheHelper->clearContainerFile(); } } catch (\RuntimeException $exception) { $this->addFlash('mautic.config.config.error.not.updated', ['%exception%' => $exception->getMessage()], 'error'); } } else { $form->addError(new FormError($this->factory->getTranslator()->trans('mautic.config.notwritable'))); } return $this->sendJsonResponse($dataArray); }
/** * @param Request $request * * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function getAbTestFormAction(Request $request) { $dataArray = array('success' => 0, 'html' => ''); $type = InputHelper::clean($request->request->get('abKey')); $emailId = InputHelper::int($request->request->get('emailId')); if (!empty($type)) { //get the HTML for the form /** @var \Mautic\EmailBundle\Model\EmailModel $model */ $model = $this->factory->getModel('email'); $email = $model->getEntity($emailId); $abTestComponents = $model->getBuilderComponents($email, 'abTestWinnerCriteria'); $abTestSettings = $abTestComponents['criteria']; if (isset($abTestSettings[$type])) { $html = ''; $formType = !empty($abTestSettings[$type]['formType']) ? $abTestSettings[$type]['formType'] : ''; if (!empty($formType)) { $formOptions = !empty($abTestSettings[$type]['formTypeOptions']) ? $abTestSettings[$type]['formTypeOptions'] : array(); $form = $this->get('form.factory')->create('email_abtest_settings', array(), array('formType' => $formType, 'formTypeOptions' => $formOptions)); $html = $this->renderView('MauticEmailBundle:AbTest:form.html.php', array('form' => $this->setFormTheme($form, 'MauticEmailBundle:AbTest:form.html.php', 'MauticEmailBundle:FormTheme\\Email'))); } $html = str_replace(array('email_abtest_settings[', 'email_abtest_settings_', 'email_abtest_settings'), array('emailform[variantSettings][', 'emailform_variantSettings_', 'emailform'), $html); $dataArray['html'] = $html; $dataArray['success'] = 1; } } return $this->sendJsonResponse($dataArray); }
protected function sendHookTestAction(Request $request) { $url = InputHelper::clean($request->request->get('url')); // validate the URL if ($url == '' || !$url) { // default to an error message $dataArray = array('success' => 1, 'html' => '<div class="has-error"><span class="help-block">' . $this->factory->getTranslator()->trans('mautic.webhook.label.no.url') . '</span></div>'); return $this->sendJsonResponse($dataArray); } // get the selected types $selectedTypes = InputHelper::cleanArray($request->request->get('types')); $payloadPaths = $this->getPayloadPaths($selectedTypes); $payloads = $this->loadPayloads($payloadPaths); $now = new \DateTime(); $payloads['timestamp'] = $now->format('c'); // instantiate new http class $http = new Http(); // set the response $response = $http->post($url, json_encode($payloads)); // default to an error message $dataArray = array('success' => 1, 'html' => '<div class="has-error"><span class="help-block">' . $this->factory->getTranslator()->trans('mautic.webhook.label.warning') . '</span></div>'); // if we get a 200 response convert to success message if ($response->code == 200) { $dataArray['html'] = '<div class="has-success"><span class="help-block">' . $this->factory->getTranslator()->trans('mautic.webhook.label.success') . '</span></div>'; } return $this->sendJsonResponse($dataArray); }
/** * @param Request $request * * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function setBuilderContentAction(Request $request) { $dataArray = array('success' => 0); $entityId = InputHelper::clean($request->request->get('entity')); $session = $this->factory->getSession(); if (!empty($entityId)) { $sessionVar = 'mautic.pagebuilder.' . $entityId . '.content'; // Check for an array of slots $slots = InputHelper::_($request->request->get('slots', array(), true), 'html'); $content = $session->get($sessionVar, array()); if (!is_array($content)) { $content = array(); } if (!empty($slots)) { // Builder was closed so save each content foreach ($slots as $slot => $newContent) { $content[$slot] = $newContent; } $session->set($sessionVar, $content); $dataArray['success'] = 1; } else { // Check for a single slot $newContent = InputHelper::html($request->request->get('content')); $slot = InputHelper::clean($request->request->get('slot')); if (!empty($slot)) { $content[$slot] = $newContent; $session->set($sessionVar, $content); $dataArray['success'] = 1; } } } return $this->sendJsonResponse($dataArray); }
/** * @param Request $request * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function categoryListAction(Request $request) { $filter = InputHelper::clean($request->query->get('filter')); $results = $this->factory->getModel('asset.asset')->getLookupResults('category', $filter, 10); $dataArray = array(); foreach ($results as $r) { $dataArray[] = array("label" => $r['title'] . " ({$r['id']})", "value" => $r['id']); } return $this->sendJsonResponse($dataArray); }
/** * Obtains a list of available widget types. * * @param string $type of the widget * * @return \Symfony\Component\HttpFoundation\Response */ public function getDataAction($type) { $start = microtime(true); $timezone = InputHelper::clean($this->request->get('timezone', null)); $from = InputHelper::clean($this->request->get('dateFrom', null)); $to = InputHelper::clean($this->request->get('dateTo', null)); $dataFormat = InputHelper::clean($this->request->get('dataFormat', null)); $response = ['success' => 0]; if ($timezone) { $fromDate = new \DateTime($from, new \DateTimeZone($timezone)); $toDate = new \DateTime($to, new \DateTimeZone($timezone)); } else { $fromDate = new \DateTime($from); $toDate = new \DateTime($to); } $params = ['timeUnit' => InputHelper::clean($this->request->get('timeUnit', 'Y')), 'dateFormat' => InputHelper::clean($this->request->get('dateFormat', null)), 'dateFrom' => $fromDate, 'dateTo' => $toDate, 'limit' => InputHelper::int($this->request->get('limit', null)), 'filter' => $this->request->get('filter', [])]; $cacheTimeout = InputHelper::int($this->request->get('cacheTimeout', null)); $widgetHeight = InputHelper::int($this->request->get('height', 300)); $widget = new Widget(); $widget->setParams($params); $widget->setType($type); $widget->setHeight($widgetHeight); if ($cacheTimeout === null) { $widget->setCacheTimeout($cacheTimeout); } $this->model->populateWidgetContent($widget); $data = $widget->getTemplateData(); if (!$data) { return $this->notFound(); } if ($dataFormat == 'raw') { if (isset($data['chartData']['labels']) && isset($data['chartData']['datasets'])) { $rawData = []; foreach ($data['chartData']['datasets'] as $dataset) { $rawData[$dataset['label']] = []; foreach ($dataset['data'] as $key => $value) { $rawData[$dataset['label']][$data['chartData']['labels'][$key]] = $value; } } $data = $rawData; } elseif (isset($data['raw'])) { $data = $data['raw']; } } else { if (isset($data['raw'])) { unset($data['raw']); } } $response['cached'] = $widget->isCached(); $response['execution_time'] = microtime(true) - $start; $response['success'] = 1; $response['data'] = $data; $view = $this->view($response, Codes::HTTP_OK); return $this->handleView($view); }
/** * @param Request $request * * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function categoryListAction(Request $request) { $bundle = InputHelper::clean($request->query->get('bundle')); $filter = InputHelper::clean($request->query->get('filter')); $results = $this->getModel('category')->getLookupResults($bundle, $filter, 10); $dataArray = []; foreach ($results as $r) { $dataArray[] = ['label' => $r['title'] . " ({$r['id']})", 'value' => $r['id']]; } return $this->sendJsonResponse($dataArray); }
/** * @param Request $request * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function updateSubmissionChartAction(Request $request) { $formId = InputHelper::int($request->request->get('formId')); $amount = InputHelper::int($request->request->get('amount')); $unit = InputHelper::clean($request->request->get('unit')); $dataArray = array('success' => 0); // Download stats per time period $dataArray['stats'] = $this->factory->getEntityManager()->getRepository('MauticFormBundle:Submission')->getSubmissionsSince($formId, $amount, $unit); $dataArray['success'] = 1; return $this->sendJsonResponse($dataArray); }
/** * Format a string * * @param $val * @param $type */ public function _($val, $type, $textOnly = false, $round = 1) { if (empty($val)) { return $val; } switch ($type) { case 'array': if (!is_array($val)) { //assume that it's serialized $unserialized = unserialize($val); if ($unserialized) { $val = $unserialized; } } $stringParts = array(); foreach ($val as $k => $v) { if (is_array($v)) { $stringParts = $this->_($v, 'array', $textOnly, $round + 1); } else { $stringParts[] = $v; } } if ($round === 1) { $string = implode('; ', $stringParts); } else { $string = implode(', ', $stringParts); } break; case 'datetime': $string = $this->dateHelper->toFull($val, 'utc'); break; case 'time': $string = $this->dateHelper->toTime($val, 'utc'); break; case 'date': $string = $this->dateHelper->toDate($val, 'utc'); break; case 'url': $string = $textOnly ? $val : '<a href="' . $val . '" target="_new">' . $val . '</a>'; break; case 'email': $string = $textOnly ? $val : '<a href="mailto:' . $val . '">' . $val . '</a>'; break; case 'int': $string = (int) $val; break; default: $string = InputHelper::clean($val); break; } return $string; }
/** * @param Request $request * * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function updateConnectionsAction(Request $request) { $session = $this->factory->getSession(); $campaignId = InputHelper::clean($request->query->get('campaignId')); $canvasSettings = $this->request->request->get('canvasSettings', array(), true); if (empty($campaignId)) { $dataArray = array('success' => 0); } else { $session->set('mautic.campaign.' . $campaignId . '.events.canvassettings', $canvasSettings); $dataArray = array('success' => 1); } return $this->sendJsonResponse($dataArray); }
/** * @param Request $request * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function updateGraphAction(Request $request) { $reportId = InputHelper::int($request->request->get('reportId')); $options = InputHelper::clean($request->request->all()); $dataArray = array('success' => 0); /* @type \Mautic\ReportBundle\Model\ReportModel $model */ $model = $this->factory->getModel('report'); $report = $model->getEntity($reportId); $options['ignoreTableData'] = true; $reportData = $model->getReportData($report, $this->container->get('form.factory'), $options); $dataArray['graph'] = $reportData['graphs'][$options['graphName']]['data']; $dataArray['success'] = 1; return $this->sendJsonResponse($dataArray); }
/** * @param Request $request * @param string $name * * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function reorderFieldsAction(Request $request, $name = 'fields') { $dataArray = array('success' => 0); $sessionId = InputHelper::clean($request->request->get('formId')); $sessionName = 'mautic.form.' . $sessionId . '.' . $name . '.modified'; $session = $this->factory->getSession(); $orderName = $name == 'fields' ? 'mauticform' : 'mauticform_action'; $order = InputHelper::clean($request->request->get($orderName)); $components = $session->get($sessionName); if (!empty($order) && !empty($components)) { $components = array_replace(array_flip($order), $components); $session->set($sessionName, $components); $dataArray['success'] = 1; } return $this->sendJsonResponse($dataArray); }
/** * Delete a file from /media directory * * @return \Symfony\Component\HttpFoundation\JsonResponse */ public function deleteAction() { $src = InputHelper::clean($this->request->request->get('src')); $response = array('deleted' => false); $imagePath = $this->getMediaAbsolutePath() . '/' . basename($src); if (!file_exists($imagePath)) { $this->response['error'] = 'File does not exist'; $this->statusCode = Response::HTTP_INTERNAL_SERVER_ERROR; } elseif (!is_writable($imagePath)) { $this->response['error'] = 'File is not writable'; $this->statusCode = Response::HTTP_INTERNAL_SERVER_ERROR; } else { unlink($imagePath); $this->response['deleted'] = true; } return $this->sendJsonResponse($this->response, $this->statusCode); }
/** * @param Request $request * * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function getNetworkFormAction(Request $request) { // get the form type $type = InputHelper::clean($request->request->get('networkType')); // default to empty $dataArray = ['html' => '', 'success' => 0]; if (!empty($type)) { //get the HTML for the form // get the network type form $form = $this->get('form.factory')->create($type, [], ['label' => false, 'csrf_protection' => false]); $html = $this->renderView('MauticSocialBundle:FormTheme:' . $type . '_widget.html.php', ['form' => $form->createView()]); $html = str_replace([$type . '[', $type . '_', $type], ['monitoring[properties][', 'monitoring_properties_', 'monitoring'], $html); $dataArray['html'] = $html; $dataArray['success'] = 1; } return $this->sendJsonResponse($dataArray); }
public function indexAction(Request $request, $leadId, $page = 1) { if (empty($leadId)) { return $this->accessDenied(); } $lead = $this->checkLeadAccess($leadId, 'view'); if ($lead instanceof Response) { return $lead; } $this->setListFilters(); $session = $this->get('session'); if ($request->getMethod() == 'POST' && $request->request->has('search')) { $filters = ['search' => InputHelper::clean($request->request->get('search')), 'includeEvents' => InputHelper::clean($request->request->get('includeEvents', [])), 'excludeEvents' => InputHelper::clean($request->request->get('excludeEvents', []))]; $session->set('mautic.lead.' . $leadId . '.timeline.filters', $filters); } else { $filters = null; } $order = [$session->get('mautic.lead.' . $leadId . '.timeline.orderby'), $session->get('mautic.lead.' . $leadId . '.timeline.orderbydir')]; $events = $this->getEngagements($lead, $filters, $order, $page); return $this->delegateView(['viewParameters' => ['lead' => $lead, 'page' => $page, 'events' => $events], 'passthroughVars' => ['route' => false, 'mauticContent' => 'leadTimeline', 'timelineCount' => $events['total']], 'contentTemplate' => 'MauticLeadBundle:Timeline:list.html.php']); }
/** * Generate's default list view. * * @param $leadId * * @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\Response */ public function indexAction($leadId = 0, $page = 1) { if (empty($leadId)) { return $this->accessDenied(); } $lead = $this->checkLeadAccess($leadId, 'view'); if ($lead instanceof Response) { return $lead; } if ($this->request->getMethod() == 'POST') { $this->setListFilters(); } $session = $this->get('session'); //set limits $limit = $session->get('mautic.lead.' . $lead->getId() . '.note.limit', $this->get('mautic.helper.core_parameters')->getParameter('default_pagelimit')); $start = $page === 1 ? 0 : ($page - 1) * $limit; if ($start < 0) { $start = 0; } $search = $this->request->get('search', $session->get('mautic.lead.' . $lead->getId() . '.note.filter', '')); $session->set('mautic.lead.' . $lead->getId() . '.note.filter', $search); //do some default filtering $orderBy = $session->get('mautic.lead.' . $lead->getId() . '.note.orderby', 'n.dateTime'); $orderByDir = $session->get('mautic.lead.' . $lead->getId() . '.note.orderbydir', 'DESC'); $model = $this->getModel('lead.note'); $force = [['column' => 'n.lead', 'expr' => 'eq', 'value' => $lead]]; $tmpl = $this->request->isXmlHttpRequest() ? $this->request->get('tmpl', 'index') : 'index'; $noteType = InputHelper::clean($this->request->request->get('noteTypes', [], true)); if (empty($noteType) && $tmpl == 'index') { $noteType = $session->get('mautic.lead.' . $lead->getId() . '.notetype.filter', []); } $session->set('mautic.lead.' . $lead->getId() . '.notetype.filter', $noteType); $noteTypes = ['general' => 'mautic.lead.note.type.general', 'email' => 'mautic.lead.note.type.email', 'call' => 'mautic.lead.note.type.call', 'meeting' => 'mautic.lead.note.type.meeting']; if (!empty($noteType)) { $force[] = ['column' => 'n.type', 'expr' => 'in', 'value' => $noteType]; } $items = $model->getEntities(['filter' => ['force' => $force, 'string' => $search], 'start' => $start, 'limit' => $limit, 'orderBy' => $orderBy, 'orderByDir' => $orderByDir, 'hydration_mode' => 'HYDRATE_ARRAY']); $security = $this->get('mautic.security'); return $this->delegateView(['viewParameters' => ['notes' => $items, 'lead' => $lead, 'page' => $page, 'limit' => $limit, 'search' => $search, 'noteType' => $noteType, 'noteTypes' => $noteTypes, 'tmpl' => $tmpl, 'permissions' => ['edit' => $security->hasEntityAccess('lead:leads:editown', 'lead:leads:editother', $lead->getPermissionUser()), 'delete' => $security->hasEntityAccess('lead:leads:deleteown', 'lead:leads:deleteown', $lead->getPermissionUser())]], 'passthroughVars' => ['route' => false, 'mauticContent' => 'leadNote', 'noteCount' => count($items)], 'contentTemplate' => 'MauticLeadBundle:Note:list.html.php']); }
/** * @param Request $request * * @return JsonResponse */ protected function getLookupChoiceListAction(Request $request) { $dataArray = []; $modelName = InputHelper::clean($request->query->get('searchKey')); $search = InputHelper::clean($request->query->get(str_replace('.', '_', $modelName))); if (!empty($modelName) && !empty($search)) { /** @var ModelFactory $modelFactory */ $modelFactory = $this->get('mautic.model.factory'); if ($modelFactory->hasModel($modelName)) { $model = $modelFactory->getModel($modelName); if ($model instanceof AjaxLookupModelInterface) { $results = $model->getLookupResults($modelName, $search); foreach ($results as $result) { if (isset($result['label'])) { $result['text'] = $result['label']; } $dataArray[] = $result; } } } } return new JsonResponse($dataArray); }
/** * @param $entity * @param properties * @return bool */ public function setFieldProperties(&$entity, $properties) { if (!$entity instanceof LeadField) { throw new MethodNotAllowedHttpException(array('LeadEntity')); } if (!empty($properties) && is_array($properties)) { $properties = InputHelper::clean($properties); } else { $properties = array(); } //validate properties $type = $entity->getType(); $result = FormFieldHelper::validateProperties($type, $properties); if ($result[0]) { $entity->setProperties($properties); return true; } else { return $result[1]; } }
/** * Activate the builder * * @param $objectId * * @return array|\Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response * @throws \Exception * @throws \Mautic\CoreBundle\Exception\FileNotFoundException */ public function builderAction($objectId) { /** @var \Mautic\EmailBundle\Model\EmailModel $model */ $model = $this->factory->getModel('email'); //permission check if (strpos($objectId, 'new') !== false) { $isNew = true; if (!$this->factory->getSecurity()->isGranted('email:emails:create')) { return $this->accessDenied(); } $entity = $model->getEntity(); $entity->setSessionId($objectId); } else { $isNew = false; $entity = $model->getEntity($objectId); if ($entity == null || !$this->factory->getSecurity()->hasEntityAccess('email:emails:viewown', 'email:emails:viewother', $entity->getCreatedBy())) { return $this->accessDenied(); } } $template = InputHelper::clean($this->request->query->get('template')); $slots = $this->factory->getTheme($template)->getSlots('email'); //merge any existing changes $newContent = $this->factory->getSession()->get('mautic.emailbuilder.' . $objectId . '.content', array()); $content = $entity->getContent(); $tokens = $model->getBuilderComponents($entity, array('tokens', 'visualTokens')); BuilderTokenHelper::replaceTokensWithVisualPlaceholders($tokens, $content); if (is_array($newContent)) { $content = array_merge($content, $newContent); } // Replace short codes to emoji $content = EmojiHelper::toEmoji($content, 'short'); return $this->render('MauticEmailBundle::builder.html.php', array('isNew' => $isNew, 'slots' => $slots, 'content' => $content, 'email' => $entity, 'template' => $template, 'basePath' => $this->request->getBasePath())); }
/** * Updates list filters, order, limit * * @return void */ protected function setListFilters() { $session = $this->get('session'); $name = InputHelper::clean($this->request->query->get('name')); if (!empty($name)) { if ($this->request->query->has('orderby')) { $orderBy = InputHelper::clean($this->request->query->get('orderby'), true); $dir = $session->get("mautic.{$name}.orderbydir", 'ASC'); $dir = $dir == 'ASC' ? 'DESC' : 'ASC'; $session->set("mautic.{$name}.orderby", $orderBy); $session->set("mautic.{$name}.orderbydir", $dir); } if ($this->request->query->has('limit')) { $limit = InputHelper::int($this->request->query->get('limit')); $session->set("mautic.{$name}.limit", $limit); } if ($this->request->query->has('filterby')) { $filter = InputHelper::clean($this->request->query->get("filterby"), true); $value = InputHelper::clean($this->request->query->get("value"), true); $filters = $session->get("mautic.{$name}.filters", array()); if ($value == '') { if (isset($filters[$filter])) { unset($filters[$filter]); } } else { $filters[$filter] = array('column' => $filter, 'expr' => 'like', 'value' => $value, 'strict' => false); } $session->set("mautic.{$name}.filters", $filters); } } }
/** * @param $name * * @return array|JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response */ public function infoAction($name) { if (!$this->factory->getSecurity()->isGranted('plugin:plugins:manage')) { return $this->accessDenied(); } /** @var \Mautic\PluginBundle\Model\PluginModel $pluginModel */ $pluginModel = $this->factory->getModel('plugin'); $bundle = $pluginModel->getRepository()->findOneBy(array('bundle' => InputHelper::clean($name))); if (!$bundle) { return $this->accessDenied(); } /** @var \Mautic\PluginBundle\Helper\IntegrationHelper $integrationHelper */ $integrationHelper = $this->factory->getHelper('integration'); return $this->delegateView(array('viewParameters' => array('bundle' => $bundle, 'icon' => $integrationHelper->getIconPath($bundle)), 'contentTemplate' => 'MauticPluginBundle:Integration:info.html.php', 'passthroughVars' => array('activeLink' => '#mautic_plugin_index', 'mauticContent' => 'integration', 'route' => false))); }
/** * @param Request $request */ protected function setChatOnlineStatusAction(Request $request) { $status = InputHelper::clean($request->request->get('status')); if ($status) { /** @var \Mautic\UserBundle\Model\UserModel $model */ $model = $this->factory->getModel('user'); $model->setOnlineStatus($status); } return $this->sendJsonResponse(array('success' => 1)); }
/** * @param Request $request * @return \Symfony\Component\HttpFoundation\JsonResponse */ protected function updateLeadFieldValuesAction(Request $request) { $alias = InputHelper::clean($request->request->get('alias')); $dataArray = array('success' => 0, 'options' => null); $leadField = $this->factory->getModel('lead.field')->getRepository()->findOneBy(array('alias' => $alias)); if ($leadField) { $properties = $leadField->getProperties(); if (!empty($properties['list'])) { // Lookup/Select options $options = explode('|', $properties['list']); } else { $options = $properties; } $dataArray['options'] = $options; } $dataArray['success'] = 1; return $this->sendJsonResponse($dataArray); }
/** * @param Request $request * * @return JsonResponse */ protected function updateUserStatusAction(Request $request) { $status = InputHelper::clean($request->request->get('status')); /** @var \Mautic\UserBundle\Model\UserModel $model */ $model = $this->factory->getModel('user'); $currentStatus = $this->factory->getUser()->getOnlineStatus(); if (!in_array($currentStatus, array('manualaway', 'dnd'))) { if ($status == 'back') { $status = 'online'; } $model->setOnlineStatus($status); } return $this->sendJsonResponse(array('success' => 1)); }
/** * @param $objectId * @param bool $ignorePost * @param bool $forceTypeSelection * * @return array|\Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse|Response */ public function editAction($objectId, $ignorePost = false, $forceTypeSelection = false) { /** @var \Mautic\SmsBundle\Model\SmsModel $model */ $model = $this->getModel('sms'); $method = $this->request->getMethod(); $entity = $model->getEntity($objectId); $session = $this->get('session'); $page = $session->get('mautic.sms.page', 1); //set the return URL $returnUrl = $this->generateUrl('mautic_sms_index', ['page' => $page]); $postActionVars = ['returnUrl' => $returnUrl, 'viewParameters' => ['page' => $page], 'contentTemplate' => 'MauticSmsBundle:Sms:index', 'passthroughVars' => ['activeLink' => 'mautic_sms_index', 'mauticContent' => 'sms']]; //not found if ($entity === null) { return $this->postActionRedirect(array_merge($postActionVars, ['flashes' => [['type' => 'error', 'msg' => 'mautic.sms.error.notfound', 'msgVars' => ['%id%' => $objectId]]]])); } elseif (!$this->get('mautic.security')->hasEntityAccess('sms:smses:viewown', 'sms:smses:viewother', $entity->getCreatedBy())) { return $this->accessDenied(); } elseif ($model->isLocked($entity)) { //deny access if the entity is locked return $this->isLocked($postActionVars, $entity, 'email'); } //Create the form $action = $this->generateUrl('mautic_sms_action', ['objectAction' => 'edit', 'objectId' => $objectId]); $updateSelect = $method == 'POST' ? $this->request->request->get('sms[updateSelect]', false, true) : $this->request->get('updateSelect', false); $form = $model->createForm($entity, $this->get('form.factory'), $action, ['update_select' => $updateSelect]); ///Check for a submitted form and process it if (!$ignorePost && $method == 'POST') { $valid = false; if (!($cancelled = $this->isFormCancelled($form))) { if ($valid = $this->isFormValid($form)) { //form is valid so process the data $model->saveEntity($entity, $form->get('buttons')->get('save')->isClicked()); $this->addFlash('mautic.core.notice.updated', ['%name%' => $entity->getName(), '%menu_link%' => 'mautic_sms_index', '%url%' => $this->generateUrl('mautic_sms_action', ['objectAction' => 'edit', 'objectId' => $entity->getId()])], 'warning'); } } else { //clear any modified content $session->remove('mautic.sms.' . $objectId . '.content'); //unlock the entity $model->unlockEntity($entity); } $passthrough = ['activeLink' => 'mautic_sms_index', 'mauticContent' => 'sms']; $template = 'MauticSmsBundle:Sms:view'; // Check to see if this is a popup if (isset($form['updateSelect'])) { $template = false; $passthrough = array_merge($passthrough, ['updateSelect' => $form['updateSelect']->getData(), 'smsId' => $entity->getId(), 'smsName' => $entity->getName(), 'smsLang' => $entity->getLanguage()]); } if ($cancelled || $valid && $form->get('buttons')->get('save')->isClicked()) { $viewParameters = ['objectAction' => 'view', 'objectId' => $entity->getId()]; return $this->postActionRedirect(array_merge($postActionVars, ['returnUrl' => $this->generateUrl('mautic_sms_action', $viewParameters), 'viewParameters' => $viewParameters, 'contentTemplate' => $template, 'passthroughVars' => $passthrough])); } } else { //lock the entity $model->lockEntity($entity); } return $this->delegateView(['viewParameters' => ['form' => $this->setFormTheme($form, 'MauticSmsBundle:Sms:form.html.php', 'MauticSmsBundle:FormTheme\\Sms'), 'sms' => $entity, 'forceTypeSelection' => $forceTypeSelection], 'contentTemplate' => 'MauticSmsBundle:Sms:form.html.php', 'passthroughVars' => ['activeLink' => '#mautic_sms_index', 'mauticContent' => 'sms', 'updateSelect' => InputHelper::clean($this->request->query->get('updateSelect')), 'route' => $this->generateUrl('mautic_sms_action', ['objectAction' => 'edit', 'objectId' => $entity->getId()])]]); }
/** * Activate the builder. * * @param int $objectId * * @return \Symfony\Component\HttpFoundation\Response */ public function builderAction($objectId) { /** @var \Mautic\PageBundle\Model\PageModel $model */ $model = $this->getModel('page.page'); //permission check if (strpos($objectId, 'new') !== false) { $isNew = true; if (!$this->get('mautic.security')->isGranted('page:pages:create')) { return $this->accessDenied(); } $entity = $model->getEntity(); $entity->setSessionId($objectId); } else { $isNew = false; $entity = $model->getEntity($objectId); if ($entity == null || !$this->get('mautic.security')->hasEntityAccess('page:pages:viewown', 'page:pages:viewother', $entity->getCreatedBy())) { return $this->accessDenied(); } } $template = InputHelper::clean($this->request->query->get('template')); $slots = $this->factory->getTheme($template)->getSlots('page'); //merge any existing changes $newContent = $this->get('session')->get('mautic.pagebuilder.' . $objectId . '.content', []); $content = $entity->getContent(); if (is_array($newContent)) { $content = array_merge($content, $newContent); // Update the content for processSlots $entity->setContent($content); } $this->processSlots($slots, $entity); $logicalName = $this->factory->getHelper('theme')->checkForTwigTemplate(':' . $template . ':page.html.php'); return $this->render($logicalName, ['isNew' => $isNew, 'slots' => $slots, 'formFactory' => $this->get('form.factory'), 'content' => $content, 'page' => $entity, 'template' => $template, 'basePath' => $this->request->getBasePath()]); }
/** * @param $filters * @param $parameters * @param \Doctrine\DBAL\Query\QueryBuilder $q * @param bool|false $not * @param null|int $leadId * * @return \Doctrine\DBAL\Query\Expression\CompositeExpression */ public function getListFilterExpr($filters, &$parameters, QueryBuilder $q, $not = false, $leadId = null) { static $leadTable; if (!count($filters)) { return $q->expr()->andX(); } // Get table columns if (null === $leadTable) { $schema = $this->_em->getConnection()->getSchemaManager(); /** @var \Doctrine\DBAL\Schema\Column[] $leadTable */ $leadTable = $schema->listTableColumns(MAUTIC_TABLE_PREFIX . 'leads'); } $options = $this->getFilterExpressionFunctions(); $groups = array(); $groupExpr = $q->expr()->andX(); foreach ($filters as $k => $details) { $column = isset($leadTable[$details['field']]) ? $leadTable[$details['field']] : false; //DBAL does not have a not() function so we have to use the opposite $func = !$not ? $options[$details['operator']]['expr'] : $options[$details['operator']]['negate_expr']; $field = "l.{$details['field']}"; // Format the field based on platform specific functions that DBAL doesn't support natively if ($column) { $formatter = AbstractFormatter::createFormatter($this->_em->getConnection()); $columnType = $column->getType(); switch ($details['type']) { case 'datetime': if (!$columnType instanceof UTCDateTimeType) { $field = $formatter->toDateTime($field); } break; case 'date': if (!$columnType instanceof DateType && !$columnType instanceof UTCDateTimeType) { $field = $formatter->toDate($field); } break; case 'time': if (!$columnType instanceof TimeType && !$columnType instanceof UTCDateTimeType) { $field = $formatter->toTime($field); } break; case 'number': if (!$columnType instanceof IntegerType && !$columnType instanceof FloatType) { $field = $formatter->toNumeric($field); } break; } } //the next one will determine the group $glue = isset($filters[$k + 1]) ? $filters[$k + 1]['glue'] : $details['glue']; if ($glue == "or" || $details['glue'] == 'or') { // Create a new group of andX expressions if ($groupExpr->count()) { $groups[] = $groupExpr; $groupExpr = $q->expr()->andX(); } } $parameter = $this->generateRandomParameterName(); $exprParameter = ":{$parameter}"; $ignoreAutoFilter = false; // Special handling of relative date strings if ($details['type'] == 'datetime' || $details['type'] == 'date') { $relativeDateStrings = $this->getRelativeDateStrings(); // Check if the column type is a date/time stamp $isTimestamp = $columnType instanceof UTCDateTimeType || $details['type'] == 'datetime'; $getDate = function (&$string) use($isTimestamp, $relativeDateStrings, &$details, &$func, $not) { $key = array_search($string, $relativeDateStrings); $dtHelper = new DateTimeHelper('midnight today', null, 'local'); $requiresBetween = in_array($func, array('eq', 'neq')) && $isTimestamp; $timeframe = str_replace('mautic.lead.list.', '', $key); $modifier = false; $isRelative = true; switch ($timeframe) { case 'today': case 'tomorrow': case 'yesterday': if ($timeframe == 'yesterday') { $dtHelper->modify('-1 day'); } elseif ($timeframe == 'tomorrow') { $dtHelper->modify('+1 day'); } // Today = 2015-08-28 00:00:00 if ($requiresBetween) { // eq: // field >= 2015-08-28 00:00:00 // field < 2015-08-29 00:00:00 // neq: // field < 2015-08-28 00:00:00 // field >= 2015-08-29 00:00:00 $modifier = '+1 day'; } else { // lt: // field < 2015-08-28 00:00:00 // gt: // field > 2015-08-28 23:59:59 // lte: // field <= 2015-08-28 23:59:59 // gte: // field >= 2015-08-28 00:00:00 if (in_array($func, array('gt', 'lte'))) { $modifier = '+1 day -1 second'; } } break; case 'week_last': case 'week_next': case 'week_this': $interval = str_replace('week_', '', $timeframe); $dtHelper->setDateTime('midnight monday ' . $interval . ' week', null); // This week: Monday 2015-08-24 00:00:00 if ($requiresBetween) { // eq: // field >= Mon 2015-08-24 00:00:00 // field < Mon 2015-08-31 00:00:00 // neq: // field < Mon 2015-08-24 00:00:00 // field >= Mon 2015-08-31 00:00:00 $modifier = '+1 week'; } else { // lt: // field < Mon 2015-08-24 00:00:00 // gt: // field > Sun 2015-08-30 23:59:59 // lte: // field <= Sun 2015-08-30 23:59:59 // gte: // field >= Mon 2015-08-24 00:00:00 if (in_array($func, array('gt', 'lte'))) { $modifier = '+1 week -1 second'; } } break; case 'month_last': case 'month_next': case 'month_this': $interval = substr($key, -4); $dtHelper->setDateTime('midnight first day of ' . $interval . ' month', null); // This month: 2015-08-01 00:00:00 if ($requiresBetween) { // eq: // field >= 2015-08-01 00:00:00 // field < 2015-09:01 00:00:00 // neq: // field < 2015-08-01 00:00:00 // field >= 2016-09-01 00:00:00 $modifier = '+1 month'; } else { // lt: // field < 2015-08-01 00:00:00 // gt: // field > 2015-08-31 23:59:59 // lte: // field <= 2015-08-31 23:59:59 // gte: // field >= 2015-08-01 00:00:00 if (in_array($func, array('gt', 'lte'))) { $modifier = '+1 month -1 second'; } } break; case 'year_last': case 'year_next': case 'year_this': $interval = substr($key, -4); $dtHelper->setDateTime('midnight first day of ' . $interval . ' year', null); // This year: 2015-01-01 00:00:00 if ($requiresBetween) { // eq: // field >= 2015-01-01 00:00:00 // field < 2016-01-01 00:00:00 // neq: // field < 2015-01-01 00:00:00 // field >= 2016-01-01 00:00:00 $modifier = '+1 year'; } else { // lt: // field < 2015-01-01 00:00:00 // gt: // field > 2015-12-31 23:59:59 // lte: // field <= 2015-12-31 23:59:59 // gte: // field >= 2015-01-01 00:00:00 if (in_array($func, array('gt', 'lte'))) { $modifier = '+1 year -1 second'; } } break; default: $isRelative = false; break; } if ($isRelative) { if ($requiresBetween) { $startWith = $isTimestamp ? $dtHelper->toUtcString('Y-m-d H:i:s') : $dtHelper->toUtcString('Y-m-d'); $dtHelper->modify($modifier); $endWith = $isTimestamp ? $dtHelper->toUtcString('Y-m-d H:i:s') : $dtHelper->toUtcString('Y-m-d'); // Use a between statement $func = $func == 'neq' ? 'notBetween' : 'between'; $details['filter'] = array($startWith, $endWith); } else { if ($modifier) { $dtHelper->modify($modifier); } $details['filter'] = $isTimestamp ? $dtHelper->toUtcString('Y-m-d H:i:s') : $dtHelper->toUtcString('Y-m-d'); } } }; if (is_array($details['filter'])) { foreach ($details['filter'] as &$filterValue) { $getDate($filterValue); } } else { $getDate($details['filter']); } } // Generate a unique alias $alias = $this->generateRandomParameterName(); switch ($details['field']) { case 'dnc_bounced': case 'dnc_unsubscribed': // Special handling of do not email $column = str_replace('dnc_', '', $details['field']); $func = $func == 'eq' && $details['filter'] || $func == 'neq' && !$details['filter'] ? 'EXISTS' : 'NOT EXISTS'; $subqb = $this->_em->getConnection()->createQueryBuilder()->select('null')->from(MAUTIC_TABLE_PREFIX . 'email_donotemail', $alias)->where($q->expr()->andX($q->expr()->eq($alias . '.' . $column, $exprParameter), $q->expr()->eq($alias . '.lead_id', 'l.id'))); // Specific lead if (!empty($leadId)) { $subqb->andWhere($subqb->expr()->eq($alias . '.lead_id', $leadId)); } $groupExpr->add(sprintf('%s (%s)', $func, $subqb->getSQL())); // Filter will always be true and differentiated via EXISTS/NOT EXISTS $details['filter'] = true; break; case 'leadlist': case 'tags': // Special handling of lead lists and tags $func = in_array($func, array('eq', 'in')) ? 'EXISTS' : 'NOT EXISTS'; if ($details['field'] == 'leadlist') { $table = 'lead_lists_leads'; $column = 'leadlist_id'; } else { $table = 'lead_tags_xref'; $column = 'tag_id'; } // DBAL requires an array for in() $ignoreAutoFilter = true; foreach ($details['filter'] as &$value) { $value = (int) $value; } $subExpr = $q->expr()->andX($q->expr()->in(sprintf('%s.%s', $alias, $column), $details['filter']), $q->expr()->eq($alias . '.lead_id', 'l.id')); $subqb = $this->_em->getConnection()->createQueryBuilder()->select('null')->from(MAUTIC_TABLE_PREFIX . $table, $alias); // Specific lead if (!empty($leadId)) { $subExpr->add($subqb->expr()->eq($alias . '.lead_id', $leadId)); } if ($table == 'lead_lists_leads') { $falseParameter = $this->generateRandomParameterName(); $subExpr->add($subqb->expr()->eq($alias . '.manually_removed', ":{$falseParameter}")); $parameters[$falseParameter] = false; } $subqb->where($subExpr); $groupExpr->add(sprintf('%s (%s)', $func, $subqb->getSQL())); break; default: switch ($func) { case 'in': case 'notIn': foreach ($details['filter'] as &$value) { $value = $q->expr()->literal(InputHelper::clean($value)); } $groupExpr->add($q->expr()->{$func}($field, $details['filter'])); $ignoreAutoFilter = true; break; case 'between': case 'notBetween': // Filter should be saved with double || to separate options $parameter2 = $this->generateRandomParameterName(); $parameters[$parameter] = $details['filter'][0]; $parameters[$parameter2] = $details['filter'][1]; $exprParameter2 = ":{$parameter2}"; $ignoreAutoFilter = true; if ($func == 'between') { $groupExpr->add($q->expr()->andX($q->expr()->gte($field, $exprParameter), $q->expr()->lt($field, $exprParameter2))); } else { $groupExpr->add($q->expr()->andX($q->expr()->lt($field, $exprParameter), $q->expr()->gte($field, $exprParameter2))); } break; case 'notEmpty': $groupExpr->add($q->expr()->andX($q->expr()->isNotNull($field), $q->expr()->neq($field, $q->expr()->literal('')))); break; case 'empty': $groupExpr->add($q->expr()->orX($q->expr()->isNull($field), $q->expr()->eq($field, $q->expr()->literal('')))); break; case 'neq': $groupExpr->add($q->expr()->orX($q->expr()->isNull($field), $q->expr()->neq($field, $exprParameter))); break; case 'like': case 'notLike': if (strpos($details['filter'], '%') === false) { $details['filter'] = '%' . $details['filter'] . '%'; } default: $groupExpr->add($q->expr()->{$func}($field, $exprParameter)); break; } } if (!$ignoreAutoFilter) { if (!is_array($details['filter'])) { switch ($details['type']) { case 'number': $details['filter'] = (double) $details['filter']; break; case 'boolean': $details['filter'] = (bool) $details['filter']; break; } } $parameters[$parameter] = $details['filter']; } } // Get the last of the filters if ($groupExpr->count()) { $groups[] = $groupExpr; } if (count($groups) === 1) { // Only one andX expression $expr = $groups[0]; } else { // Sets of expressions grouped by OR $orX = $q->expr()->orX(); $orX->addMultiple($groups); // Wrap in a andX for other functions to append $expr = $q->expr()->andX($orX); } return $expr; }