From 7843fca003217febd41a55853952e2aaca998c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrgen=20Mummert?= Date: Mon, 8 Jun 2026 19:45:20 +0200 Subject: [PATCH] Add survey template list module --- contao/dca/tl_module.php | 1 + contao/languages/de/modules.php | 1 + contao/languages/en/modules.php | 1 + .../frontend/member_survey_list.html.twig | 79 ++++++++++--------- .../MemberSurveyListController.php | 11 ++- src/Repository/SurveyRepository.php | 6 +- src/Service/SurveyEditorService.php | 2 +- 7 files changed, 58 insertions(+), 43 deletions(-) diff --git a/contao/dca/tl_module.php b/contao/dca/tl_module.php index 07d82c5..0a67470 100644 --- a/contao/dca/tl_module.php +++ b/contao/dca/tl_module.php @@ -3,6 +3,7 @@ declare(strict_types=1); $GLOBALS['TL_DCA']['tl_module']['palettes']['member_survey_list'] = '{title_legend},name,headline,type;{survey_navigation_legend},surveyEditPage;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID'; +$GLOBALS['TL_DCA']['tl_module']['palettes']['member_survey_template_list'] = '{title_legend},name,headline,type;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID'; $GLOBALS['TL_DCA']['tl_module']['palettes']['member_survey_edit'] = '{title_legend},name,headline,type;{survey_navigation_legend},surveyListPage;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID'; $GLOBALS['TL_DCA']['tl_module']['palettes']['show_survey'] = '{title_legend},name,headline,type;{expert_legend:hide},guests,cssID'; $GLOBALS['TL_DCA']['tl_module']['palettes']['survey_results'] = '{title_legend},name,headline,type;{expert_legend:hide},guests,cssID'; diff --git a/contao/languages/de/modules.php b/contao/languages/de/modules.php index c42f870..1b032fa 100644 --- a/contao/languages/de/modules.php +++ b/contao/languages/de/modules.php @@ -5,6 +5,7 @@ $GLOBALS['TL_LANG']['MOD']['survey_bundle_categories'] = ['Umfrage-Kategorien', $GLOBALS['TL_LANG']['FMD']['survey'] = 'Umfragen'; $GLOBALS['TL_LANG']['FMD']['member_survey_list'] = ['Meine Umfragen', 'Zeigt alle dem Mitglied zugewiesenen Umfragen an.']; +$GLOBALS['TL_LANG']['FMD']['member_survey_template_list'] = ['Meine Umfrage-Vorlagen', 'Zeigt alle dem Mitglied zugewiesenen Umfrage-Vorlagen an und bietet nur das Duplizieren an.']; $GLOBALS['TL_LANG']['FMD']['member_survey_edit'] = ['Umfrage bearbeiten', 'Bearbeitungsbereich für zugewiesene Umfragen im Frontend.']; $GLOBALS['TL_LANG']['FMD']['show_survey'] = ['Umfrage ausfüllen', 'Öffentliche Umfrageansicht über den öffentlichen Link.']; $GLOBALS['TL_LANG']['FMD']['survey_results'] = ['Ergebnisse', 'Zeigt die Ergebnisse einer Umfrage über den konfigurierten Ergebnis-Link an.']; \ No newline at end of file diff --git a/contao/languages/en/modules.php b/contao/languages/en/modules.php index b7da7ec..ad59566 100644 --- a/contao/languages/en/modules.php +++ b/contao/languages/en/modules.php @@ -5,6 +5,7 @@ $GLOBALS['TL_LANG']['MOD']['survey_bundle_categories'] = ['Survey categories', ' $GLOBALS['TL_LANG']['FMD']['survey'] = 'Surveys'; $GLOBALS['TL_LANG']['FMD']['member_survey_list'] = ['My surveys', 'Displays all surveys assigned to the member.']; +$GLOBALS['TL_LANG']['FMD']['member_survey_template_list'] = ['My survey templates', 'Displays all survey templates assigned to the member and only offers duplication.']; $GLOBALS['TL_LANG']['FMD']['member_survey_edit'] = ['Edit survey', 'Frontend editing area for assigned surveys.']; $GLOBALS['TL_LANG']['FMD']['show_survey'] = ['Fill out survey', 'Public survey view accessible via the public link.']; $GLOBALS['TL_LANG']['FMD']['survey_results'] = ['Results', 'Displays the results of a survey via the configured results link.']; \ No newline at end of file diff --git a/contao/templates/frontend/member_survey_list.html.twig b/contao/templates/frontend/member_survey_list.html.twig index 8da4cd8..bc926f5 100644 --- a/contao/templates/frontend/member_survey_list.html.twig +++ b/contao/templates/frontend/member_survey_list.html.twig @@ -4,6 +4,7 @@ {% include '@Survey/frontend/_survey_branding.html.twig' %} {% set moduleHeadline = (headline is iterable ? headline.text|default('') : headline|default(''))|striptags|trim %} +{% set templatesOnly = templatesOnly|default(false) %}
{% for message in app.flashes('success') %} @@ -45,20 +46,20 @@ {% else %} diff --git a/src/Controller/FrontendModule/MemberSurveyListController.php b/src/Controller/FrontendModule/MemberSurveyListController.php index 60ff64b..e700236 100644 --- a/src/Controller/FrontendModule/MemberSurveyListController.php +++ b/src/Controller/FrontendModule/MemberSurveyListController.php @@ -20,6 +20,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; #[AsFrontendModule(type: 'member_survey_list', category: 'survey', template: 'member_survey_list')] +#[AsFrontendModule(type: 'member_survey_template_list', category: 'survey', template: 'member_survey_list')] final class MemberSurveyListController extends AbstractFrontendModuleController { public function __construct( @@ -31,12 +32,14 @@ final class MemberSurveyListController extends AbstractFrontendModuleController protected function getResponse(FragmentTemplate $template, ModuleModel $model, Request $request): Response { + $templatesOnly = 'member_survey_template_list' === (string) ($model->type ?? ''); $user = $this->getUser(); if (!$user instanceof FrontendUser) { $template->set('loginRequired', true); $template->set('surveys', []); $template->set('createUrl', null); + $template->set('templatesOnly', $templatesOnly); return $template->getResponse(); } @@ -45,12 +48,12 @@ final class MemberSurveyListController extends AbstractFrontendModuleController return $this->handleAction($request, (int) $user->id); } - $editPage = $this->resolvePage((int) ($model->surveyEditPage ?? 0)); + $editPage = $templatesOnly ? null : $this->resolvePage((int) ($model->surveyEditPage ?? 0)); $readerPage = $this->resolvePage((int) $this->getContaoAdapter(Config::class)->get('surveyReaderPage')); $resultsPage = $this->resolvePage((int) $this->getContaoAdapter(Config::class)->get('surveyResultsPage')); $items = []; - foreach ($this->surveyRepository->findEditableByMember((int) $user->id) as $survey) { + foreach ($this->surveyRepository->findEditableByMember((int) $user->id, $templatesOnly) as $survey) { $surveyId = (int) $survey['id']; $alias = (string) $survey['alias']; @@ -58,6 +61,7 @@ final class MemberSurveyListController extends AbstractFrontendModuleController 'id' => $surveyId, 'title' => (string) $survey['title'], 'description' => (string) ($survey['description'] ?? ''), + 'isTemplate' => !empty($survey['isTemplate']), 'isActive' => !empty($survey['isActive']), 'isLocked' => !empty($survey['isLocked']), 'published' => !empty($survey['published']), @@ -72,7 +76,8 @@ final class MemberSurveyListController extends AbstractFrontendModuleController $template->set('loginRequired', false); $template->set('surveys', $items); - $template->set('createUrl', $editPage instanceof PageModel ? $this->generateContentUrl($editPage, ['create' => '1']) : null); + $template->set('createUrl', !$templatesOnly && $editPage instanceof PageModel ? $this->generateContentUrl($editPage, ['create' => '1']) : null); + $template->set('templatesOnly', $templatesOnly); return $template->getResponse(); } diff --git a/src/Repository/SurveyRepository.php b/src/Repository/SurveyRepository.php index be65552..4a36a49 100644 --- a/src/Repository/SurveyRepository.php +++ b/src/Repository/SurveyRepository.php @@ -56,7 +56,7 @@ final class SurveyRepository /** * @return list> */ - public function findEditableByMember(int $memberId): array + public function findEditableByMember(int $memberId, bool $templatesOnly = false): array { return $this->connection->fetchAllAssociative( <<<'SQL' @@ -65,6 +65,7 @@ final class SurveyRepository s.title, s.alias, s.description, + s.isTemplate, s.published, s.isActive, s.isLocked, @@ -75,10 +76,11 @@ final class SurveyRepository INNER JOIN tl_survey_editor e ON COALESCE(NULLIF(e.survey, 0), e.pid) = s.id AND e.member = :member LEFT JOIN tl_survey_content q ON q.pid = s.id LEFT JOIN tl_survey_submission sub ON sub.survey = s.id + WHERE s.isTemplate = :isTemplate GROUP BY s.id ORDER BY s.title ASC, s.id ASC SQL, - ['member' => $memberId], + ['member' => $memberId, 'isTemplate' => $templatesOnly ? '1' : ''], ); } diff --git a/src/Service/SurveyEditorService.php b/src/Service/SurveyEditorService.php index b858e5b..2a3dfd0 100644 --- a/src/Service/SurveyEditorService.php +++ b/src/Service/SurveyEditorService.php @@ -111,7 +111,7 @@ final class SurveyEditorService 'title' => $this->buildDuplicateTitle((string) $survey->title), 'description' => (string) ($survey->description ?? ''), 'category' => $survey->category, - 'isTemplate' => '1' === (string) ($survey->isTemplate ?? ''), + 'isTemplate' => false, ]); $duplicateSurveyId = (int) $duplicate->id;