Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. <?php
  2.  
  3. /**
  4.  * Reprezentace Latte tagu k zobrazení Nette flash zpráv
  5.  *
  6.  * Použití: {flashMessages} nebo {flashMessages $flashes}
  7.  */
  8. class FlashMessagesNode extends \Latte\Compiler\Nodes\AreaNode
  9. { // AreaNode reprezentuje v Latte 3 obecný tag, který se zobrazuje v šabloně
  10.  
  11.     public static function create(\Latte\Compiler\Tag $tag): self
  12.     {
  13.         $flashes = NULL;
  14.         if ($tag->parser->isEnd()) {
  15.             $flashes = $tag->parser->parseUnquotedStringOrExpression();
  16.         } // Definujeme nepovinný argument tagu a uložíme jeho hodnotu
  17.  
  18.         return new self($flashes);
  19.     }
  20.  
  21.     public function __construct(
  22.         public ?\Latte\Compiler\Nodes\Php\ExpressionNode $flashes = NULL,
  23.     )
  24.     {
  25.     }
  26.  
  27.     public function print(\Latte\Compiler\PrintContext $context): string
  28.     {
  29.         return $context->format(
  30.             'echo $this->global->%raw->render(%node);',
  31.             FlashMessagesExtension::FLASH_MESSAGES_RENDERER,
  32.             $this->flashes ?? new \Latte\Compiler\Nodes\Php\Expression\VariableNode('flashes'),
  33.         );
  34.     }
  35.  
  36.     public function &getIterator(): \Generator
  37.     {
  38.         // Důležitá funkce, kterou musí každý tag s obsahem implementovat.
  39.         // Umožňuje dále ve stromu nahrazovat tagy za jiné.
  40.         if ($this->flashes !== NULL) {
  41.             yield $this->flashes;
  42.         }
  43.     }
  44.  
  45. }
  46.  
  47.  
  48. final class FlashMessagesRenderer
  49. {
  50.  
  51.     public function __construct(
  52.         private \Nette\Localization\Translator $translator,
  53.     )
  54.     {
  55.     }
  56.  
  57.     public function render(?array $flashes): ?\Nette\Utils\Html
  58.     {
  59.         if ($flashes === NULL || $flashes === []) {
  60.             return NULL;
  61.         }
  62.  
  63.         $container = \Nette\Utils\Html::el();
  64.  
  65.         foreach ($flashes as $flash) {
  66.             $el = \Nette\Utils\Html::el('p');
  67.             $el->class(\sprintf('message message--%s', $flash->type));
  68.  
  69.             if ($flash->message instanceof \Nette\Utils\Html) {
  70.                 $el->addHtml($flash->message);
  71.             } else {
  72.                 $message = $this->translator->translate($flash->message);
  73.                 $el->addHtml(\Nette\Utils\Html::el('span')->addText($message));
  74.             }
  75.  
  76.             $container->addHtml($el);
  77.         }
  78.  
  79.         return $container;
  80.     }
  81.  
  82. }
  83.  
  84.  
  85. class FlashMessagesExtension extends \Latte\Extension
  86. { // Latte rozšíření pro registraci našeho vlastního tagu
  87.  
  88.     public const FLASH_MESSAGES_RENDERER = 'flashMessagesRenderer';
  89.  
  90.     public function __construct(
  91.         private readonly FlashMessagesRenderer $flashMessagesRenderer,
  92.     )
  93.     {
  94.     }
  95.  
  96.     public function getProviders(): array
  97.     {
  98.         return [
  99.             self::FLASH_MESSAGES_RENDERER => $this->flashMessagesRenderer,
  100.         ];
  101.     }
  102.  
  103.     public function getTags(): array
  104.     {
  105.         return [
  106.             'flashMessages' => FlashMessagesNode::create(...),
  107.         ];
  108.     }
  109.  
  110. }
  111.