mirror of
https://git.sekbaer.de/Friendica/friendica.git
synced 2025-06-08 00:04:27 +02:00
Add ArrayFilterEvent, replace app_menu hook
This commit is contained in:
parent
5b28b3d28f
commit
715248d6a2
5 changed files with 158 additions and 8 deletions
|
@ -15,6 +15,7 @@ use Friendica\Core\L10n;
|
||||||
use Friendica\Core\Renderer;
|
use Friendica\Core\Renderer;
|
||||||
use Friendica\Core\Session\Capability\IHandleUserSessions;
|
use Friendica\Core\Session\Capability\IHandleUserSessions;
|
||||||
use Friendica\Database\Database;
|
use Friendica\Database\Database;
|
||||||
|
use Friendica\Event\ArrayFilterEvent;
|
||||||
use Friendica\Model\Contact;
|
use Friendica\Model\Contact;
|
||||||
use Friendica\Model\User;
|
use Friendica\Model\User;
|
||||||
use Friendica\Module\Conversation\Community;
|
use Friendica\Module\Conversation\Community;
|
||||||
|
@ -22,6 +23,7 @@ use Friendica\Module\Home;
|
||||||
use Friendica\Module\Security\Login;
|
use Friendica\Module\Security\Login;
|
||||||
use Friendica\Network\HTTPException;
|
use Friendica\Network\HTTPException;
|
||||||
use Friendica\Security\OpenWebAuth;
|
use Friendica\Security\OpenWebAuth;
|
||||||
|
use Psr\EventDispatcher\EventDispatcherInterface;
|
||||||
|
|
||||||
class Nav
|
class Nav
|
||||||
{
|
{
|
||||||
|
@ -63,14 +65,17 @@ class Nav
|
||||||
/** @var Router */
|
/** @var Router */
|
||||||
private $router;
|
private $router;
|
||||||
|
|
||||||
public function __construct(BaseURL $baseUrl, L10n $l10n, IHandleUserSessions $session, Database $database, IManageConfigValues $config, Router $router)
|
private EventDispatcherInterface $eventDispatcher;
|
||||||
|
|
||||||
|
public function __construct(BaseURL $baseUrl, L10n $l10n, IHandleUserSessions $session, Database $database, IManageConfigValues $config, Router $router, EventDispatcherInterface $eventDispatcher)
|
||||||
{
|
{
|
||||||
$this->baseUrl = $baseUrl;
|
$this->baseUrl = $baseUrl;
|
||||||
$this->l10n = $l10n;
|
$this->l10n = $l10n;
|
||||||
$this->session = $session;
|
$this->session = $session;
|
||||||
$this->database = $database;
|
$this->database = $database;
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
$this->router = $router;
|
$this->router = $router;
|
||||||
|
$this->eventDispatcher = $eventDispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -151,7 +156,7 @@ class Nav
|
||||||
) {
|
) {
|
||||||
$arr = ['app_menu' => $appMenu];
|
$arr = ['app_menu' => $appMenu];
|
||||||
|
|
||||||
Hook::callAll('app_menu', $arr);
|
$arr = $this->eventDispatcher->dispatch(new ArrayFilterEvent(ArrayFilterEvent::APP_MENU, $arr))->getArray();
|
||||||
|
|
||||||
$appMenu = $arr['app_menu'];
|
$appMenu = $arr['app_menu'];
|
||||||
}
|
}
|
||||||
|
|
39
src/Event/ArrayFilterEvent.php
Normal file
39
src/Event/ArrayFilterEvent.php
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// Copyright (C) 2010-2024, the Friendica project
|
||||||
|
// SPDX-FileCopyrightText: 2010-2024 the Friendica project
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Friendica\Event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Allow Event listener to modify an array.
|
||||||
|
*
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
final class ArrayFilterEvent extends Event
|
||||||
|
{
|
||||||
|
public const APP_MENU = 'friendica.data.app_menu';
|
||||||
|
|
||||||
|
private array $array;
|
||||||
|
|
||||||
|
public function __construct(string $name, array $array)
|
||||||
|
{
|
||||||
|
parent::__construct($name);
|
||||||
|
|
||||||
|
$this->array = $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getArray(): array
|
||||||
|
{
|
||||||
|
return $this->array;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setArray(array $array): void
|
||||||
|
{
|
||||||
|
$this->array = $array;
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ declare(strict_types=1);
|
||||||
namespace Friendica\EventSubscriber;
|
namespace Friendica\EventSubscriber;
|
||||||
|
|
||||||
use Friendica\Core\Hook;
|
use Friendica\Core\Hook;
|
||||||
|
use Friendica\Event\ArrayFilterEvent;
|
||||||
use Friendica\Event\ConfigLoadedEvent;
|
use Friendica\Event\ConfigLoadedEvent;
|
||||||
use Friendica\Event\Event;
|
use Friendica\Event\Event;
|
||||||
use Friendica\Event\HtmlFilterEvent;
|
use Friendica\Event\HtmlFilterEvent;
|
||||||
|
@ -35,6 +36,7 @@ final class HookEventBridge
|
||||||
private static array $eventMapper = [
|
private static array $eventMapper = [
|
||||||
Event::INIT => 'init_1',
|
Event::INIT => 'init_1',
|
||||||
ConfigLoadedEvent::CONFIG_LOADED => 'load_config',
|
ConfigLoadedEvent::CONFIG_LOADED => 'load_config',
|
||||||
|
ArrayFilterEvent::APP_MENU => 'app_menu',
|
||||||
HtmlFilterEvent::HEAD => 'head',
|
HtmlFilterEvent::HEAD => 'head',
|
||||||
HtmlFilterEvent::FOOTER => 'footer',
|
HtmlFilterEvent::FOOTER => 'footer',
|
||||||
HtmlFilterEvent::PAGE_CONTENT_TOP => 'page_content_top',
|
HtmlFilterEvent::PAGE_CONTENT_TOP => 'page_content_top',
|
||||||
|
@ -49,6 +51,7 @@ final class HookEventBridge
|
||||||
return [
|
return [
|
||||||
Event::INIT => 'onNamedEvent',
|
Event::INIT => 'onNamedEvent',
|
||||||
ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent',
|
ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent',
|
||||||
|
ArrayFilterEvent::APP_MENU => 'onArrayFilterEvent',
|
||||||
HtmlFilterEvent::HEAD => 'onHtmlFilterEvent',
|
HtmlFilterEvent::HEAD => 'onHtmlFilterEvent',
|
||||||
HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent',
|
HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent',
|
||||||
HtmlFilterEvent::PAGE_CONTENT_TOP => 'onHtmlFilterEvent',
|
HtmlFilterEvent::PAGE_CONTENT_TOP => 'onHtmlFilterEvent',
|
||||||
|
@ -66,6 +69,13 @@ final class HookEventBridge
|
||||||
static::callHook($event->getName(), $event->getConfig());
|
static::callHook($event->getName(), $event->getConfig());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function onArrayFilterEvent(ArrayFilterEvent $event): void
|
||||||
|
{
|
||||||
|
$event->setArray(
|
||||||
|
static::callHook($event->getName(), $event->getArray())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public static function onHtmlFilterEvent(HtmlFilterEvent $event): void
|
public static function onHtmlFilterEvent(HtmlFilterEvent $event): void
|
||||||
{
|
{
|
||||||
$event->setHtml(
|
$event->setHtml(
|
||||||
|
|
66
tests/Unit/Event/ArrayFilterEventTest.php
Normal file
66
tests/Unit/Event/ArrayFilterEventTest.php
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// Copyright (C) 2010-2024, the Friendica project
|
||||||
|
// SPDX-FileCopyrightText: 2010-2024 the Friendica project
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Friendica\Test\Unit\Event;
|
||||||
|
|
||||||
|
use Friendica\Event\ArrayFilterEvent;
|
||||||
|
use Friendica\Event\NamedEvent;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class ArrayFilterEventTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testImplementationOfInstances(): void
|
||||||
|
{
|
||||||
|
$event = new ArrayFilterEvent('test', []);
|
||||||
|
|
||||||
|
$this->assertInstanceOf(NamedEvent::class, $event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getPublicConstants(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[ArrayFilterEvent::APP_MENU, 'friendica.data.app_menu'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getPublicConstants
|
||||||
|
*/
|
||||||
|
public function testPublicConstantsAreAvailable($value, $expected): void
|
||||||
|
{
|
||||||
|
$this->assertSame($expected, $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetNameReturnsName(): void
|
||||||
|
{
|
||||||
|
$event = new ArrayFilterEvent('test', []);
|
||||||
|
|
||||||
|
$this->assertSame('test', $event->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetArrayReturnsCorrectString(): void
|
||||||
|
{
|
||||||
|
$data = ['original'];
|
||||||
|
|
||||||
|
$event = new ArrayFilterEvent('test', $data);
|
||||||
|
|
||||||
|
$this->assertSame($data, $event->getArray());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetArrayUpdatesHtml(): void
|
||||||
|
{
|
||||||
|
$event = new ArrayFilterEvent('test', ['original']);
|
||||||
|
|
||||||
|
$expected = ['updated'];
|
||||||
|
|
||||||
|
$event->setArray($expected);
|
||||||
|
|
||||||
|
$this->assertSame($expected, $event->getArray());
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ declare(strict_types=1);
|
||||||
namespace Friendica\Test\Unit\EventSubscriber;
|
namespace Friendica\Test\Unit\EventSubscriber;
|
||||||
|
|
||||||
use Friendica\Core\Config\Util\ConfigFileManager;
|
use Friendica\Core\Config\Util\ConfigFileManager;
|
||||||
|
use Friendica\Event\ArrayFilterEvent;
|
||||||
use Friendica\Event\ConfigLoadedEvent;
|
use Friendica\Event\ConfigLoadedEvent;
|
||||||
use Friendica\Event\Event;
|
use Friendica\Event\Event;
|
||||||
use Friendica\Event\HtmlFilterEvent;
|
use Friendica\Event\HtmlFilterEvent;
|
||||||
|
@ -23,6 +24,7 @@ class HookEventBridgeTest extends TestCase
|
||||||
$expected = [
|
$expected = [
|
||||||
Event::INIT => 'onNamedEvent',
|
Event::INIT => 'onNamedEvent',
|
||||||
ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent',
|
ConfigLoadedEvent::CONFIG_LOADED => 'onConfigLoadedEvent',
|
||||||
|
ArrayFilterEvent::APP_MENU => 'onArrayFilterEvent',
|
||||||
HtmlFilterEvent::HEAD => 'onHtmlFilterEvent',
|
HtmlFilterEvent::HEAD => 'onHtmlFilterEvent',
|
||||||
HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent',
|
HtmlFilterEvent::FOOTER => 'onHtmlFilterEvent',
|
||||||
HtmlFilterEvent::PAGE_CONTENT_TOP => 'onHtmlFilterEvent',
|
HtmlFilterEvent::PAGE_CONTENT_TOP => 'onHtmlFilterEvent',
|
||||||
|
@ -105,6 +107,34 @@ class HookEventBridgeTest extends TestCase
|
||||||
HookEventBridge::onConfigLoadedEvent($event);
|
HookEventBridge::onConfigLoadedEvent($event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getArrayFilterEventData(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
['test', 'test'],
|
||||||
|
[ArrayFilterEvent::APP_MENU, 'app_menu'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getArrayFilterEventData
|
||||||
|
*/
|
||||||
|
public function testOnArrayFilterEventCallsHookWithCorrectValue($name, $expected): void
|
||||||
|
{
|
||||||
|
$event = new ArrayFilterEvent($name, ['original']);
|
||||||
|
|
||||||
|
$reflectionProperty = new \ReflectionProperty(HookEventBridge::class, 'mockedCallHook');
|
||||||
|
$reflectionProperty->setAccessible(true);
|
||||||
|
|
||||||
|
$reflectionProperty->setValue(null, function (string $name, $data) use ($expected) {
|
||||||
|
$this->assertSame($expected, $name);
|
||||||
|
$this->assertSame(['original'], $data);
|
||||||
|
|
||||||
|
return $data;
|
||||||
|
});
|
||||||
|
|
||||||
|
HookEventBridge::onArrayFilterEvent($event);
|
||||||
|
}
|
||||||
|
|
||||||
public static function getHtmlFilterEventData(): array
|
public static function getHtmlFilterEventData(): array
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue