예제 #1
0
 /**
  * @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);
 }
예제 #2
0
 /**
  * @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);
 }
예제 #4
0
 /**
  * @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);
 }
예제 #5
0
 /**
  * @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);
 }
예제 #6
0
 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);
 }
예제 #7
0
 /**
  * @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);
 }
예제 #8
0
 /**
  * @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);
 }
예제 #9
0
 /**
  * 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);
 }
예제 #10
0
 /**
  * @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);
 }
예제 #11
0
 /**
  * @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);
 }
예제 #12
0
 /**
  * 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;
 }
예제 #13
0
 /**
  * @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);
 }
예제 #14
0
 /**
  * @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);
 }
예제 #15
0
 /**
  * @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);
 }
예제 #16
0
 /**
  * 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);
 }
예제 #17
0
 /**
  * @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);
 }
예제 #18
0
 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']);
 }
예제 #19
0
 /**
  * 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);
 }
예제 #21
0
 /**
  * @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];
     }
 }
예제 #22
0
 /**
  * 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()));
 }
예제 #23
0
 /**
  * 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);
         }
     }
 }
예제 #24
0
 /**
  * @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)));
 }
예제 #25
0
 /**
  * @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));
 }
예제 #26
0
 /**
  * @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);
 }
예제 #27
0
 /**
  * @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));
 }
예제 #28
0
 /**
  * @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()])]]);
 }
예제 #29
0
 /**
  * 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()]);
 }
예제 #30
0
 /**
  * @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;
 }