feat: rewrite schema-driven widget system
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace AKSRT\WidgetSystem;
|
||||
|
||||
use AKSRT\WidgetSystem\Renderers\ContentRenderer;
|
||||
use AKSRT\WidgetSystem\Renderers\GeneralRenderer;
|
||||
use AKSRT\WidgetSystem\Renderers\KnowledgeProductRenderer;
|
||||
use AKSRT\WidgetSystem\Renderers\SliderRenderer;
|
||||
use AKSRT\WidgetSystem\Renderers\UserRenderer;
|
||||
|
||||
defined('ABSPATH') || exit;
|
||||
|
||||
/**
|
||||
* One explicit dispatch table for every modern widget renderer.
|
||||
*/
|
||||
final class RendererRegistry {
|
||||
/** @return array<string, class-string> */
|
||||
public static function all(): array {
|
||||
return [
|
||||
'search' => GeneralRenderer::class, 'posts_toc' => GeneralRenderer::class,
|
||||
'quote' => GeneralRenderer::class, 'icon_cards' => GeneralRenderer::class,
|
||||
'video' => GeneralRenderer::class, 'embed' => GeneralRenderer::class,
|
||||
'media_cards' => GeneralRenderer::class, 'icon_cover_cards' => GeneralRenderer::class,
|
||||
'partners' => GeneralRenderer::class, 'combo_info' => GeneralRenderer::class,
|
||||
'text_title' => GeneralRenderer::class, 'buttons' => GeneralRenderer::class,
|
||||
'layout_gap' => GeneralRenderer::class, 'tag_cloud' => GeneralRenderer::class,
|
||||
'recent_comments' => GeneralRenderer::class, 'links' => GeneralRenderer::class,
|
||||
'notice' => GeneralRenderer::class,
|
||||
'term_cards' => ContentRenderer::class, 'term_aggregation' => ContentRenderer::class,
|
||||
'hot_posts' => ContentRenderer::class, 'post_pay' => ContentRenderer::class,
|
||||
'posts' => ContentRenderer::class, 'tab_posts' => ContentRenderer::class,
|
||||
'oneline_posts' => ContentRenderer::class,
|
||||
'pricing_plans' => KnowledgeProductRenderer::class, 'reviews' => KnowledgeProductRenderer::class,
|
||||
'faq' => KnowledgeProductRenderer::class, 'stats' => KnowledgeProductRenderer::class,
|
||||
'highlights' => KnowledgeProductRenderer::class, 'feature_intro' => KnowledgeProductRenderer::class,
|
||||
'tilt_cases' => KnowledgeProductRenderer::class,
|
||||
'slider' => SliderRenderer::class, 'slider_media_combo' => SliderRenderer::class,
|
||||
'user_card' => UserRenderer::class, 'author_card' => UserRenderer::class,
|
||||
'user_ranking' => UserRenderer::class, 'user_list' => UserRenderer::class,
|
||||
];
|
||||
}
|
||||
|
||||
public static function render(string $slug, array $instance, array $context = []): string {
|
||||
$renderer = self::all()[$slug] ?? null;
|
||||
if ($renderer === null || !is_callable([$renderer, 'render'])) {
|
||||
return '';
|
||||
}
|
||||
return (string) $renderer::render($slug, $instance, $context);
|
||||
}
|
||||
|
||||
public static function supports_items(string $slug): bool {
|
||||
return in_array($slug, ['posts', 'tab_posts', 'oneline_posts', 'hot_posts'], true);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user