Пакет администратора Sonata как настроить пакетные действия

#symfony #sonata-admin #symfony-sonata #sonata

#symfony #sonata-admin #symfony-sonata #Соната

Вопрос:

Как создать настраиваемое пакетное действие в пакете администратора sonata. Когда я выбираю пакетное действие, мне нужно внести некоторые изменения в выбранные элементы списка, а затем применить пакет.

Я решил это:

 SonataAdmin
public function getBatchActions()
{

    $actions = parent::getBatchActions();

    // check user permissions
    $actions['change'] = [
        'label'            => $this->trans('action_group_change', [], 'admin'),
        'ask_confirmation' => false,
    ];

    return $actions;
}
  

// В контроллере

 public function batchActionChange(ProxyQueryInterface $selectedModelQuery, Request $request = null)
{
    // !$this->admin->isGranted('EDIT')
    // TODO:  при необходимости
    //
    //
    $modelManager = $this->admin->getModelManager();
    $selectedModels = $selectedModelQuery->execute();


    $ids = [];

    foreach ($selectedModels as $selectedModel) {
        $ids[] = $selectedModel->getId();
    }


    return new RedirectResponse(
        $this->admin->generateUrl('change', [
            'ids' => $ids,
        ])
    );
}
public function changeAction(Request $request)
{

    $ids = $request->get('ids');
    if ($ids === null) {
        $this->addFlash('sonata_flash_error', 'Ничего не выбрано');

        return new RedirectResponse($this->admin->generateUrl('list'));
    }
    $form = $this->createForm(new ChangeProxyAdminType());

    if ($request->getMethod()==='POST'){
        $formHandler = $this->get('webface_character.handler.change_proxy');
        $handleResult =$formHandler->handle($form,$request);
        if ($handleResult){
            return new RedirectResponse($this->admin->generateUrl('list'));
        }
    }



    return $this->render('WebfaceCharacterBundle:ProxyAdmin:change.html.twig', [
        'action' => 'change',
        'form'   => $form->createView(),
    ]);
  

Тип формы:

 public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder
        ->add('user', EntityType::class, [
            'class'      => User::class,
            'empty_data' => null,
            'required'   => false,
        ])
        ->add('username', TextType::class, [
            'attr'     => [
                'class' => 'form-control',
            ],
            'required' => false,
        ])
        ->add('password', PasswordType::class, [
            'attr'     => [
                'class' => 'form-control',
            ],
            'required' => false,
        ])
        ->add('isArchive', CheckboxType::class, [
            'attr'     => [
                'class' => 'form-control',
            ],
            'required' => false,
        ]);

}
  

Обработчик формы:

   public function handle(FormInterface $form, Request $request)
{
    if (!$request->isMethod('POST')) {
        return false;
    }

    $form->handleRequest($request);

    if (!$form->isValid()) {
        return false;
    }
    $data = $form->getData();

    $ids = $request->get('ids');
    $qb = $this->em->createQueryBuilder();
    $query = $qb->update('WebfaceCharacterBundle:Proxy', 'p');


    if ($data['user'] !== null) {
        $user = $this->em->getRepository('WebfaceUserBundle:User')->findOneBy(['id' => $data['user']]);
        dump($user);
        $query->set('p.user', $user->getId());
    }

    if ($data['password'] !== null) {
        $query->set('p.password', $qb->expr()->literal($data['password']));
    }

    if ($data['username'] !== null) {
        $query->set('p.username',$qb->expr()->literal($data['username']));
    }

    $query->set('p.isArchive', $qb->expr()->literal($data['isArchive']));
    $query->where($qb->expr()->in('p.id', implode(',', $ids)))
        ->getQuery()
        ->getResult();

    return true;


}
  

Я уверен, что это не лучшее решение. Но я не знаю, как создать наилучшее решение для этой проблемы.

Это решение не работает с пакетным действием до 1000 элементов, потому что в моем решении все идентификаторы передаются в запрос и перенаправление.

PS (Это черновик)

Комментарии:

1. Что это за сообщение об ошибке?

Ответ №1:

Если вы хотите создать настроенные пакетные действия:

  1. Элемент списка
  2. Создайте пользовательскую форму.
  3. Создайте метод контроллера с обработчиком формы
  4. в форме рендеринга batchAction, где action = controllerAction
  5. После обработки формы верните новый RedirectResponse($this->admin->generateUrl(‘list’));