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;
use App\Views\Decorators\SiteHead;
use CodeIgniter\Config\View as BaseView;
use CodeIgniter\View\ViewDecoratorInterface;
use ViewComponents\Decorator;
@ -53,5 +54,5 @@ class View extends BaseView
*
* @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
$plugins->setChannelTag($podcast, $channel);
$plugins->channelTag($podcast, $channel);
foreach ($episodes as $episode) {
if ($episode->is_premium && ! $subscription instanceof Subscription) {
@ -460,7 +460,7 @@ if (! function_exists('get_rss_feed')) {
], $item);
}
$plugins->setItemTag($episode, $item);
$plugins->itemTag($episode, $item);
}
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?
}
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
{
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;
/**
* @method void setChannelTag(Podcast $podcast, SimpleRSSElement $channel)
* @method void setItemTag(Episode $episode, SimpleRSSElement $item)
* @method void channelTag(Podcast $podcast, SimpleRSSElement $channel)
* @method void itemTag(Episode $episode, SimpleRSSElement $item)
* @method string siteHead()
*/
class Plugins
{
@ -19,7 +20,7 @@ class Plugins
/**
* @var list<string>
*/
protected const HOOKS = ['setChannelTag', 'setItemTag'];
protected const HOOKS = ['channelTag', 'itemTag', 'siteHead'];
/**
* @var array<BasePlugin>