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
相关产品推荐
相关产品推荐

