Add survey template list module
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
declare(strict_types=1);
|
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_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']['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']['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';
|
$GLOBALS['TL_DCA']['tl_module']['palettes']['survey_results'] = '{title_legend},name,headline,type;{expert_legend:hide},guests,cssID';
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ $GLOBALS['TL_LANG']['MOD']['survey_bundle_categories'] = ['Umfrage-Kategorien',
|
|||||||
|
|
||||||
$GLOBALS['TL_LANG']['FMD']['survey'] = 'Umfragen';
|
$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_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']['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']['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.'];
|
$GLOBALS['TL_LANG']['FMD']['survey_results'] = ['Ergebnisse', 'Zeigt die Ergebnisse einer Umfrage über den konfigurierten Ergebnis-Link an.'];
|
||||||
@@ -5,6 +5,7 @@ $GLOBALS['TL_LANG']['MOD']['survey_bundle_categories'] = ['Survey categories', '
|
|||||||
|
|
||||||
$GLOBALS['TL_LANG']['FMD']['survey'] = 'Surveys';
|
$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_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']['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']['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.'];
|
$GLOBALS['TL_LANG']['FMD']['survey_results'] = ['Results', 'Displays the results of a survey via the configured results link.'];
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
{% include '@Survey/frontend/_survey_branding.html.twig' %}
|
{% include '@Survey/frontend/_survey_branding.html.twig' %}
|
||||||
|
|
||||||
{% set moduleHeadline = (headline is iterable ? headline.text|default('') : headline|default(''))|striptags|trim %}
|
{% set moduleHeadline = (headline is iterable ? headline.text|default('') : headline|default(''))|striptags|trim %}
|
||||||
|
{% set templatesOnly = templatesOnly|default(false) %}
|
||||||
|
|
||||||
<section class="survey-shell survey-grid">
|
<section class="survey-shell survey-grid">
|
||||||
{% for message in app.flashes('success') %}
|
{% for message in app.flashes('success') %}
|
||||||
@@ -45,20 +46,20 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="survey-list-card__footer">
|
<div class="survey-list-card__footer">
|
||||||
<div class="survey-button-row survey-list-card__actions">
|
<div class="survey-button-row survey-list-card__actions">
|
||||||
{% if survey.editUrl %}
|
{% if not templatesOnly and survey.editUrl %}
|
||||||
{% if survey.published %}
|
{% if survey.published %}
|
||||||
<span class="survey-button primary is-disabled" aria-disabled="true">{{ 'survey.list.edit'|trans }}</span>
|
<span class="survey-button primary is-disabled" aria-disabled="true">{{ 'survey.list.edit'|trans }}</span>
|
||||||
{% else %}
|
{% else %}
|
||||||
<a class="survey-button primary" href="{{ survey.editUrl }}">{{ 'survey.list.edit'|trans }}</a>
|
<a class="survey-button primary" href="{{ survey.editUrl }}">{{ 'survey.list.edit'|trans }}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if survey.publicUrl and survey.published %}
|
{% if not templatesOnly and survey.publicUrl and survey.published %}
|
||||||
<a class="survey-button secondary" href="{{ survey.publicUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.public_view'|trans }}</a>
|
<a class="survey-button secondary" href="{{ survey.publicUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.public_view'|trans }}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if survey.draftUrl and not survey.published %}
|
{% if not templatesOnly and survey.draftUrl and not survey.published %}
|
||||||
<a class="survey-button secondary" href="{{ survey.draftUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.draft_view'|trans }}</a>
|
<a class="survey-button secondary" href="{{ survey.draftUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.draft_view'|trans }}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if survey.resultsUrl %}
|
{% if not templatesOnly and survey.resultsUrl %}
|
||||||
<a class="survey-button secondary" href="{{ survey.resultsUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.show_results'|trans }}</a>
|
<a class="survey-button secondary" href="{{ survey.resultsUrl }}" target="_blank" rel="noreferrer">{{ 'survey.list.show_results'|trans }}</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<form method="post" class="survey-question-action-form">
|
<form method="post" class="survey-question-action-form">
|
||||||
@@ -68,6 +69,7 @@
|
|||||||
<input type="hidden" name="_token" value="{{ csrf_token('duplicate-survey-' ~ survey.id) }}">
|
<input type="hidden" name="_token" value="{{ csrf_token('duplicate-survey-' ~ survey.id) }}">
|
||||||
<button class="survey-button secondary" onclick="return confirm('{{ 'survey.list.duplicate_confirm'|trans({'%title%': survey.title|striptags|trim})|e('js') }}');">{{ 'survey.list.duplicate'|trans }}</button>
|
<button class="survey-button secondary" onclick="return confirm('{{ 'survey.list.duplicate_confirm'|trans({'%title%': survey.title|striptags|trim})|e('js') }}');">{{ 'survey.list.duplicate'|trans }}</button>
|
||||||
</form>
|
</form>
|
||||||
|
{% if not templatesOnly %}
|
||||||
<form method="post" class="survey-question-action-form">
|
<form method="post" class="survey-question-action-form">
|
||||||
<input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
|
<input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
|
||||||
<input type="hidden" name="_survey_action" value="delete-survey">
|
<input type="hidden" name="_survey_action" value="delete-survey">
|
||||||
@@ -75,8 +77,10 @@
|
|||||||
<input type="hidden" name="_token" value="{{ csrf_token('delete-survey-' ~ survey.id) }}">
|
<input type="hidden" name="_token" value="{{ csrf_token('delete-survey-' ~ survey.id) }}">
|
||||||
<button class="survey-button danger" onclick="return confirm('{{ 'survey.list.delete_confirm'|trans|e('js') }}') && confirm('{{ 'survey.list.delete_confirm_second'|trans|e('js') }}');">{{ 'survey.list.delete'|trans }}</button>
|
<button class="survey-button danger" onclick="return confirm('{{ 'survey.list.delete_confirm'|trans|e('js') }}') && confirm('{{ 'survey.list.delete_confirm_second'|trans|e('js') }}');">{{ 'survey.list.delete'|trans }}</button>
|
||||||
</form>
|
</form>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% if not templatesOnly %}
|
||||||
<div class="survey-list-card__head-actions">
|
<div class="survey-list-card__head-actions">
|
||||||
<form method="post" class="survey-list-publish-form">
|
<form method="post" class="survey-list-publish-form">
|
||||||
<input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
|
<input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
|
||||||
@@ -104,6 +108,7 @@
|
|||||||
<button type="submit" class="survey-visibility-dot{{ survey.isActive ? ' is-on' : '' }}" title="{{ survey.isActive ? 'survey.edit.deactivate_survey'|trans : 'survey.edit.activate_survey'|trans }}" aria-label="{{ survey.isActive ? 'survey.edit.deactivate_survey'|trans : 'survey.edit.activate_survey'|trans }}"></button>
|
<button type="submit" class="survey-visibility-dot{{ survey.isActive ? ' is-on' : '' }}" title="{{ survey.isActive ? 'survey.edit.deactivate_survey'|trans : 'survey.edit.activate_survey'|trans }}" aria-label="{{ survey.isActive ? 'survey.edit.deactivate_survey'|trans : 'survey.edit.activate_survey'|trans }}"></button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
{% else %}
|
{% else %}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ use Symfony\Component\HttpFoundation\Request;
|
|||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
#[AsFrontendModule(type: 'member_survey_list', category: 'survey', template: 'member_survey_list')]
|
#[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
|
final class MemberSurveyListController extends AbstractFrontendModuleController
|
||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(
|
||||||
@@ -31,12 +32,14 @@ final class MemberSurveyListController extends AbstractFrontendModuleController
|
|||||||
|
|
||||||
protected function getResponse(FragmentTemplate $template, ModuleModel $model, Request $request): Response
|
protected function getResponse(FragmentTemplate $template, ModuleModel $model, Request $request): Response
|
||||||
{
|
{
|
||||||
|
$templatesOnly = 'member_survey_template_list' === (string) ($model->type ?? '');
|
||||||
$user = $this->getUser();
|
$user = $this->getUser();
|
||||||
|
|
||||||
if (!$user instanceof FrontendUser) {
|
if (!$user instanceof FrontendUser) {
|
||||||
$template->set('loginRequired', true);
|
$template->set('loginRequired', true);
|
||||||
$template->set('surveys', []);
|
$template->set('surveys', []);
|
||||||
$template->set('createUrl', null);
|
$template->set('createUrl', null);
|
||||||
|
$template->set('templatesOnly', $templatesOnly);
|
||||||
|
|
||||||
return $template->getResponse();
|
return $template->getResponse();
|
||||||
}
|
}
|
||||||
@@ -45,12 +48,12 @@ final class MemberSurveyListController extends AbstractFrontendModuleController
|
|||||||
return $this->handleAction($request, (int) $user->id);
|
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'));
|
$readerPage = $this->resolvePage((int) $this->getContaoAdapter(Config::class)->get('surveyReaderPage'));
|
||||||
$resultsPage = $this->resolvePage((int) $this->getContaoAdapter(Config::class)->get('surveyResultsPage'));
|
$resultsPage = $this->resolvePage((int) $this->getContaoAdapter(Config::class)->get('surveyResultsPage'));
|
||||||
$items = [];
|
$items = [];
|
||||||
|
|
||||||
foreach ($this->surveyRepository->findEditableByMember((int) $user->id) as $survey) {
|
foreach ($this->surveyRepository->findEditableByMember((int) $user->id, $templatesOnly) as $survey) {
|
||||||
$surveyId = (int) $survey['id'];
|
$surveyId = (int) $survey['id'];
|
||||||
$alias = (string) $survey['alias'];
|
$alias = (string) $survey['alias'];
|
||||||
|
|
||||||
@@ -58,6 +61,7 @@ final class MemberSurveyListController extends AbstractFrontendModuleController
|
|||||||
'id' => $surveyId,
|
'id' => $surveyId,
|
||||||
'title' => (string) $survey['title'],
|
'title' => (string) $survey['title'],
|
||||||
'description' => (string) ($survey['description'] ?? ''),
|
'description' => (string) ($survey['description'] ?? ''),
|
||||||
|
'isTemplate' => !empty($survey['isTemplate']),
|
||||||
'isActive' => !empty($survey['isActive']),
|
'isActive' => !empty($survey['isActive']),
|
||||||
'isLocked' => !empty($survey['isLocked']),
|
'isLocked' => !empty($survey['isLocked']),
|
||||||
'published' => !empty($survey['published']),
|
'published' => !empty($survey['published']),
|
||||||
@@ -72,7 +76,8 @@ final class MemberSurveyListController extends AbstractFrontendModuleController
|
|||||||
|
|
||||||
$template->set('loginRequired', false);
|
$template->set('loginRequired', false);
|
||||||
$template->set('surveys', $items);
|
$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();
|
return $template->getResponse();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ final class SurveyRepository
|
|||||||
/**
|
/**
|
||||||
* @return list<array<string, mixed>>
|
* @return list<array<string, mixed>>
|
||||||
*/
|
*/
|
||||||
public function findEditableByMember(int $memberId): array
|
public function findEditableByMember(int $memberId, bool $templatesOnly = false): array
|
||||||
{
|
{
|
||||||
return $this->connection->fetchAllAssociative(
|
return $this->connection->fetchAllAssociative(
|
||||||
<<<'SQL'
|
<<<'SQL'
|
||||||
@@ -65,6 +65,7 @@ final class SurveyRepository
|
|||||||
s.title,
|
s.title,
|
||||||
s.alias,
|
s.alias,
|
||||||
s.description,
|
s.description,
|
||||||
|
s.isTemplate,
|
||||||
s.published,
|
s.published,
|
||||||
s.isActive,
|
s.isActive,
|
||||||
s.isLocked,
|
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
|
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_content q ON q.pid = s.id
|
||||||
LEFT JOIN tl_survey_submission sub ON sub.survey = s.id
|
LEFT JOIN tl_survey_submission sub ON sub.survey = s.id
|
||||||
|
WHERE s.isTemplate = :isTemplate
|
||||||
GROUP BY s.id
|
GROUP BY s.id
|
||||||
ORDER BY s.title ASC, s.id ASC
|
ORDER BY s.title ASC, s.id ASC
|
||||||
SQL,
|
SQL,
|
||||||
['member' => $memberId],
|
['member' => $memberId, 'isTemplate' => $templatesOnly ? '1' : ''],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ final class SurveyEditorService
|
|||||||
'title' => $this->buildDuplicateTitle((string) $survey->title),
|
'title' => $this->buildDuplicateTitle((string) $survey->title),
|
||||||
'description' => (string) ($survey->description ?? ''),
|
'description' => (string) ($survey->description ?? ''),
|
||||||
'category' => $survey->category,
|
'category' => $survey->category,
|
||||||
'isTemplate' => '1' === (string) ($survey->isTemplate ?? ''),
|
'isTemplate' => false,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$duplicateSurveyId = (int) $duplicate->id;
|
$duplicateSurveyId = (int) $duplicate->id;
|
||||||
|
|||||||
Reference in New Issue
Block a user