Source of file SendNotificationCommand.php

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

/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/mail-bundle/src/Command/SendNotificationCommand.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
<?php
namespace TIC\MailBundle\Command;

use TIC\CoreBundle\Base\TICCommand as BaseCommand;

use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

use TIC\MailBundle\Service\MailerService;

/**
 * Commande de génération et d'envoi de notification par email.
 */
class SendNotificationCommand extends BaseCommand
{
	use \TIC\DormBundle\Traits\ManagerTrait;

	protected $mailer;

	/**
	 * DI avec auto-wiring (inutile de définir le "call" sur le service grace à l'attribut @required).
	 * @see https://symfony.com/doc/current/service_container/injection_types.html#setter-injection
	 * @see https://symfony.com/doc/current/service_container/autowiring.html#autowiring-other-methods-e-g-setters-and-public-typed-properties
	 * 
	 * @required
	 */
	public function setMailer(MailerService $mailer): void
	{
		$this->mailer = $mailer;
	}

	/**
	 * {@inheritdoc}
	 */
	protected function configure(): void
	{
		parent::configure();
		$this
			->setDescription("Commande de génération et d'envoi de notification par email.")
			->addArgument('ref',                InputArgument::OPTIONAL,        "Référence du modèle de notification à utiliser")
			->addOption('to',       null,       InputOption::VALUE_REQUIRED,    "Adresse email du destinataire")
			->addOption('data',     null,       InputOption::VALUE_REQUIRED,    "Chaine JSON des données à passer aux templates")
			->addOption('locale',   null,       InputOption::VALUE_REQUIRED,    "Langue à utiliser pour générer les messages")
			->setHelp("Lancer la commande sans préciser le modèle (ref) affichera la liste des modèles disponibles")
		;
	}

	/**
	 * {@inheritdoc}
	 */
	protected function execute(InputInterface $input, OutputInterface $output): int
	{
		$ref = $input->getArgument('ref');
		if ($ref === null) return $this->listrefs();
		
		$to = $input->getOption('to');
		if ($to === null) $to = 'root@localhost';
		
		$data = $input->getOption('data');
		if ($data) {
			if (\strpos($data, '"') === false) $data = \strtr($data, "'", '"');
			$data = \json_decode($data, true);
		}
		if ($data === null) $data = array();
		
		$locale = $input->getOption('locale');
		
		return $this->sendmail($ref, $to, $data, $locale);
	}

	/**
	 * Retourne la liste des modèles de notification disponibles.
	 */
	protected function listrefs(): int
	{
		$rows = array();
		foreach ($this->getRepo('Template')->findAll() as $template) {
			$rows[] = array($template->getRef(), $template->getTarget(), \substr($template->getLabel(), 0, 60));
		}
		$this->io->title("Liste des modèles de notifications disponibles");
		$this->io->table(array("Ref", "Target", "Label"), $rows);
		return self::SUCCESS;
	}

	/**
	 * Génère et envoi par email un message de notification.
	 * 
	 * @param   string          $ref        Référence du modèle de notification (cf mailer_templates dans parameters.yml)
	 * @param   string|array    $to         Adresses mail des destinataires (chaine avec virgule en séparateur acceptée)
	 * @param   array           $data       Liste clé/valeur pour les substitutions des templates
	 * @param   string          $locale     Spécifie la locale à utiliser pour les templates
	 * @param   string|array    $pjs        Pièces-jointes (chemin ou structure {'name':, 'type':, 'data':}, seul ou en liste)
	 */
	protected function sendmail(string $ref, mixed $to, array $data = [], string $locale = null, mixed $pjs = []): int
	{
		$this->io->section(sprintf("Notification [%s] pour <%s>", $ref, $to));
		
		// Préparation, composition puis envoi d'un message PLAIN et/ou HTML (méthode "combo")
#		$data['locale'] = $locale;
#		$nb = $this->mailer->notify($ref, $to, $data, $pjs);
		
		// Préparation d'un message à envoyer (instance Symfony Email & environnement Twig)
		$message = $this->mailer->prepare($ref, $to, $pjs, $locale);
		if ($message === null) $this->exitError("Failed to prepare Email message:\n" . $this->mailer->getLastError());
		
		// Composition du contenu textuel d'un message (rendu des vues Twig)
		$rc = $this->mailer->compose($message, $data, $ref);
		if (! $rc) $this->exitError("Failed to compose Email message:\n" . $this->mailer->getLastError());
		
		// Affichage et debug du message généré
		if ($this->out->isDebug()) dump($message);
		elseif ($this->out->isVerbose()) {
			$charset = $message->getTextCharset();
			if ($charset) $this->io->block($message->getTextBody(), null, null, ' | ', false);
			$charset = $message->getHtmlCharset();
			if ($charset) $this->io->block($message->getHtmlBody(), null, null, ' | ', false);
		}
		
		// Envoi un message préparé (sans logs)
		if (! $this->test) {
			$rc = $this->mailer->send($message, $ref);
			if (empty($rc)) $this->exitError("No message sent!");
			if ($rc < 0) $this->exitError("Failed to send Email message:\n" . $this->mailer->getLastError(), \abs($rc));
			$this->io->success("Done: $rc message(s) successfully sent.");
		}
		return self::SUCCESS;
	}

}