Spaces:
No application file
No application file
| namespace Mautic\FormBundle\Entity; | |
| use Doctrine\ORM\Query\Expr\Join; | |
| use Mautic\CoreBundle\Entity\CommonRepository; | |
| /** | |
| * @extends CommonRepository<Form> | |
| */ | |
| class FormRepository extends CommonRepository | |
| { | |
| public function getEntities(array $args = []) | |
| { | |
| // use a subquery to get a count of submissions otherwise doctrine will not pull all of the results | |
| $sq = $this->_em->createQueryBuilder() | |
| ->select('count(fs.id)') | |
| ->from(Submission::class, 'fs') | |
| ->where('fs.form = f'); | |
| $q = $this->createQueryBuilder('f'); | |
| $q->select('f, ('.$sq->getDql().') as submission_count'); | |
| $q->leftJoin('f.category', 'c'); | |
| $args['qb'] = $q; | |
| return parent::getEntities($args); | |
| } | |
| /** | |
| * @param string $search | |
| * @param int $limit | |
| * @param int $start | |
| * @param bool $viewOther | |
| */ | |
| public function getFormList($search = '', $limit = 10, $start = 0, $viewOther = false, $formType = null): array | |
| { | |
| $q = $this->createQueryBuilder('f'); | |
| $q->select('partial f.{id, name, alias}'); | |
| if (!empty($search)) { | |
| $q->andWhere($q->expr()->like('f.name', ':search')) | |
| ->setParameter('search', "{$search}%"); | |
| } | |
| if (!$viewOther) { | |
| $q->andWhere($q->expr()->eq('f.createdBy', ':id')) | |
| ->setParameter('id', $this->currentUser->getId()); | |
| } | |
| if (!empty($formType)) { | |
| $q->andWhere( | |
| $q->expr()->eq('f.formType', ':type') | |
| )->setParameter('type', $formType); | |
| } | |
| $q->orderBy('f.name'); | |
| if (!empty($limit)) { | |
| $q->setFirstResult($start) | |
| ->setMaxResults($limit); | |
| } | |
| return $q->getQuery()->getArrayResult(); | |
| } | |
| protected function addCatchAllWhereClause($q, $filter): array | |
| { | |
| return $this->addStandardCatchAllWhereClause($q, $filter, [ | |
| 'f.name', | |
| 'f.description', | |
| ]); | |
| } | |
| protected function addSearchCommandWhereClause($q, $filter): array | |
| { | |
| [$expr, $standardSearchParameters] = $this->addStandardSearchCommandWhereClause($q, $filter); | |
| if ($expr) { | |
| return [$expr, $standardSearchParameters]; | |
| } | |
| $command = $filter->command; | |
| $unique = $this->generateRandomParameterName(); | |
| $parameters = []; | |
| $returnParameter = false; // returning a parameter that is not used will lead to a Doctrine error | |
| switch ($command) { | |
| case $this->translator->trans('mautic.form.form.searchcommand.isexpired'): | |
| case $this->translator->trans('mautic.form.form.searchcommand.isexpired', [], null, 'en_US'): | |
| $expr = $q->expr()->andX( | |
| $q->expr()->eq('f.isPublished', ":$unique"), | |
| $q->expr()->isNotNull('f.publishDown'), | |
| $q->expr()->neq('f.publishDown', $q->expr()->literal('')), | |
| $q->expr()->lt('f.publishDown', 'CURRENT_TIMESTAMP()') | |
| ); | |
| $forceParameters = [$unique => true]; | |
| break; | |
| case $this->translator->trans('mautic.form.form.searchcommand.ispending'): | |
| case $this->translator->trans('mautic.form.form.searchcommand.ispending', [], null, 'en_US'): | |
| $expr = $q->expr()->andX( | |
| $q->expr()->eq('f.isPublished', ":$unique"), | |
| $q->expr()->isNotNull('f.publishUp'), | |
| $q->expr()->neq('f.publishUp', $q->expr()->literal('')), | |
| $q->expr()->gt('f.publishUp', 'CURRENT_TIMESTAMP()') | |
| ); | |
| $forceParameters = [$unique => true]; | |
| break; | |
| case $this->translator->trans('mautic.form.form.searchcommand.hasresults'): | |
| case $this->translator->trans('mautic.form.form.searchcommand.hasresults', [], null, 'en_US'): | |
| $sq = $this->getEntityManager()->createQueryBuilder(); | |
| $subquery = $sq->select('count(s.id)') | |
| ->from(Submission::class, 's') | |
| ->leftJoin(Form::class, 'f2', | |
| Join::WITH, | |
| $sq->expr()->eq('s.form', 'f2') | |
| ) | |
| ->where( | |
| $q->expr()->eq('s.form', 'f') | |
| ) | |
| ->getDql(); | |
| $expr = $q->expr()->gt(sprintf('(%s)', $subquery), 1); | |
| break; | |
| case $this->translator->trans('mautic.core.searchcommand.name'): | |
| case $this->translator->trans('mautic.core.searchcommand.name', [], null, 'en_US'): | |
| $expr = $q->expr()->like('f.name', ':'.$unique); | |
| $returnParameter = true; | |
| break; | |
| } | |
| if ($expr && $filter->not) { | |
| $expr = $q->expr()->not($expr); | |
| } | |
| if (!empty($forceParameters)) { | |
| $parameters = $forceParameters; | |
| } elseif ($returnParameter) { | |
| $string = ($filter->strict) ? $filter->string : "%{$filter->string}%"; | |
| $parameters = ["$unique" => $string]; | |
| } | |
| return [ | |
| $expr, | |
| $parameters, | |
| ]; | |
| } | |
| /** | |
| * Fetch the form results. | |
| * | |
| * @throws \Doctrine\ORM\NoResultException | |
| * @throws \Doctrine\ORM\NonUniqueResultException | |
| */ | |
| public function getFormResults(Form $form, array $options = []): array | |
| { | |
| $query = $this->_em->getConnection()->createQueryBuilder(); | |
| $query->from(MAUTIC_TABLE_PREFIX.'form_submissions', 'fs') | |
| ->select('fr.*') | |
| ->leftJoin('fs', $this->getResultsTableName($form->getId(), $form->getAlias()), 'fr', 'fr.submission_id = fs.id') | |
| ->where('fs.form_id = :formId') | |
| ->setParameter('formId', $form->getId()); | |
| if (!empty($options['leadId'])) { | |
| $query->andWhere('fs.lead_id = '.(int) $options['leadId']); | |
| } | |
| if (!empty($options['formId'])) { | |
| $query->andWhere($query->expr()->eq('fs.form_id', ':id')) | |
| ->setParameter('id', $options['formId']); | |
| } | |
| if (!empty($options['limit'])) { | |
| $query->setMaxResults((int) $options['limit']); | |
| } | |
| return $query->executeQuery()->fetchAllAssociative(); | |
| } | |
| /** | |
| * Compile and return the form result table name. | |
| * | |
| * @param int $formId | |
| * @param string $formAlias | |
| */ | |
| public function getResultsTableName($formId, $formAlias): string | |
| { | |
| return MAUTIC_TABLE_PREFIX.'form_results_'.$formId.'_'.$formAlias; | |
| } | |
| public function getFormTableIdViaResults(string $resultsTableName): ?string | |
| { | |
| $regexp = '/.*'.MAUTIC_TABLE_PREFIX.'form_results_([0-9]+)_(.*)/i'; | |
| preg_match($regexp, $resultsTableName, $matches); | |
| return $matches[1] ?? null; | |
| } | |
| /** | |
| * @return string[] | |
| */ | |
| public function getSearchCommands(): array | |
| { | |
| $commands = [ | |
| 'mautic.core.searchcommand.ispublished', | |
| 'mautic.core.searchcommand.isunpublished', | |
| 'mautic.core.searchcommand.isuncategorized', | |
| 'mautic.core.searchcommand.ismine', | |
| 'mautic.form.form.searchcommand.isexpired', | |
| 'mautic.form.form.searchcommand.ispending', | |
| 'mautic.form.form.searchcommand.hasresults', | |
| 'mautic.core.searchcommand.category', | |
| 'mautic.core.searchcommand.name', | |
| ]; | |
| return array_merge($commands, parent::getSearchCommands()); | |
| } | |
| protected function getDefaultOrder(): array | |
| { | |
| return [ | |
| ['f.name', 'ASC'], | |
| ]; | |
| } | |
| public function getTableAlias(): string | |
| { | |
| return 'f'; | |
| } | |
| } | |