Skip to content

Commit 965cad7

Browse files
committed
Stuff
1 parent 2ece2d2 commit 965cad7

File tree

10 files changed

+333
-17
lines changed

10 files changed

+333
-17
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
####################
2+
# Кастомные события
3+
####################
4+
5+
services:
6+
# конфигурация по умолчанию в *этом* файле
7+
_defaults:
8+
autowire: true
9+
autoconfigure: true
10+
public: true
11+
12+
custom.event.dispatcher:
13+
class: Local\Util\SymfonyEvents\Events
14+
arguments:
15+
- '@event_dispatcher'
16+
- !tagged_iterator bitrix.component.event
17+
18+
Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\OnResultModifierSections:
19+
tags:
20+
- { name: bitrix.component.event }
21+
22+
# Вызывается в component_epilog.php (где будет указано)
23+
Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\OnComponentEpilogLastModified:
24+
tags:
25+
- { name: bitrix.component.event }
26+
27+
# Установка title & description на детальных страницах
28+
Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\Seo\OnDetailSetSeoData:
29+
tags:
30+
- { name: bitrix.component.event }
31+
32+
# Канонические ссылки в news.detail
33+
Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\Seo\Canonical:
34+
tags:
35+
- { name: bitrix.component.event }
36+
37+
# H1 в news.list
38+
Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\Seo\H1:
39+
tags:
40+
- { name: bitrix.component.event }
41+
42+
# H1 в news.detail
43+
Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\Seo\H1Detail:
44+
tags:
45+
- { name: bitrix.component.event }
46+
47+
# Установка title & description на разводных страницах
48+
Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\Seo\OnSectionSetSeoData:
49+
tags:
50+
- { name: bitrix.component.event }
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<?php
2+
3+
namespace Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents;
4+
5+
use Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Interfaces\BitrixComponentEventHandlerInterface;
6+
use stdClass;
7+
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
8+
9+
/**
10+
* Class CustomEvents
11+
* @package Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents
12+
*/
13+
class CustomEvents
14+
{
15+
/**
16+
* @var array $listenersCollection Коллекция слушателей событий.
17+
*/
18+
private $listenersCollection;
19+
20+
/**
21+
* @var EventDispatcherInterface $dispatcher
22+
*/
23+
private $dispatcher;
24+
25+
/**
26+
* Events constructor.
27+
*
28+
* @param EventDispatcherInterface $dispatcher
29+
* @param ... $eventsHandlerBag
30+
*/
31+
public function __construct(
32+
EventDispatcherInterface $dispatcher,
33+
... $eventsHandlerBag
34+
) {
35+
36+
$handlers = [];
37+
38+
foreach ($eventsHandlerBag as $eventHandler) {
39+
$iterator = $eventHandler->getIterator();
40+
$array = iterator_to_array($iterator);
41+
$handlers[] = $array;
42+
}
43+
44+
$this->listenersCollection = $handlers;
45+
46+
$this->dispatcher = $dispatcher;
47+
}
48+
49+
/**
50+
* Применение слушателей событий.
51+
*
52+
* @return mixed
53+
*/
54+
public function applyListeners()
55+
{
56+
/** @var BitrixComponentEventHandlerInterface $listener */
57+
foreach ($this->listenersCollection as $listener) {
58+
$this->dispatcher->addListener(
59+
$listener->event(),
60+
[$listener, 'action'],
61+
$listener->priority()
62+
);
63+
}
64+
65+
return $this->dispatcher;
66+
}
67+
68+
/**
69+
* Запустить событие.
70+
*
71+
* @param string $eventName Событие.
72+
* @param mixed $params Объект-параметры.
73+
*
74+
* @return mixed|object|null
75+
*/
76+
public function dispatch(string $eventName, $params = null)
77+
{
78+
if (!$eventName) {
79+
return null;
80+
}
81+
82+
if ($params === null) {
83+
$params = new stdClass();
84+
}
85+
86+
return $this->dispatcher->dispatch($params, $eventName);
87+
}
88+
89+
/**
90+
* Декоратор добавления слушателя.
91+
*
92+
* @param string $eventName Название события.
93+
* @param mixed $listener Слушатель.
94+
* @param integer $priority Приоритет.
95+
*
96+
* @return void
97+
*/
98+
public function addListener(string $eventName, $listener, int $priority = 0): void
99+
{
100+
$this->dispatcher->addListener($eventName, $listener, $priority);
101+
}
102+
103+
/**
104+
* Декоратор удаления слушателя события.
105+
*
106+
* @param string $eventName Название события.
107+
* @param mixed $listener Слушатель.
108+
*
109+
* @return void
110+
*/
111+
public function removeListener(string $eventName, $listener) : void
112+
{
113+
$this->dispatcher->removeListener($eventName, $listener);
114+
}
115+
}

Services/SymfonyEvents/Handlers/OnComponentEpilogLastModified.php

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,28 +4,45 @@
44

55
use Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Events\ComponentEpilogEvent;
66
use Prokl\BitrixOrdinaryToolsBundle\Services\Facades\LastModifiedFacade;
7+
use Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Interfaces\BitrixComponentEventHandlerInterface;
78

89
/**
910
* Class LastModifiedHandler
1011
* @package Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers
1112
*/
12-
class OnComponentEpilogLastModified
13+
class OnComponentEpilogLastModified implements BitrixComponentEventHandlerInterface
1314
{
15+
/**
16+
* @inheritDoc
17+
*/
18+
public function event() : string
19+
{
20+
return 'on.component.epilog';
21+
}
22+
23+
/**
24+
* @inheritDoc
25+
*/
26+
public function priority() : int
27+
{
28+
return 100;
29+
}
30+
1431
/**
1532
* Слушатель события on.component.epilog. Установка LastModified заголовков.
1633
*
1734
* @param ComponentEpilogEvent $event.
1835
*
1936
* @return mixed
2037
*/
21-
public function action(ComponentEpilogEvent $event)
38+
public function action($event) : void
2239
{
2340
// LastModified.
2441
if (empty($event->payload('timestamp'))
2542
&&
2643
empty($event->payload('timestamp_raw'))
2744
) {
28-
return null;
45+
return;
2946
}
3047

3148
// Уникализация ключа в глобальном состоянии LastModifier.
@@ -40,7 +57,5 @@ public function action(ComponentEpilogEvent $event)
4057
$salt,
4158
$timestamp
4259
);
43-
44-
return true;
4560
}
4661
}

Services/SymfonyEvents/Handlers/OnResultModifierSections.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,38 @@
44

55
use Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Events\ResultModifierSectionsEvent;
66
use Prokl\BitrixOrdinaryToolsBundle\Services\Facades\TimestampFacade;
7+
use Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Interfaces\BitrixComponentEventHandlerInterface;
78

89
/**
910
* Class onResultModifierSections
1011
* @package Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers
1112
*/
12-
class OnResultModifierSections
13+
class OnResultModifierSections implements BitrixComponentEventHandlerInterface
1314
{
15+
/**
16+
* @inheritDoc
17+
*/
18+
public function event() : string
19+
{
20+
return 'on.result.modifier.component';
21+
}
22+
23+
/**
24+
* @inheritDoc
25+
*/
26+
public function priority() : int
27+
{
28+
return 100;
29+
}
30+
1431
/**
1532
* Слушатель события on.result.modifier.component. Вычисление последнего измененного элемента.
1633
*
1734
* @param ResultModifierSectionsEvent $event Объект данных события.
1835
*
1936
* @return mixed
2037
*/
21-
public function action(ResultModifierSectionsEvent $event): void
38+
public function action($event): void
2239
{
2340
$arResult = $event->arResult();
2441
// ITEMS или SECTIONS

Services/SymfonyEvents/Handlers/Seo/Canonical.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,38 @@
44
namespace Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\Seo;
55

66
use Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Events\ResultModifierDetailEvent;
7+
use Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Interfaces\BitrixComponentEventHandlerInterface;
78

89
/**
910
* Class Canonical
1011
* @package Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\Seo
1112
*/
12-
class Canonical
13+
class Canonical implements BitrixComponentEventHandlerInterface
1314
{
15+
/**
16+
* @inheritDoc
17+
*/
18+
public function event() : string
19+
{
20+
return 'on.result.modifier.component.detail';
21+
}
22+
23+
/**
24+
* @inheritDoc
25+
*/
26+
public function priority() : int
27+
{
28+
return 100;
29+
}
30+
1431
/**
1532
* Калькуляция Canonical.
1633
*
1734
* @param ResultModifierDetailEvent $event Объект события.
1835
*
1936
* @return void
2037
*/
21-
public function action(ResultModifierDetailEvent $event)
38+
public function action($event) : void
2239
{
2340
$arResult = $event->arResult();
2441

Services/SymfonyEvents/Handlers/Seo/H1.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,38 @@
33
namespace Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\Seo;
44

55
use Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Events\ResultModifierSectionsEvent;
6+
use Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Interfaces\BitrixComponentEventHandlerInterface;
67

78
/**
89
* Class H1
910
* @package Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\Seo
1011
*/
11-
class H1
12+
class H1 implements BitrixComponentEventHandlerInterface
1213
{
14+
/**
15+
* @inheritDoc
16+
*/
17+
public function event() : string
18+
{
19+
return 'on.result.modifier.component';
20+
}
21+
22+
/**
23+
* @inheritDoc
24+
*/
25+
public function priority() : int
26+
{
27+
return 250;
28+
}
29+
1330
/**
1431
* Калькуляция H1.
1532
*
1633
* @param ResultModifierSectionsEvent $event Объект события.
1734
*
1835
* @return void
1936
*/
20-
public function action(ResultModifierSectionsEvent $event): void
37+
public function action($event): void
2138
{
2239
$h1 = $event->arParams('H1_PROPERTY') ?: $event->arResult('NAME');
2340

Services/SymfonyEvents/Handlers/Seo/H1Detail.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,38 @@
33
namespace Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\Seo;
44

55
use Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Events\ResultModifierDetailEvent;
6+
use Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Interfaces\BitrixComponentEventHandlerInterface;
67

78
/**
89
* Class H1
910
* @package Prokl\BitrixOrdinaryToolsBundle\Services\SymfonyEvents\Handlers\Seo
1011
*/
11-
class H1Detail
12+
class H1Detail implements BitrixComponentEventHandlerInterface
1213
{
14+
/**
15+
* @inheritDoc
16+
*/
17+
public function event() : string
18+
{
19+
return 'on.result.modifier.component.detail';
20+
}
21+
22+
/**
23+
* @inheritDoc
24+
*/
25+
public function priority() : int
26+
{
27+
return 350;
28+
}
29+
1330
/**
1431
* Калькуляция H1 для детальных страниц.
1532
*
1633
* @param ResultModifierDetailEvent $event Объект события.
1734
*
1835
* @return void
1936
*/
20-
public function action(ResultModifierDetailEvent $event): void
37+
public function action($event): void
2138
{
2239
$arResult = $event->arResult();
2340

0 commit comments

Comments
 (0)