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

Shopware6插件开发:点击后台按钮调用PHP服务类方法示例

Shopware6 插件实现导入按钮调用自定义PHP服务示例

以下是完整的实现步骤及代码示例,适配你的需求:

1. 创建自定义PHP服务类

在插件目录的 src/Service 下创建 ImporterService.php,编写核心导入逻辑:

<?php

namespace YourPluginName\Service;

class ImporterService
{
    public function handleImport(): array
    {
        // 这里编写你的导入业务逻辑,比如读取文件、处理数据、写入数据库等
        return [
            'success' => true,
            'message' => '导入操作执行成功'
        ];
    }
}

2. 注册服务与控制器

在 src/Resources/config/services.xml 中注册服务,让Shopware可以识别并注入该类:

<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <!-- 注册导入服务 -->
        <service id="YourPluginName\Service\ImporterService" />

        <!-- 注册控制器 -->
        <service id="YourPluginName\Controller\Admin\ImporterController" public="true">
            <argument type="service" id="YourPluginName\Service\ImporterService" />
            <tag name="controller.service_arguments" />
        </service>
    </services>
</container>

3. 配置Admin API路由

在 src/Resources/config/routes.xml 中添加POST路由,用于接收前端按钮的请求:

<?xml version="1.0" ?>

<routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing https://symfony.com/schema/routing/routing-1.0.xsd">

    <route id="yourpluginname.admin.importer.handle_import" path="/api/_action/yourpluginname/importer/handle" methods="POST">
        <default key="_controller">YourPluginName\Controller\Admin\ImporterController::handleImport</default>
    </route>
</routes>

4. 创建控制器处理请求

在 src/Controller/Admin 下创建 ImporterController.php,作为前端请求与服务类的中间处理层:

<?php

namespace YourPluginName\Controller\Admin;

use YourPluginName\Service\ImporterService;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class ImporterController
{
    private $importerService;

    public function __construct(ImporterService $importerService)
    {
        $this->importerService = $importerService;
    }

    #[Route(path: '/api/_action/yourpluginname/importer/handle', name: 'yourpluginname.admin.importer.handle_import', methods: ['POST'])]
    public function handleImport(Request $request): JsonResponse
    {
        try {
            $result = $this->importerService->handleImport();
            return new JsonResponse($result);
        } catch (\Exception $e) {
            return new JsonResponse([
                'success' => false,
                'message' => '导入失败:' . $e->getMessage()
            ], 500);
        }
    }
}

5. 前端页面添加导入按钮并绑定请求

假设你的导入页面模板是 src/Resources/views/admin/importer/index.html.twig,添加按钮并编写Ajax请求逻辑:

{% sw_extends '@Administration/base.html.twig' %}

{% block content %}
    <div class="sw-page-content">
        <button id="startImportBtn" class="sw-button sw-button--primary">
            {{ 'YourPluginName.importer.button.import'|trans }}
        </button>
    </div>
{% endblock %}

{% block script %}
    {{ parent() }}
    <script>
        document.addEventListener('DOMContentLoaded', function() {
            const importBtn = document.getElementById('startImportBtn');
            importBtn.addEventListener('click', async function() {
                try {
                    const response = await fetch('/api/_action/yourpluginname/importer/handle', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json',
                            'X-Shopware-Admin-Api-Context': window.adminApiContextToken
                        }
                    });

                    const result = await response.json();
                    if (result.success) {
                        Shopware.Notification.createNotification({
                            title: '成功',
                            message: result.message,
                            variant: 'success'
                        });
                    } else {
                        Shopware.Notification.createNotification({
                            title: '失败',
                            message: result.message,
                            variant: 'error'
                        });
                    }
                } catch (error) {
                    Shopware.Notification.createNotification({
                        title: '错误',
                        message: '请求失败:' + error.message,
                        variant: 'error'
                    });
                }
            });
        });
    </script>
{% endblock %}

注意事项

  • 替换所有 YourPluginName 为你实际的插件命名空间(比如 SwagImporter)
  • 若需要支持文件上传,可修改前端表单和控制器逻辑,接收上传文件后传递给服务类处理
  • 插件激活后,执行 bin/console cache:clear 清除Shopware缓存

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:40:22