Source of file TemplateRepository.php

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

/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/mail-bundle/src/Repository/TemplateRepository.php

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
<?php
namespace TIC\MailBundle\Repository;

#use Doctrine\ORM\EntityRepository as BaseRepository;
use TIC\DormBundle\Base\TICRepository as BaseRepository;
use TIC\MailBundle\Entity\Template as Entity;

/**
 * Repository pour requêtes sur les entités des modèles de notification.
 *
 * @TODO voir si usage des traits RepositoryFilterable + optims PHP
 */
class TemplateRepository extends BaseRepository
{
	/**
	 * @var Listing default order
	 */
	public $sortBy = ['ref' => 'ASC'];

	/**
	 * Liste des différentes valeurs existantes pour le champs 'target'.
	 * (permet l'alimentation des suggestions pour formulaire avec type_ahead)
	 *
	 * @return  array               Liste des différentes valeurs correspondantes
	 */
	public function getTargets(): array
	{
		return $this->getFieldValues('target');
	}

	/**
	 * Liste des modèles de notification restants à définir.
	 * (permet l'alimentation du sélecteur de références sur édition/création)
	 *
	 * @param   array   $templates  Liste de toutes les références de modèles possibles
	 * @param   string  $current    Référence à considérer disponible (exclue de la recherche)
	 * @return  array               Liste des références possibles non existantes (+ courante éventuelle)
	 */
	public function listAvailableRefs(array $templates, string $current = null): array
	{
		if ($current === null) $current = '';
		
		$available = \array_combine($templates, $templates);
		
		$existing = $this->createQueryBuilder('m')
			->select('m.ref')
			->where('m.ref != :ref')
			->setParameter('ref', $current)
			->getQuery()->getResult('column');
		;
		foreach ($existing as $ref) unset($available[$ref]);
		
		return $available;
	}

	/**
	 * Analyse un fichier au format Mail/Mbox pour importer les données.
	 * (extraction dans un tableau associatif servant à initialiser chaque entité)
	 *
	 * @param   object  $fileinfo   Instance SplFileInfo du fichier à importer
	 * @return  string              Message de l'exception en cas d'échec, ou Null si succès
	 */
	public function importMail(object $fileinfo): ?string
	{
		$file = $fileinfo->openFile('r');
		
		$messages = array();
		while (! $file->eof()) {
			$data = array();
			
			// lecture des entêtes du message
			$header = null;
			while (! $file->eof()) {
				$line = \rtrim($file->fgets(), "\r\n");
				if (($line === '') && ($header !== null)) break;
				if (\preg_match('/^([^:]+):\s+(.*)$/', $line, $m)) {
					$header = $m[1];
					$data[$header] = $m[2];
				}
				elseif (\preg_match('/^\s+([^\s].+)$/', $line, $m) && ($header !== null)) {
					$data[$header].= $m[1];
				}
			}
			
			// lecture des body (text/plain, text/html, text/sms)
			$boundary = (isset($data['Content-Type']) && \preg_match('/boundary=\"([^\"]+)\"/', $data['Content-Type'], $m)) ? $m[1] : null;
			if ($boundary !== null) {
				$body = $header = null;
				while (! $file->eof()) {
					$line = $file->fgets();
					if (\preg_match('/^--' . $boundary . '(--)?/', $line, $m)) {
						if (isset($m[1])) break;
						$header = true; $body = null;
					}
					elseif ($header === true) {
						if (\preg_match('/^[\r\n]*$/', $line, $m)) { $header = false; }
						elseif (\preg_match('/^Content-Type:\s+text\/(plain|html|sms)/', $line, $m)) { $body = 'body_' . $m[1]; $data[$body] = ''; }
					}
					elseif ($body !== null) $data[$body].= $line;
				}
			} else {
				$body = (isset($data['Content-Type']) && \preg_match('/\s+text\/(plain|html|sms)/', $data['Content-Type'], $m)) ? $m[1] : 'body_default';
				$data[$body] = '';
				while (! $file->eof()) {
					$line = $file->fgets();
					if (\preg_match('/^[\r\n]*$/', $line, $m)) break;
					$data[$body].= $line;
				}
			}
			if (isset($data['body_text']) && \preg_match('/^[\r\n]*$/', $data['body_text'])) $data['body_text'] = null;
			if (isset($data['body_html']) && \preg_match('/^[\r\n]*$/', $data['body_html'])) $data['body_html'] = null;
			if (isset($data['body_sms' ]) && \preg_match('/^[\r\n]*$/', $data['body_sms' ])) $data['body_sms' ] = null;
			
			// enregistrement des données du message
			$ref = isset($data['X-TIC-Reference']) ? $data['X-TIC-Reference'] : null;
			if ($ref !== null) {
				if (! \array_key_exists($ref, $messages)) $messages[$ref] = array();
				$locale = isset($data['Content-Language']) ? $data['Content-Language'] : '_DEFAULT_';
				$messages[$ref][$locale] = $data;
			}
		}
		
		return $this->import($messages);
	}

	/**
	 * Chargement des données d'un tableau associatif dans les entités correspondantes.
	 *
	 * @param   array   $messages   Liste des données à importer pour chaque modèle (ref en clé)
	 * @return  string              Message de l'exception en cas d'échec, ou Null si succès
	 */
	public function import(array $messages): ?string
	{
		if (empty($messages)) return null;
		try {
			$em = $this->getEntityManager();
			foreach ($messages as $ref => $data) {
				$item = $this->find($ref);
				if (null === $item) {
					$item = new Entity($ref);
					$em->persist($item);
				}
				$item->import($data);
			}
			$em->flush();
		} catch (\Exception $e) {
			return $e->getMessage();
		}
		return null;
	}

}