Add survey template list module

This commit is contained in:
Jürgen Mummert
2026-06-08 19:45:20 +02:00
parent 9cc2f98456
commit 7843fca003
7 changed files with 58 additions and 43 deletions
@@ -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();
}
+4 -2
View File
@@ -56,7 +56,7 @@ final class SurveyRepository
/**
* @return list<array<string, mixed>>
*/
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' : ''],
);
}
+1 -1
View File
@@ -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;