feat(plugins): add siteHead hook to add custom meta tags to public pages

This commit is contained in:
Yassine Doghri 2024-05-01 15:41:13 +00:00
parent 0eba234628
commit 275e87cf5c
6 changed files with 54 additions and 10 deletions

View File

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace Config; namespace Config;
use App\Views\Decorators\SiteHead;
use CodeIgniter\Config\View as BaseView; use CodeIgniter\Config\View as BaseView;
use CodeIgniter\View\ViewDecoratorInterface; use CodeIgniter\View\ViewDecoratorInterface;
use ViewComponents\Decorator; use ViewComponents\Decorator;
@ -53,5 +54,5 @@ class View extends BaseView
* *
* @var list<class-string<ViewDecoratorInterface>> * @var list<class-string<ViewDecoratorInterface>>
*/ */
public array $decorators = [Decorator::class]; public array $decorators = [Decorator::class, SiteHead::class];
} }

View File

@ -298,7 +298,7 @@ if (! function_exists('get_rss_feed')) {
} }
// run plugins hook at the end // run plugins hook at the end
$plugins->setChannelTag($podcast, $channel); $plugins->channelTag($podcast, $channel);
foreach ($episodes as $episode) { foreach ($episodes as $episode) {
if ($episode->is_premium && ! $subscription instanceof Subscription) { if ($episode->is_premium && ! $subscription instanceof Subscription) {
@ -460,7 +460,7 @@ if (! function_exists('get_rss_feed')) {
], $item); ], $item);
} }
$plugins->setItemTag($episode, $item); $plugins->itemTag($episode, $item);
} }
return $rss->asXML(); return $rss->asXML();

View File

@ -0,0 +1,36 @@
<?php
declare(strict_types=1);
namespace App\Views\Decorators;
use CodeIgniter\View\ViewDecoratorInterface;
class SiteHead implements ViewDecoratorInterface
{
private static int $renderedCount = 0;
public static function decorate(string $html): string
{
if (url_is(config('Admin')->gateway . '*') || url_is(config('Install')->gateway)) {
return $html;
}
if (static::$renderedCount > 0) {
return $html;
}
ob_start(); // Start output buffering
// run hook to add tags to <head>
service('plugins')->siteHead();
$metaTags = ob_get_contents(); // Store buffer in variable
ob_end_clean();
if (str_contains($html, '</head>')) {
$html = str_replace('</head>', "\n\t{$metaTags}\n</head>", $html);
++static::$renderedCount;
}
return $html;
}
}

View File

@ -59,11 +59,15 @@ abstract class BasePlugin implements PluginInterface
// TODO: setup navigation and views? // TODO: setup navigation and views?
} }
public function setChannelTag(Podcast $podcast, SimpleRSSElement $channel): void public function channelTag(Podcast $podcast, SimpleRSSElement $channel): void
{ {
} }
public function setItemTag(Episode $episode, SimpleRSSElement $item): void public function itemTag(Episode $episode, SimpleRSSElement $item): void
{
}
public function siteHead(): void
{ {
} }

View File

@ -10,7 +10,9 @@ use App\Libraries\SimpleRSSElement;
interface PluginInterface interface PluginInterface
{ {
public function setChannelTag(Podcast $podcast, SimpleRSSElement $channel): void; public function channelTag(Podcast $podcast, SimpleRSSElement $channel): void;
public function setItemTag(Episode $episode, SimpleRSSElement $item): void; public function itemTag(Episode $episode, SimpleRSSElement $item): void;
public function siteHead(): void;
} }

View File

@ -9,8 +9,9 @@ use App\Entities\Podcast;
use App\Libraries\SimpleRSSElement; use App\Libraries\SimpleRSSElement;
/** /**
* @method void setChannelTag(Podcast $podcast, SimpleRSSElement $channel) * @method void channelTag(Podcast $podcast, SimpleRSSElement $channel)
* @method void setItemTag(Episode $episode, SimpleRSSElement $item) * @method void itemTag(Episode $episode, SimpleRSSElement $item)
* @method string siteHead()
*/ */
class Plugins class Plugins
{ {
@ -19,7 +20,7 @@ class Plugins
/** /**
* @var list<string> * @var list<string>
*/ */
protected const HOOKS = ['setChannelTag', 'setItemTag']; protected const HOOKS = ['channelTag', 'itemTag', 'siteHead'];
/** /**
* @var array<BasePlugin> * @var array<BasePlugin>