%PDF- %PDF-
Direktori : /www/varak.net/losik.varak.net/vendor/nette/application/src/Application/UI/ |
Current File : //www/varak.net/losik.varak.net/vendor/nette/application/src/Application/UI/Control.php |
<?php /** * This file is part of the Nette Framework (https://nette.org) * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare(strict_types=1); namespace Nette\Application\UI; use Nette; /** * Control is renderable Presenter component. * * @property-read Template|Nette\Bridges\ApplicationLatte\DefaultTemplate|\stdClass $template */ abstract class Control extends Component implements Renderable { /** @var bool */ public $snippetMode; /** @var TemplateFactory */ private $templateFactory; /** @var Template */ private $template; /** @var array */ private $invalidSnippets = []; /********************* template factory ****************d*g**/ final public function setTemplateFactory(TemplateFactory $templateFactory) { $this->templateFactory = $templateFactory; return $this; } final public function getTemplate(): Template { if ($this->template === null) { $this->template = $this->createTemplate(); } return $this->template; } /** * @param string $class */ protected function createTemplate(/*string $class = null*/): Template { $class = func_num_args() // back compatibility ? func_get_arg(0) : $this->formatTemplateClass(); $templateFactory = $this->templateFactory ?: $this->getPresenter()->getTemplateFactory(); return $templateFactory->createTemplate($this, $class); } public function formatTemplateClass(): ?string { return $this->checkTemplateClass(preg_replace('#Control$#', '', static::class) . 'Template'); } /** @internal */ protected function checkTemplateClass(string $class): ?string { if (!class_exists($class)) { return null; } elseif (!is_a($class, Template::class, true)) { trigger_error(sprintf( '%s: class %s was found but does not implement the %s, so it will not be used for the template.', static::class, $class, Template::class ), E_USER_NOTICE); return null; } else { return $class; } } /** * Descendant can override this method to customize template compile-time filters. * @deprecated */ public function templatePrepareFilters(Template $template): void { } /** * Saves the message to template, that can be displayed after redirect. * @param string|\stdClass|Nette\HtmlStringable $message */ public function flashMessage($message, string $type = 'info'): \stdClass { $id = $this->getParameterId('flash'); $flash = $message instanceof \stdClass ? $message : (object) [ 'message' => $message, 'type' => $type, ]; $messages = $this->getPresenter()->getFlashSession()->$id; $messages[] = $flash; $this->getTemplate()->flashes = $messages; $this->getPresenter()->getFlashSession()->$id = $messages; return $flash; } /********************* rendering ****************d*g**/ /** * Forces control or its snippet to repaint. */ public function redrawControl(?string $snippet = null, bool $redraw = true): void { if ($redraw) { $this->invalidSnippets[$snippet ?? "\0"] = true; } elseif ($snippet === null) { $this->invalidSnippets = []; } else { $this->invalidSnippets[$snippet] = false; } } /** * Is required to repaint the control or its snippet? */ public function isControlInvalid(?string $snippet = null): bool { if ($snippet !== null) { return $this->invalidSnippets[$snippet] ?? isset($this->invalidSnippets["\0"]); } elseif (count($this->invalidSnippets) > 0) { return true; } $queue = [$this]; do { foreach (array_shift($queue)->getComponents() as $component) { if ($component instanceof Renderable) { if ($component->isControlInvalid()) { // $this->invalidSnippets['__child'] = true; // as cache return true; } } elseif ($component instanceof Nette\ComponentModel\IContainer) { $queue[] = $component; } } } while ($queue); return false; } /** * Returns snippet HTML ID. */ public function getSnippetId(string $name): string { // HTML 4 ID & NAME: [A-Za-z][A-Za-z0-9:_.-]* return 'snippet-' . $this->getUniqueId() . '-' . $name; } }