proklung / wp-static-pages-bundle
Generate static pages from route for Wordpress-bitrix.
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 1
Forks: 0
Open Issues: 0
Type:symfony-bundle
Requires
- php: >=7.3 | ^8.0
- symfony/config: ~4|~5
- symfony/dependency-injection: ^4.0 || ^5.0
- symfony/filesystem: ~4|~5
- symfony/http-kernel: ^4.0 || ^5.0
- twig/twig: ^2.13|^3
Requires (Dev)
README
В качестве базы используется форкнутый класс Symfony\Bundle\FrameworkBundle\Controller\TemplateController
Установка
composer.json:
"repositories": [ { "type": "git", "url": "https://github.com/proklung/wp.static.pages.bundle" } ]
composer require proklung/wp-static-pages-bundle
Пример конфига бандла
static_page_maker: post_type: static_pages set_last_modified_header: true
Описание роута (в файле типа routes.yaml)
simple_static_page: path: /simple_page/ methods: [GET] controller: 'Prokl\StaticPageMakerBundle\Services\TemplateControllerContainerAware::templateAction' defaults: is_granted: ['administrator'] template: './staticPages/example.twig' statusCode: 202 # HTTP Status = Accepted context: url: '/simple_page/' site_name: 'ACME' service: '@app.options' # Сервис как параметр # Препроцессоры контекста. _processors: - '@Prokl\StaticPageMakerBundle\Services\ContextProcessors\ExampleContextProcessor' object: errored: true finished: true pending: true theme: 'dark' title: 'Простая статическая страница' h1: 'Простая статическая страница' postClasses: 'main' assets: # Глобальный CSS css: 'global.css' # Сss для страницы. Entry в терминах webpack. css_page: 'basicStaticPage.css' js: 'main.js'
Нюансы
-
Перед передачей данных в Твиг существует возможность пропустить данные через цепочку "препроцессоров", чтобы как-нибудь их автоматически изменить.
Препроцессоры, уже имеющиеся в пакете:
-
SeoContextProcessor - установка title & description.
Даже если эксплицитно указаны параметры title - description в роуте, то подключенный процессор "перебьет" их значения (если найдет запись в инфоблоке).
Препроцессор - класс, реализующий интерфейс ContextProcessorInterface с двумя методами setContext (сеттер; чтобы не копипастить его каждый раз существует абстрактный класс AbstractContextProcessor) и handle (где осуществляется вся работа). Метод должен вернуть измененный (или неизмененный) контекст.
Чтобы препроцессор заработал он должен быть сервисом, помеченным тэгом static_page_maker.default.context.processor.
Частная реализация: в Wordpress заведен кастомный тип поста
static_pages
. Гдеtitle
служит для определения страницы, а ACF поляtitle
,description
иH1
- seo-свойства. -
-
При установке опции set_last_modified_header равной true в конфигурации бандла (local/configs/packages/static_page_maker.yaml) будут установлены заголовки LastModified.
-
Пример шаблона:
Базовый (для копипасты лежит в vendor\ProklUng\StaticPageMakerBundle\Examples\templates\static\template\baseTemplate.twig):
{# head #} {% block header %} <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title> {{ title }}</title> {% if assets.css|length %} {{ encore_entry_link_tags(assets.css) }} {% endif %} {% if assets.css_page|length %} {{ encore_entry_link_tags(assets.css_page) }} {% endif %} </head> <body class="{{ postClasses }}"> {% endblock %} {# content #} {% block content %} {% endblock %} {# footer #} {% block footer %} <footer> <script src="/node_modules/jquery/dist/jquery.min.js"></script> {% if assets.js|length %} {{ encore_entry_script_tags(assets.js) }} {% endif %} </footer> </div> </body> </html> {% endblock %}
Конкретная страница:
{% extends "./staticPages/basicStaticSimplePage.twig" %} {% block content %} <br/> <div> {{ app.environment }} </div> <div class="container"> {% apply inline_css %} <h1> {{ h1 }} </h1> <div class="test"> Мои параметры: {{ site_name }} zzz{{ test_globals }} </div> <style> .test { color: red; } .errored {color: rosybrown} </style> {% endapply %} {{ render(controller("Prokl\\TwigExtensionsPackBundle\\Twig\\Extensions\\Examples\\ExampleSimpleController", { 'id': 3 })) }} {{ render('/api/calendar/', {'headers' : { 'X-Requested-With': 'XMLHttpRequest'} }) }} {{ render_service("Prokl\\TwigExtensionsPackBundle\\Twig\\Extensions\\Examples\\ExampleServiceForRender", "action", { 'id': 3} , {'filesystem' : 'filesystem.instance' }) }} {{ param('instagram.account') }} <br><br/> <p class="{{ html_classes('a-class', 'another-class', { 'errored': object.errored, 'finished': object.finished, 'pending': object.pending, }) }}">How are you doing?</p> {{ service.ajaxNonce }} <div> Работа процессора контента: {{ processor_change }} </div> </div> {% endblock %} ``` 5) Сами шаблоны ищутся согласно зарегистрированным в Твиге путям. В моем случае - в local/twig. 6) В Твиг подтягиваются все зарегистрированные в системе функции и фильтры.