You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Craft CMS 4自定义插件按钮无法触发方法及侧边栏配置问题

Craft CMS 4 插件问题修复指南

一、按钮无法触发函数的问题修复

1. 控制器动作方法规范修正

Craft 要求控制器的可路由动作必须以 action 开头且为 public,你的代码存在两处问题:

  • 将测试方法改为 public function actionTest()
  • 将 private function actionHandleJsonRead() 改为 public function actionHandleJsonRead()

修正后的控制器关键代码:

// Test function for test purposes
public function actionTest(): Response
{
    dd('test');
    return $this->asJson(['message' => true]);
}

public function actionHandleJsonRead(): Response
{
    // 原有逻辑保持不变
}

2. 路由与表单动作匹配修正

修正Plugin.php中的路由规则

Craft CP 路由格式为 插件句柄/控制器ID/动作ID,控制器ID是类名去掉Controller后驼峰转短横线(如JsonifySettingsController对应jsonify-settings)。修改路由映射:

Event::on(
    UrlManager::class,
    UrlManager::EVENT_REGISTER_CP_URL_RULES,
    function(RegisterUrlRulesEvent $event) {
        // 映射自定义路由到正确的控制器动作
        $event->rules['_jsonify/import/test'] = 'jsonify/jsonify-settings/test';
    }
);

修正Twig模板中的actionInput

确保表单动作路径与路由规则匹配:

{{ actionInput('jsonify/jsonify-settings/test') }}

3. 移除自动执行的初始化逻辑

删掉Plugin.php中Craft::$app->onInit内的代码,避免页面加载时自动执行处理逻辑:

// 移除这段代码
Craft::$app->onInit(function() {
    $this->getJsonFile();
    $this->decodeJsonFile();
});

二、将插件改为仪表盘侧边栏独立页面

1. 注册CP侧边栏导航

在Plugin.php的init()方法中添加导航注册事件:

use craft\web\twig\variables\Cp;
use craft\events\RegisterCpNavItemsEvent;

Event::on(
    Cp::class,
    Cp::EVENT_REGISTER_CP_NAV_ITEMS,
    function(RegisterCpNavItemsEvent $event) {
        $event->navItems[] = [
            'url' => '_jsonify/import',
            'label' => 'JSON导入',
            'icon' => '@jsonify/icon.svg', // 可选:放入插件目录下的自定义图标
            'subnav' => [
                'import' => ['label' => '导入JSON', 'url' => '_jsonify/import'],
            ],
        ];
    }
);

2. 注册页面路由与模板渲染

添加页面路由规则

在Plugin.php的路由注册中新增主页面路由:

Event::on(
    UrlManager::class,
    UrlManager::EVENT_REGISTER_CP_URL_RULES,
    function(RegisterUrlRulesEvent $event) {
        $event->rules['_jsonify/import'] = 'jsonify/jsonify-settings/index';
        $event->rules['_jsonify/import/test'] = 'jsonify/jsonify-settings/test';
    }
);

添加控制器渲染动作

在JsonifySettingsController中添加渲染主页面的方法:

public function actionIndex(): Response
{
    return $this->renderTemplate('jsonify/index'); // 对应src/templates/index.twig
}

修正CP模板根目录注册

将原有的前端模板根注册替换为CP模板根:

Event::on(
    View::class,
    View::EVENT_REGISTER_CP_TEMPLATE_ROOTS,
    function(RegisterTemplateRootsEvent $event) {
        $event->roots['jsonify'] = __DIR__ . '/src/templates';
    }
);

内容的提问来源于stack exchange,提问作者Stef Verniers

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:44:55