mirror of
https://code.castopod.org/adaures/castopod
synced 2025-04-19 13:01:19 +00:00
feat(plugins): add siteHead hook to add custom meta tags to public pages
This commit is contained in:
parent
dfd5fe73cb
commit
fc67af19cb
@ -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];
|
||||
}
|
||||
|
@ -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();
|
||||
|
36
app/Views/Decorators/SiteHead.php
Normal file
36
app/Views/Decorators/SiteHead.php
Normal 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;
|
||||
}
|
||||
}
|
@ -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
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user