Source of file TemplateController.php

Size: 7,514 Bytes - Last Modified: 2023-11-16T22:56:03+01:00

/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/mail-bundle/src/Controller/TemplateController.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
<?php
namespace TIC\MailBundle\Controller;

use TIC\CoreBundle\Base\TICController as BaseController;
#use TIC\DormBundle\Traits\ControllerCrudable;
use TIC\DormBundle\Traits\ControllerItemable;
use TIC\TwigBundle\Traits\ControllerViewable;

use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;

use TIC\MailBundle\Service\MailerService;

/**
 * Administration des modèles de notification par email.
 *
 * @Route("/")
 * @IsGranted("ROLE_ADMIN")
 */
class TemplateController extends BaseController
{
#	use ControllerCrudable;
	use ControllerItemable, ControllerViewable;

	/**
	 * Liste des modèles de notification existants.
	 *
	 * @Route("/list", name="ticmail_template_list")
	 * @Security("is_granted('ROLE_TICMAIL_VIEW')")
	 */
	public function list(Request $request): Response
	{
		// recherche si des modèles restent à définir
		$missings = $this->getRepo()->listAvailableRefs($this->getParameter('tic_mail.templates'));
		if (\count($missings)) $this->alert('warning', array(
			'title' => 'ticmail.alert.undefined_templates',
			'extra' => \implode(", ", $missings),
		));
		
		// génération du formulaire (modal import)
		$form_import = null;
		if ($this->checkRole('TICMAIL_EDIT')) {
			$this->ctxForm = 'TIC\MailBundle\Form\TemplateImportType';
			$form_import = $this->getForm(null, $request, array(
				'action' => $this->generateUrl('ticmail_template_import'),
			));
		}
		
		// affichage de la liste
		return $this->renderAction('list', array(
			'items'    => $this->getRepo()->listAll(),
			'missings' => $missings,
			'form_import' => $form_import,
		));
	}

	/**
	 * Fiche détaillée d'un modèle de notification.
	 *
	 * @Route("/show/{id}", name="ticmail_template_show")
	 * @Security("is_granted('ROLE_TICMAIL_VIEW')")
	 */
	public function show(Request $request, MailerService $mailer, $id): Response
	{
		$config = $this->getParameter('tic_mail.config');
		return $this->renderAction('show', array(
			'item'      => $this->getItem($id),
			'admins'    => $config['admins'],
			'return'    => $config['return'],
			'sender'    => \sprintf('"%s" <%s>', $config['fromname'], $config['fromaddr']),
			'locales'   => $mailer->getLocales(),
			'deflocale' => $this->getParameter('kernel.default_locale'),
		));
	}

	/**
	 * Formulaire d'édition d'un modèle (création ou modification).
	 *
	 * @Route("/create",      name="ticmail_template_create")
	 * @Route("/update/{id}", name="ticmail_template_update")
	 * @Security("is_granted('ROLE_TICMAIL_EDIT')")
	 */
	public function form(Request $request, MailerService $mailer, $id = null): Response
	{
		$item = $this->getItem($id);
		
		// génération du formulaire
		$config = $this->getParameter('tic_mail.config');
		$form = $this->getForm($item, $request, array(
			'list_refs' => $this->getRepo()->listAvailableRefs($this->getParameter('tic_mail.templates'), $item->getRef()),
			'admins'    => $config['admins'],
			'return'    => $config['return'],
			'sender'    => \sprintf('"%s" &lt;%s&gt;', $config['fromname'], $config['fromaddr']),
			'targets'   => $this->getRepo()->getTargets(),
			'formats'   => $config['formats'],
			'locales'   => $mailer->getLocales(),
			'deflocale' => $this->getParameter('kernel.default_locale'),
		));
		
		// validation du formulaire
		if ($form->isSubmitted() and $form->isValid()) return $this->saveItem($item, true);
		
		// affichage du formulaire
		return $this->renderAction('form', array(
			'form' => $form,
			'item' => $item,
			'vars' => $this->getVars($item->getRef()),
		));
	}

	/**
	 * Action d'activation/désactivation de propriétés.
	 *
	 * @Route("/{id}/toggle/{field}/{state}", name="ticmail_template_toggle", defaults={"state":null},
	 *        requirements={"field":"enabled|bccAdmins"})
	 * @Security("is_granted('ROLE_TICMAIL_EDIT')")
	 */
	public function toggle(Request $request, $id, $field, $state = null): Response
	{
		// modification de la propriété, enregistrement avec message et redirection par défaut (referer)
		return $this->toggleItem($this->getItem($id), $field, $state);
	}

	/**
	 * Suppression d'un modèle de notification existant.
	 *
	 * @Route("/delete/{id}", name="ticmail_template_delete")
	 * @Security("is_granted('ROLE_TICMAIL_FULL')")
	 */
	public function delete(Request $request, $id): Response
	{
#		return $this->crudDelete($request, $id);
		$item = $this->getItem($id);
		
		if (false === $this->checkCSRF('delete'.$id, $request))
			return $this->alert('danger', "error.csrf.invalid_token", $item);
		
		return $this->deleteItem($item, true);
	}

	/**
	 * Export des données d'un modèle donné ou de tous les modèles.
	 * Note : utilisation des formats Mail (MIME) et Mbox pour la concaténation des messages
	 *
	 * @Route("/export/{id}", name="ticmail_template_export", defaults={"id"="0"})
	 * @Security("is_granted('ROLE_TICMAIL_VIEW')")
	 */
	public function export(Request $request, $id = null)
	{
		return new StreamedResponse(function() use ($id) {
			if (empty($id)) {
				foreach ($this->getRepo()->listAll() as $item) echo $item->exportMail();
			} else {
				$item = $this->getItem($id);
				if ($item) echo $item->exportMail();
			}
		}, 200, array(
			'Content-Disposition' => \sprintf('attachment; filename="templates-%s.eml";', \date('Ymd_His')),
		));
	}

	/**
	 * Import des données de modèles uploadés au format Mail/Mbox (cf export).
	 *
	 * @Route("/import", name="ticmail_template_import")
	 * @Security("is_granted('ROLE_TICMAIL_EDIT')")
	 */
	public function import(Request $request): RedirectResponse
	{
		// génération du formulaire d'import
		$this->ctxForm = 'TIC\MailBundle\Form\TemplateImportType';
		$form = $this->getForm(null, $request);
		
		// validation du formulaire d'import
		if ($form->isValid()) {
			$file = $form->get('messages')->getData()->openFile('r');
			$rc = $this->getRepo()->importMail($file);
			if ($rc === true) return $this->alert('success', 'ticmail.alert.templates_import_ok', true);
			if ($rc === null) return $this->alert('warning', 'ticmail.alert.templates_import_no', true);
			return $this->alert('danger', array('title'=>'ticmail.alert.templates_import_err', 'text'=>$rc), true);
		}
		
		// affichage de la liste (contenant le formulaire d'import en modal)
		return $this->alert('warning', 'ticmail.alert.templates_import_no', true);
	}

	/**
	 * Récupération des variables utilisables pour un modèle donnée.
	 *
	 * @param   string  $ref    Référence du modèle édité.
	 * @return  array           Liste des variables rangées par groupes
	 */
	protected function getVars(string $ref = null): ?array
	{
		if ($ref === null) return null;
		
		$vargroups = $this->getParameter('tic_mail.vargroups');
		$variables = $this->getParameter('tic_mail.variables');
		
		if (! \is_array($vargroups))               return null;
		if (! \is_array($variables))               return null;
		if (! \array_key_exists($ref, $vargroups)) return null;
		if (! \is_array($vargroups[ $ref ]))       return null;
		
		$vars = array();
		foreach ($vargroups[ $ref ] as $group) {
			if (\is_array($group)) $vars['_'] = $group;
			elseif (\array_key_exists($group, $variables)) $vars[ $group ] = $variables[ $group ];
		}
		return $vars;
	}

}