yokai/sonata-workflow

在 Sonata Admin 中集成 Symfony 工作流组件

v0.7.2 2024-01-12 08:43 UTC

README

Tests Coverage Contributors

License Latest Stable Version Current Unstable Version Downloads Monthly Total Downloads

简介

此库添加了 Symfony 工作流组件在 Sonata Admin 中的集成。

特性

  • 为您的管理详情页面添加一个下拉菜单,其中包含应用可用转换的按钮
  • 发送一个控制器来应用转换
  • 允许在应用转换过程中挂钩以显示中间页面

代码

安装

$ composer require yokai/sonata-workflow

配置

假设您有一个名为 PullRequest 的实体,它处于工作流中,并且您为它有一个管理员。

# config/packages/workflow.yml
framework:
    workflows:
        pull_request:
            type: state_machine
            marking_store:
                type: state_machine
                property: status
            supports:
                - App\Entity\PullRequest
            places:
                - opened
                - pending_review
                - merged
                - closed
            initial_marking:
                - opened
            transitions:
                start_review:
                    from: opened
                    to:   pending_review
                merge:
                    from: pending_review
                    to:   merged
                close:
                    from: pending_review
                    to:   closed

一个扩展解决所有问题

该扩展可用于许多实体,无需配置。

您只需要创建一个服务,配置将处理转换动作的控制器,并配置在哪个管理员中可用。

例如

# config/packages/sonata_admin.yml
services:
    admin.pull_request:
        class: App\Admin\PullRequestAdmin
        public: true
        arguments: [~, App\Entity\PullRequest, Yokai\SonataWorkflow\Controller\WorkflowController]
        tags:
            - { name: 'sonata.admin', manager_type: orm, label: PullRequest }
    admin.extension.workflow:
        class: Yokai\SonataWorkflow\Admin\Extension\WorkflowExtension
        public: true
        arguments:
            - '@workflow.registry'
    Yokai\SonataWorkflow\Controller\WorkflowController:
        autowire: true
        tags: ['controller.service_arguments']

sonata_admin:
    extensions:
        admin.extension.workflow:
            admins:
                - admin.pull_request

注意:您可能已经注意到我们还注册了控制器 Yokai\SonataWorkflow\Controller\WorkflowController 作为服务。这很重要,因为它需要工作流注册服务来工作。

针对每个管理员的更具体扩展

但是,如果您想自定义行为,扩展接受许多选项。

例如

# config/packages/sonata_admin.yml
services:
    admin.pull_request:
        class: App\Admin\PullRequestAdmin
        public: true
        arguments: [~, App\Entity\PullRequest, 'Yokai\SonataWorkflow\Controller\WorkflowController']
        tags:
            - { name: 'sonata.admin', manager_type: orm, label: PullRequest }
    admin.extension.pull_request_workflow:
        class: Yokai\SonataWorkflow\Admin\Extension\WorkflowExtension
        public: true
        arguments:
            - '@workflow.registry'
            - render_actions: [show]
              workflow_name: pull_request
              no_transition_label: No transition for pull request
              no_transition_icon: fa fa-times
              dropdown_transitions_label: Pull request transitions
              dropdown_transitions_icon: fa fa-archive
              transitions_default_icon: fa fa-step-forward
              transitions_icons:
                  start_review: fa fa-search
                  merge: fa fa-check
                  close: fa fa-times
    Yokai\SonataWorkflow\Controller\WorkflowController:
        autowire: true
        tags: ['controller.service_arguments']

sonata_admin:
    extensions:
        admin.extension.pull_request_workflow:
            admins:
                - admin.pull_request

这些选项是什么?

  • render_actions:扩展应渲染其菜单的管理员操作名称(默认为 [显示,编辑]
  • workflow_name:要处理的工作流名称(默认为 null
  • no_transition_display:是否显示禁用转换时的按钮(默认为 false
  • no_transition_label:禁用转换时的按钮标签(默认为 workflow_transitions_empty
  • no_transition_icon:禁用转换时的按钮图标(默认为 fa fa-code-fork
  • dropdown_transitions_label:启用转换时下拉按钮的标签(默认为 workflow_transitions
  • dropdown_transitions_icon:启用转换时下拉按钮的图标(默认为 fa fa-code-fork
  • transitions_default_icon:所有转换的默认转换图标(默认为 null:无图标)
  • transitions_icons:一个哈希,其中转换名称作为键,图标作为值(默认为 []

挂钩到转换过程

假设您开始对拉取请求进行审查时,作为用户,您将被要求输入参与审查的用户。

为了实现这一点,您将需要填写一个专用表单。

您只需要为您的实体管理员创建一个自定义控制器

# config/packages/sonata_admin.yml
services:
    admin.pull_request:
        class: App\Admin\PullRequestAdmin
        public: true
        arguments: [~, App\Entity\PullRequest, App\Admin\Controller\PullRequestController]
        tags:
            - { name: 'sonata.admin', manager_type: orm, label: PullRequest }
<?php
// src/Admin/Controller/PullRequestController.php

declare(strict_types=1);

namespace App\Admin\Controller;

use App\Entity\PullRequest;
use App\Form\PullRequest\StartReviewType;
use Sonata\AdminBundle\Controller\CRUDController;
use Symfony\Component\HttpFoundation\Response;
use Yokai\SonataWorkflow\Controller\WorkflowControllerTrait;

class PullRequestController extends CRUDController
{
    use WorkflowControllerTrait;

    protected function preApplyTransition(object $object, string $transition): ?Response
    {
        switch ($transition) {
            case 'start_review':
                return $this->startReview($object, $transition);
        }

        return null;
    }

    protected function startReview(PullRequest $object, string $transition): ?Response
    {
        $form = $this->createForm(
            StartReviewType::class,
            [],
            [
                'action' => $this->admin->generateObjectUrl(
                    'workflow_apply_transition',
                    $object,
                    ['transition' => $transition]
                ),
            ]
        );

        $form->handleRequest($this->getRequest());

        if (!$form->isSubmitted() || !$form->isValid()) {
            $formView = $form->createView();

            return $this->renderWithExtraParams('admin/pull-request/start-review.html.twig', [
                'action' => 'edit',
                'form' => $formView,
                'object' => $object,
                'objectId' => $this->admin->getNormalizedIdentifier($object),
            ], null);
        }

        $data = $form->getData();
        // do something with the submitted data before returning null to continue applying transition

        return null;
    }
}

MIT 许可证

许可证可以在 这里 找到。

作者

此库最初由 Yann Eugoné 创建。请参阅 贡献者列表

感谢 Prestaconcept 对本库的支持。