Add ArrayFilterEvent, replace app_menu hook

This commit is contained in:
Art4 2025-01-28 15:24:49 +00:00 committed by Hypolite Petovan
parent 5b28b3d28f
commit 715248d6a2
5 changed files with 158 additions and 8 deletions

View file

@ -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'];
} }

View 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;
}
}

View file

@ -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(

View 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());
}
}

View file

@ -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 [