gzhegow / front
1.0.0
2025-08-03 00:59 UTC
Requires
- php: ^7.3|^8.0
- gzhegow/league-plates-84: ~3.6.0
- gzhegow/lib: ~1.2.0
README
Установить
composer require gzhegow/front
Запустить тесты
php test.php
Примеры и тесты
<?php // > настраиваем PHP \Gzhegow\Lib\Lib::entrypoint() ->setDirRoot(__DIR__ . '/..') ->useAllRecommended() ; // > добавляем несколько функций для тестирования $ffn = new class { function root() : string { return realpath(__DIR__ . '/..'); } function values($separator = null, ...$values) : string { return \Gzhegow\Lib\Lib::debug()->dump_values([], $separator, ...$values); } function print(...$values) : void { echo $this->values(' | ', ...$values) . PHP_EOL; } function test(\Closure $fn, array $args = []) : \Gzhegow\Lib\Modules\Test\TestCase { $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); return \Gzhegow\Lib\Lib::test()->newTestCase() ->fn($fn, $args) ->trace($trace) ; } }; // > сначала всегда фабрика $factory = new \Gzhegow\Front\FrontFactory(); // > создаем конфигурацию $config = new \Gzhegow\Front\Core\Config\FrontConfig(); $config->configure( function (\Gzhegow\Front\Core\Config\FrontConfig $config) use ($ffn) { // >>> шаблонизатор $config->isDebug = true; // // > устанавливаем папку и формат файла $config->directory = __DIR__ . '/../disc/html'; $config->fileExtension = 'phtml'; // // > можно установить собственные обработчики RESOLVE (подключить языки?), GET (подключить контейнер?) и CATCH (не бросать исключения?) для шаблонов $config->fnTemplateGet = function (string $name, \Gzhegow\Front\Package\League\Plates\Template\TemplateInterface $template) { $data = $template->getData(); return $data[ $name ] ?? null; }; $config->fnTemplateCatch = function (\Throwable $e, string $content, \Gzhegow\Front\Package\League\Plates\Template\TemplateInterface $template) { $eMessage = $e->getMessage(); $templateName = $template->name(); return $content . " [ ERROR : {$templateName} : {$eMessage} ]"; }; // // > подключаем работу с языковыми шаблонами $config->langCurrent = 'ru'; $config->langDefault = 'ru'; // >>> менеджер тегов $config->tagManager->appNameFull = 'My Website | A personal Portfolio'; $config->tagManager->appNameShort = 'My Website'; } ); // > создаем менеджер HTML-тегов // > его задача создавать HTML теги для верстки в тех случаях, когда они управляются глобально и влияют на SEO $tagManager = new \Gzhegow\Front\Core\TagManager\FrontTagManager($config->tagManager); // > создаем роутер $front = new \Gzhegow\Front\FrontFacade( $factory, // $tagManager, // $config ); // > можно добавить папки в регистр, чтобы вызывать их напрямую через ->render('modals::{path}') // > субъективно я предпочитаю использовать html::{путь}, не разделяя каждую папку отдельно $front->folderAdd('html', __DIR__ . '/../disc/html'); // $plates->folderAdd('blocks', __DIR__ . '/../disc/html/blocks'); // $plates->folderAdd('layouts', __DIR__ . '/../disc/html/layouts'); // $plates->folderAdd('modals', __DIR__ . '/../disc/html/modals'); // $plates->folderAdd('pages', __DIR__ . '/../disc/html/pages'); // $plates->folderAdd('sections', __DIR__ . '/../disc/html/sections'); // > можно добавить resolver, чтобы, например, подключить языковые шаблоны или искать шаблон в нескольких папках $front->resolverSet(new \Gzhegow\Front\Core\Resolver\FrontI18nResolver()); // $front->resolverSet(new \Gzhegow\Front\Core\Resolver\DefaultResolver()); // $front->resolverSet(new \Gzhegow\Front\Core\Resolver\CallableResolver( // function (\League\Plates\Template\Name $name) { }, // $fnArgs = [ 1, 2, 3 ] // )); // > создаем фасад, если удобно пользоваться статикой \Gzhegow\Front\Front::setFacade($front); // >>> ТЕСТЫ // > TEST // > так можно отрисовать шаблон с его содержимым $fn = function () use ($ffn, $front) { $ffn->print('TEST 1'); echo "\n"; $before = $front->langDefaultSet('ru'); $front->langCurrentSet('ru'); $ffn->print($front->render('html::pages/demo/page.demo.phtml')); echo "\n"; $front->langCurrentSet('en'); $ffn->print($front->render('html::pages/demo/page.demo')); echo "\n"; // > будет использован `default`, то есть `ru` $front->langCurrentSet('unknown'); $ffn->print($front->render('html::pages/demo/page.demo')); $front->langDefaultSet($before); }; $test = $ffn->test($fn); $test->expectStdout(' "TEST 1" "<!-- [ >>> layouts/demo/ru/layout.demo.phtml ] -->\n <div>Пример шаблона</div>\n <div>\n <!-- [ >>> pages/demo/page.demo.phtml ] -->\n <!-- [ >>> blocks/demo/ru/block.demo.phtml ] -->\n <div>Пример блока</div>\n <!-- [ <<< blocks/demo/ru/block.demo.phtml ] -->\n <!-- [ <<< pages/demo/page.demo.phtml ] -->\n </div>\n <!-- [ <<< layouts/demo/ru/layout.demo.phtml ] -->" "<!-- [ >>> layouts/demo/en/layout.demo.phtml ] -->\n <div>Demo Layout</div>\n <div>\n <!-- [ >>> pages/demo/page.demo.phtml ] -->\n <!-- [ >>> blocks/demo/en/block.demo.phtml ] -->\n <div>Demo Block</div>\n <!-- [ <<< blocks/demo/en/block.demo.phtml ] -->\n <!-- [ <<< pages/demo/page.demo.phtml ] -->\n </div>\n <!-- [ <<< layouts/demo/en/layout.demo.phtml ] -->" "<!-- [ >>> layouts/demo/layout.demo.phtml ] -->\n <div>Пример шаблона</div>\n <div>\n <!-- [ >>> pages/demo/page.demo.phtml ] -->\n <!-- [ >>> blocks/demo/block.demo.phtml ] -->\n <div>Пример блока</div>\n <!-- [ <<< blocks/demo/block.demo.phtml ] -->\n <!-- [ <<< pages/demo/page.demo.phtml ] -->\n </div>\n <!-- [ <<< layouts/demo/layout.demo.phtml ] -->" '); $test->run();