<?php
namespace App\Controller;
use App\Form\FluxDurationGetDurationMoodleYpareoSettingsType;
use App\Form\FluxDurationSendDurationMoodleYpareoSettingsType;
use App\Form\FluxGeneralSettingsType;
use App\Form\FluxInscriptionYpareoMoodleSettingsType;
use App\Service\Settings\SettingsFlux;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Yaml\Exception\ParseException;
class SettingsController extends AbstractController
{
private SettingsFlux $settingsFlux;
public function __construct(SettingsFlux $settingsFlux)
{
$this->settingsFlux = $settingsFlux;
}
/**
* @Route("/", name="app_settings")
*/
public function index(): Response
{
try {
// Recupération des settings
$settingsGeneral = $this->settingsFlux->getFluxGeneralSettings();
$settingsFluxInscription = $this->settingsFlux->getFluxInscriptionYpareoMoodleSettings();
$settingsFluxDurationGetDuration = $this->settingsFlux->getFluxDurationGetDurationMoodleYpareo();
$settingsFluxDurationSendDuration = $this->settingsFlux->getFluxDurationSendDurationMoodleYpareo();
} catch (ParseException $exception) {
printf('Unable to parse the YAML array: %s', $exception->getMessage());
}
return $this->render('settings_flux/index.html.twig', [
SettingsFlux::FLUX_GENERAL => [
'fields_order' => [
'notification',
'ypareo',
],
'settings' => $settingsGeneral,
],
SettingsFlux::FLUX_INSCRIPTION_YPAREO_MOODLE => [
'fields_order' => [
'cron_is_enabled',
'cron_schedule',
'groupe_formation_limit',
'formation_period',
'formation_api_filters',
'prefixes',
'student_role',
'access_formation_period',
],
'settings' => $settingsFluxInscription,
],
SettingsFlux::FLUX_DURATION_GET_DURATION_MOODLE_YPAREO => [
'fields_order' => [
'cron_is_enabled',
'cron_schedule',
'groupe_formation_limit',
'formation_period',
],
'settings' => $settingsFluxDurationGetDuration,
],
SettingsFlux::FLUX_DURATION_SEND_DURATION_MOODLE_YPAREO => [
'fields_order' => [
'cron_is_enabled',
'cron_schedule',
],
'settings' => $settingsFluxDurationSendDuration,
],
]);
}
/**
* @Route("/config/general", name="app_general_settings")
*/
public function generalSettings(Request $request): Response
{
return $this->manageFluxSettingsForm(
$request,
FluxGeneralSettingsType::class,
'fluxGeneralSettings',
'settings_flux/flux_general.html.twig'
);
}
/**
* @Route("/config/flux-inscription-ypareo-moodle", name="app_flux_inscription_ypareo_moodle_settings")
*/
public function fluxInscriptionYpareoMoodleSettings(Request $request): Response
{
return $this->manageFluxSettingsForm(
$request,
FluxInscriptionYpareoMoodleSettingsType::class,
'fluxInscriptionYpareoMoodleSettings',
'settings_flux/flux_inscription_ypareo_moodle.html.twig'
);
}
/**
* @Route("/config/flux-duration-get-duration", name="app_flux_duration_get_duration_ypareo_moodle_settings")
*/
public function fluxDurationGetDurationMoodleYpareoSettings(Request $request): Response
{
return $this->manageFluxSettingsForm(
$request,
FluxDurationGetDurationMoodleYpareoSettingsType::class,
'fluxDurationGetDurationMoodleYpareo',
'settings_flux/flux_duration_get_duration_moodle_ypareo.html.twig'
);
}
/**
* @Route("/config/flux-duration-not-sent", name="app_flux_duration_send_duration_ypareo_moodle_settings")
*/
public function fluxDurationSendDurationMoodleYpareoSettings(Request $request): Response
{
return $this->manageFluxSettingsForm(
$request,
FluxDurationSendDurationMoodleYpareoSettingsType::class,
'fluxDurationSendDurationMoodleYpareo',
'settings_flux/flux_duration_send_duration_moodle_ypareo.html.twig'
);
}
protected function manageFluxSettingsForm(
Request $request,
string $formType,
string $fluxAttribute,
string $template
): Response {
$getSettingsMethodName = 'get'.ucfirst($fluxAttribute);
$setSettingsMethodName = 'set'.ucfirst($fluxAttribute);
// Récupération des settings
$settings = $this->settingsFlux->{$getSettingsMethodName}();
// Gestion du formulaire
$form = $this->createForm($formType, $settings);
$form->handleRequest($request);
// Si le formulaire a été envoyé et les données sont valides
if ($form->isSubmitted() && $form->isValid()) {
if ($form->getData() !== $settings) {
// Mis à jour des settings
$this->settingsFlux->{$setSettingsMethodName}($form->getData());
$this->addFlash('success', 'La configuration du flux a bien été mise à jour');
}
return $this->redirectToRoute('app_settings');
}
return $this->render($template, [
'form' => $form->createView(),
]);
}
}