Files
wordpress-theme-aksrt/src/WidgetSystem/AdminFormController.php
T

69 lines
2.8 KiB
PHP

<?php
namespace AKSRT\WidgetSystem;
defined('ABSPATH') || exit;
/**
* Lazy widget form endpoint and admin-only assets.
*/
final class AdminFormController {
public const AJAX_ACTION = 'aksrt_widget_form';
private const NONCE_ACTION = 'aksrt_widget_form';
public static function register_hooks(): void {
add_action('wp_ajax_' . self::AJAX_ACTION, [self::class, 'ajax_form']);
add_action('admin_enqueue_scripts', [self::class, 'enqueue']);
add_action('customize_controls_enqueue_scripts', [self::class, 'enqueue']);
}
public static function enqueue(): void {
$screen = function_exists('get_current_screen') ? get_current_screen() : null;
$is_customizer = current_filter() === 'customize_controls_enqueue_scripts';
if (!$is_customizer && (!$screen || !in_array($screen->id, ['widgets', 'customize'], true))) {
return;
}
wp_enqueue_media();
wp_enqueue_style('wp-color-picker');
wp_enqueue_script('jquery-ui-sortable');
wp_enqueue_style('aksrt-widget-admin', AKSRT_URI . '/assets/widgets/admin.css', ['wp-color-picker'], AKSRT_VERSION);
wp_enqueue_style('aksrt-widget-preview', AKSRT_URI . '/assets/widgets/frontend.css', [], AKSRT_VERSION);
wp_enqueue_script('aksrt-widget-admin-core', AKSRT_URI . '/assets/widgets/admin-core.js', [], AKSRT_VERSION, true);
wp_enqueue_script('aksrt-widget-admin', AKSRT_URI . '/assets/widgets/admin.js', ['jquery', 'jquery-ui-sortable', 'wp-color-picker', 'aksrt-widget-admin-core'], AKSRT_VERSION, true);
wp_localize_script('aksrt-widget-admin', 'aksrtWidgetAdmin', [
'ajaxUrl' => admin_url('admin-ajax.php'),
'action' => self::AJAX_ACTION,
'nonce' => wp_create_nonce(self::NONCE_ACTION),
'transferNonce' => wp_create_nonce('aksrt_widgets_transfer'),
'i18n' => [
'loading' => __('正在加载模块配置…', 'aksrt'),
'error' => __('加载失败,请重试。', 'aksrt'),
],
]);
}
public static function ajax_form(): void {
check_ajax_referer(self::NONCE_ACTION, 'nonce');
if (!current_user_can('edit_theme_options')) {
wp_send_json_error(['message' => __('权限不足。', 'aksrt')], 403);
}
$id_base = isset($_POST['id_base']) ? sanitize_key(wp_unslash($_POST['id_base'])) : '';
$number = isset($_POST['widget_number']) ? absint($_POST['widget_number']) : 0;
$definition = WidgetRegistry::get_by_id_base($id_base);
if (!$definition || $number < 1) {
wp_send_json_error(['message' => __('无效的小工具实例。', 'aksrt')], 400);
}
$widget = new SchemaWidget($definition);
$widget->_set($number);
$settings = $widget->get_settings();
$instance = isset($settings[$number]) && is_array($settings[$number]) ? $settings[$number] : [];
ob_start();
$widget->render_full_form($instance);
$html = (string) ob_get_clean();
wp_send_json_success(['html' => $html]);
}
}