Skip to content

Commit 5e0cacd

Browse files
committed
TwigExtensionsBag
1 parent 56c7735 commit 5e0cacd

File tree

3 files changed

+87
-0
lines changed

3 files changed

+87
-0
lines changed

Resources/config/twig.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,10 @@ services:
4040
- '@twig.instance'
4141
class: Prokl\BitrixOrdinaryToolsBundle\Services\Twig\TemplateCacheWarmer
4242
tags: [kernel.cache_warmer]
43+
44+
# Мигратор extensions в Твиг от maximaster.twig.tool.
45+
Prokl\BitrixOrdinaryToolsBundle\Services\Twig\TwigExtensionsBag:
46+
arguments:
47+
- !tagged_iterator twig.extension
48+
tags:
49+
- { name: bitrix.events.init, module: '', event: onAfterTwigTemplateEngineInited, method: handle, sort: 100 }
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
namespace Prokl\BitrixOrdinaryToolsBundle\Services\Twig;
4+
5+
use Bitrix\Main\Event;
6+
use Bitrix\Main\EventResult;
7+
use Twig\Environment;
8+
9+
/**
10+
* Class TwigExtensionsBag
11+
* @package Prokl\BitrixOrdinaryToolsBundle\Services\Twig
12+
*
13+
* @since 09.08.2021
14+
*/
15+
class TwigExtensionsBag
16+
{
17+
/**
18+
* @var iterable|array $extensions Extensions.
19+
*/
20+
private $extensions;
21+
22+
/**
23+
* TwigExtensionsBag constructor.
24+
*
25+
* @param iterable|array $extensions Extensions.
26+
*/
27+
public function __construct($extensions)
28+
{
29+
$this->extensions = $extensions;
30+
}
31+
32+
/**
33+
* Обработчик события onAfterTwigTemplateEngineInited.
34+
*
35+
* @param Event $event Событие.
36+
*
37+
* @return EventResult
38+
*/
39+
public function handle(Event $event) : EventResult
40+
{
41+
/** @var Environment $twig */
42+
$twig = $event->getParameter('engine');
43+
44+
foreach ($this->extensions as $extension) {
45+
if (!$twig->hasExtension(is_object($extension) ? get_class($extension) : $extension)) {
46+
$twig->addExtension(is_object($extension) ? get_class($extension) : new $extension);
47+
}
48+
}
49+
50+
return new EventResult(
51+
EventResult::SUCCESS,
52+
['engine' => $twig]
53+
);
54+
}
55+
}

readme.MD

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,3 +251,28 @@ parameters:
251251
```
252252
253253
Если такой переменной нет, то прогревается только главная (`/`) страница.
254+
255+
### Твиговские дела
256+
257+
Если на проекте используется [пакет](https://github.com/ProklUng/tools.twig) с поддержкой твиговского движка
258+
в компонентах, то в экземпляр того Твига автоматически перебрасываются все зарегистрированные в контейнере
259+
`extensions` (то, что отмечено в конфигах тэгом `twig.extension`).
260+
261+
Также эта штука поддается использованию автономно, без контейнера.
262+
263+
Где-нибудь в `init.php`:
264+
265+
```php
266+
use Prokl\BitrixOrdinaryToolsBundle\Services\Twig\TwigExtensionsBag;
267+
use Bitrix\Main\EventManager;
268+
269+
$events = [new Local\TwigExtension, Local\FooExtension::class];
270+
$handler = new TwigExtensionsBag($events);
271+
272+
$eventManager = EventManager::getInstance();
273+
$eventManager->addEventHandler(
274+
'',
275+
'onAfterTwigTemplateEngineInited',
276+
[$handler, 'handle']
277+
);
278+
```

0 commit comments

Comments
 (0)