2016-10-04 1 views
2

Comment créer une action de lot confus personnalisée dans Bundle d'administration sonata. Lorsque je sélectionne une action de traitement par lots, il est nécessaire de combiner certaines modifications avec les éléments de vue de liste sélectionnés, puis d'appliquer le traitement par lots.Groupe d'administration Sonata Comment configurer les actions par lots

Je suis résolu ceci:

SonataAdmin 
public function getBatchActions() 
{ 

    $actions = parent::getBatchActions(); 

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

    return $actions; 
} 

// Dans le contrôleur

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(), 
    ]); 

Type de formulaire:

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, 
     ]); 

} 

gestionnaire de formulaire:

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; 


} 

Je suis sûr que ce n'est pas la meilleure solution. Mais je ne sais pas comment créer la meilleure solution pour ce problème.

Cette solution ne fonctionne pas avec une action par lots de 1000 éléments, car dans ma solution, tous les identifiants passent à la requête et à la redirection.

P.S. (Ce projet est)

+0

Quel est le message d'erreur? – yceruto

Répondre

0

Si vous voulez créer des actions de lots configurées:

  1. Liste item
  2. Créer un formulaire personnalisé.
  3. Créer méthode du contrôleur avec gestionnaire de formulaire
  4. dans batchAction render forme où l'action = controllerAction
  5. Après la gestion des formulaires retour nouvelle RedirectResponse ($ this-> Admin-> generateUrl ('list'));