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

Symfony7.3+EasyAdmin4.27中为表单添加自定义同步按钮

实现方案

1. 新增后台同步路由

在config/routes/easy_admin.yaml中添加路由,映射到Crud控制器的同步处理方法:

easy_admin_sync_ev_data:
    path: /admin/sync-ev-data/{id}
    controller: App\Controller\Admin\ConCrudController::syncEvData
    methods: [POST]

2. 在ConCrudController中实现服务调用逻辑

注入EvSyncService,编写处理同步请求的方法,返回JSON格式结果:

use App\Entity\EvData;
use App\Service\EvSyncService;
use Symfony\Component\HttpFoundation\JsonResponse;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;

class ConCrudController extends AbstractCrudController
{
    // ... 原有代码

    public function syncEvData(EvData $evData, EvSyncService $syncService): JsonResponse
    {
        try {
            $syncService->sync($evData);
            return new JsonResponse(['status' => 'success', 'message' => '同步完成']);
        } catch (\Exception $e) {
            return new JsonResponse(['status' => 'error', 'message' => $e->getMessage()], 500);
        }
    }
}

3. 给CollectionField添加自定义同步按钮

修改configureFields方法,为Collection字段指定自定义模板,传递实体ID参数:

use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField;
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\FieldDto;
use EasyCorp\Bundle\EasyAdminBundle\Controller\EntityCrudController;

public function configureFields(string $pageName): iterable
{
    // ... 其他字段定义
    yield CollectionField::new('evData', 'EV数据')
        ->setEntryType(EvTypeForm::class)
        ->setTemplatePath('admin/field/collection_with_sync_btn.html.twig');
}

4. 创建自定义Twig模板渲染按钮

在templates/admin/field/collection_with_sync_btn.html.twig中,继承EasyAdmin默认Collection模板,为每个表单条目添加同步按钮:

{% extends '@EasyAdmin/crud/field/collection.html.twig' %}

{% block collection_item %}
    {{ parent() }}
    {% if form.vars.value.id is not empty %}
        <button type="button" class="btn btn-secondary ms-2 sync-btn" data-id="{{ form.vars.value.id }}">
            同步数据
        </button>
    {% endif %}
{% endblock %}

5. 前端JS处理按钮点击事件

在templates/admin/crud/edit.html.twig中添加脚本,处理按钮点击、请求发送和状态反馈:

{% block javascripts %}
    {{ parent() }}
    <script>
        document.addEventListener('DOMContentLoaded', () => {
            document.querySelectorAll('.sync-btn').forEach(btn => {
                btn.addEventListener('click', async () => {
                    const evId = btn.dataset.id;
                    const originalText = btn.textContent;
                    btn.textContent = '同步中...';
                    btn.disabled = true;

                    try {
                        const res = await fetch(`{{ path('easy_admin_sync_ev_data', {id: 0}) }}`.replace('/0', `/${evId}`), {
                            method: 'POST',
                            headers: {
                                'X-CSRF-Token': '{{ csrf_token('easy_admin') }}',
                                'Accept': 'application/json'
                            }
                        });
                        const data = await res.json();
                        alert(data.message);
                    } catch (err) {
                        alert('同步请求失败,请检查控制台');
                        console.error(err);
                    } finally {
                        btn.textContent = originalText;
                        btn.disabled = false;
                    }
                });
            });
        });
    </script>
{% endblock %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 21:12:16