Как добавить настраиваемое действие в EasyAdmin 3?

У меня есть CrudController для моей сущности, Участник. Я хочу добавить настраиваемое действие sendAcknowledgementEmail. В документации EasyAdmin ничего не говорится о параметры пользовательской функции или возвращаемые значения.

У меня есть следующий код

public function configureActions(Actions $actions): Actions
{
    $send_acknowledgement_email = Action::new('sendAcknowledgementEmail', 'Send Acknowledgement Email', 'fa fa-send')
        ->linkToCrudAction('sendAcknowledgementEmail');

    return $actions
        ->add(Crud::PAGE_INDEX, $send_acknowledgement_email)
        ->add(Crud::PAGE_EDIT, $send_acknowledgement_email)
    ;
}

public function sendAcknowledgementEmail() //Do I need parameters?
{
    //How do I get the Entity?

    //What should I return?
}

Пока EasyAdmin обнаруживает пользовательскую функцию, но я получаю сообщение об ошибке. Контроллер должен вернуть объект Symfony \ Component \ HttpFoundation \ Response, но он вернул значение null. Вы забыли добавить оператор return где-нибудь в своем контроллере?

Как мне продолжить отсюда?


person ceochronos    schedule 08.08.2020    source источник
comment
Год спустя, а надлежащей документации для EasyAdmin 3 все еще нет.   -  person Quatsch    schedule 07.07.2021
comment
Уже год !? Время летит незаметно. Мой проект преуспел, и с тех пор я не касался этого репо.   -  person ceochronos    schedule 08.07.2021


Ответы (2)


Пакет v3.x довольно новый, и документация еще не идеальна.

Основываясь на ответе Ceochronos, вот моя реализация действия клонирования.

public function configureActions(Actions $actions): Actions
{
    $cloneAction = Action::new('Clone', '')
        ->setIcon('fas fa-clone')
        ->linkToCrudAction('cloneAction');

    return $actions
        ->add(Crud::PAGE_INDEX, $cloneAction);

}

public function cloneAction(AdminContext $context)
{
    $id     = $context->getRequest()->query->get('entityId');
    $entity = $this->getDoctrine()->getRepository(Product::class)->find($id);

    $clone = clone $entity;

    // custom logic 
    $clone->setEnabled(false);
    // ...
    $now = new DateTime();
    $clone->setCreatedAt($now);
    $clone->setUpdatedAt($now);

    $this->persistEntity($this->get('doctrine')->getManagerForClass($context->getEntity()->getFqcn()), $clone);
    $this->addFlash('success', 'Product duplicated');

    return $this->redirect($this->get(CrudUrlGenerator::class)->build()->setAction(Action::INDEX)->generateUrl());
}
person Kaizoku Gambare    schedule 24.09.2020
comment
Спасибо! Это спасло мне день. Я немного изменился, потому что предпочитаю, чтобы пользователь перенаправлялся на страницу редактирования нового объекта: return $this->redirect($this->get(CrudUrlGenerator::class)->build()->setAction(Action::EDIT)->setEntityId($clone->id)->generateUrl()); - person senechaux; 05.01.2021

После просмотра EasyAdmin AbstractCrudController я придумал следующий рабочий код.

  • Для того, чтобы получить текущий объект, вам понадобится параметр AdminContext.
  • В моем случае я хочу вернуться к действию индекса CrudController, поэтому для этого я могу сделать перенаправить.

Примечание: вам необходимо внедрить службу CrudUrlGenerator в ваш конструктор-контроллер.

public function sendAcknowledgementEmail(AdminContext $context)
{
    $participant = $context->getEntity()->getInstance();

    // Your logic

    $url = $this->crudUrlGenerator->build()
        ->setController(ParticipantCrudController::class)
        ->setAction(Action::INDEX)
        ->generateUrl();

    return $this->redirect($url);
}

Моя текущая функция выглядит так:

public function sendAcknowledgementEmail(AdminContext $context)
{
    $participant = $context->getEntity()->getInstance();

    $participant->sendAcknowledgementEmail();

    $this->addFlash('notice','<span style="color: green"><i class="fa fa-check"></i> Email sent</span>');

    $url = $this->crudUrlGenerator->build()
        ->setController(ParticipantCrudController::class)
        ->setAction(Action::INDEX)
        ->generateUrl();

    return $this->redirect($url);
}

Мой текущий рабочий код

<?php

namespace App\Controller\Admin;

use App\Service\WebinarService;
use EasyCorp\Bundle\EasyAdminBundle\Router\CrudUrlGenerator;
use Symfony\Contracts\Translation\TranslatorInterface;
// ...

class ParticipantCrudController extends AbstractCrudController
{

    private CrudUrlGenerator $crudUrlGenerator;
    private WebinarService $webinar_service;
    private TranslatorInterface $translator;

    public function __construct(CrudUrlGenerator $crudUrlGenerator, WebinarService $webinar_service, TranslatorInterface $translator)
    {
        $this->crudUrlGenerator = $crudUrlGenerator;
        $this->webinar_service = $webinar_service;
        $this->translator = $translator;
    }

    // ...

    public function sendAcknowledgementEmail(AdminContext $context): Response
    {
        $participant = $context->getEntity()->getInstance();

        try {
            $this->webinar_service->sendAcknowledgementEmail($participant);

            $this->addFlash('notice', 'flash.email.sent');
        } catch (Exception $e) {
            $this->addFlash('error', $this->translator->trans('flash.error', ['message' => $e->getMessage()]));
        }

        $url = $this->crudUrlGenerator->build()
            ->setController(ParticipantCrudController::class)
            ->setAction(Action::INDEX)
            ->generateUrl()
        ;

        return $this->redirect($url);
    }
}
person ceochronos    schedule 08.08.2020
comment
Не могли бы вы также добавить код конструктора? - person Quatsch; 07.07.2021
comment
@Quatsch вот ты где! - person ceochronos; 08.07.2021
comment
Спасибо! Тем временем я выяснил, что, начиная с EasyAdmin 3.2.0, они изменили его на AdminUrlGenerator < / а>. Однако реализация и использование очень похожи. - person Quatsch; 08.07.2021