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

Craft CMS自定义插件:如何实现按钮点击时JS调用插件函数?

在Craft CMS中实现Widget按钮调用插件后端函数

1. 编写后端处理函数:创建插件控制器

函数要放在插件的controllers目录下的控制器类里,比如创建WidgetActionsController.php:

<?php

namespace yournamespace\yourplugin\controllers;

use Craft;
use craft\web\Controller;

class WidgetActionsController extends Controller
{
    // 仅允许已登录用户访问(根据需求调整)
    protected array|int|bool $allowAnonymous = false;

    public function actionYourTargetFunction()
    {
        // 这里编写你需要执行的业务逻辑
        $request = Craft::$app->getRequest();
        $params = $request->getBodyParam('params'); // 获取前端传入的参数

        // 处理完成后返回JSON响应
        return $this->asJson([
            'success' => true,
            'msg' => '操作执行成功',
            'data' => $params
        ]);
    }
}

注意替换yournamespace\yourplugin为你的插件实际命名空间,方法名前缀action是Craft控制器的约定。

2. 注册插件路由

在插件主类(如YourPlugin.php)的init()方法中添加路由规则,让前端能访问到控制器方法:

public function init()
{
    parent::init();

    // 注册路由,格式为「插件句柄/控制器名(小写)/方法名(去掉action前缀,小写)」
    Craft::$app->getUrlManager()->addRules([
        'your-plugin-handle/widget-actions/your-target-function' => 'your-plugin-handle/widget-actions/your-target-function'
    ], false);

    // 其他插件初始化逻辑...
}

替换your-plugin-handle为你的插件实际句柄,确保路由路径和控制器方法对应。

3. 前端JS调用后端函数

在Widget关联的JS文件中,给按钮绑定点击事件,通过fetch发送请求:

document.addEventListener('DOMContentLoaded', () => {
    const triggerBtn = document.getElementById('your-widget-button-id');
    if (!triggerBtn) return;

    triggerBtn.addEventListener('click', async () => {
        try {
            // 获取Craft内置的CSRF Token,避免请求被拦截
            const csrfToken = Craft.csrfTokenValue;
            const response = await fetch('/your-plugin-handle/widget-actions/your-target-function', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'X-CSRF-Token': csrfToken
                },
                body: JSON.stringify({
                    params: '前端传递的参数内容'
                })
            });

            const result = await response.json();
            if (result.success) {
                console.log(result.msg);
                // 这里添加操作成功后的前端逻辑,比如更新Widget内容
            } else {
                console.error('操作失败:', result.msg || '未知错误');
            }
        } catch (err) {
            console.error('请求出错:', err);
        }
    });
});

替换your-widget-button-id为你的按钮实际ID,确保请求地址和注册的路由一致。

核心说明

  • 后端函数必须放在控制器类中,这是Craft官方规范的前后端交互方式,通过路由映射实现前端访问。
  • 所有POST请求必须携带CSRF Token,否则会被Craft的安全机制拦截,Craft.csrfTokenValue可直接获取当前用户的有效Token。
  • 如果是纯数据查询类操作,可改用GET请求,但涉及数据修改的操作建议始终用POST。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:39:57