Зарегистрированные пути CSS-файлов — общие для всех View за * один запрос (content рендерится раньше layout, см. Controller::render()) */ private static array $_styles = []; /** * @var array Зарегистрированные JS-файлы */ private static array $_scripts = []; /** * @var string|null Путь к зарегистрированному manifest-файлу */ private static ?string $_manifest = null; /** * @param string|null $file Имя файла шаблона без расширения * @param string $dir Каталог шаблона относительно базовых путей * @param array|null $data Данные для шаблона * @throws MyException */ public function __construct(?string $file = null, string $dir = '', ?array $data = null) { if ($file !== null) { $this->setFilename($file, $dir); } if ($data !== null) { // Добавить значения к текущим данным $this->_data = $data + $this->_data; } } /** * Устанавливает файл шаблона, проверяя его существование. * * @param string $file Имя файла шаблона без расширения * @param string $dir Каталог шаблона (обязателен) * @return View * @throws MyException Если $dir пуст или файл не найден */ public function setFilename(string $file, string $dir = ''): View { if ($dir === '') { throw new MyException("Параметр dir не передан в View::setFilename для файла '$file'"); } if (($path = Core::findFile($dir, $file, 'html')) === false) { throw new MyException("При запросе view файл $dir/$file не найден"); } // Store the file path locally $this->_file = $path; return $this; } /** * Выполняет шаблон и возвращает результат как строку. * * @return string Отрендеренный HTML * @throws MyException Если файл не установлен или ошибка при рендеринге */ public function render(): string { if (empty($this->_file)) { throw new MyException('Нужно установить файл для использования во view перед преобразованием'); } ob_start(); extract($this->_data, EXTR_SKIP); try { include $this->_file; return ob_get_clean(); } catch (Throwable $e) { ob_end_clean(); throw new MyException( "Ошибка при render файла: {$e->getFile()} на строке {$e->getLine()} - {$e->getMessage()}", null, 0, $e ); } } /** * Регистрирует CSS-файл из App/media/css — вызывается прямо из шаблона: * setStyle('about.css'); ?>. Выводится позже через getStyles() * (обычно из layout.html, после того как content уже отрендерен). * * @param string $file Имя файла с расширением, например 'about.css' * @return void */ public function setStyle(string $file): void { $name = pathinfo($file, PATHINFO_FILENAME); if (Core::findFile('media/css', $name, 'css') === false) { echo ''; return; } self::$_styles[] = "/App/media/css/$name.css"; } /** * Регистрирует JS-файл из App/media/js — вызывается прямо из шаблона: * setScript('about.js'); ?>. Выводится позже через getScripts(). * * @param string $file Имя файла с расширением, например 'about.js' * @param string $type Атрибут type у \n"; } } }