2016-10-04 53 views
2

如何在奏鳴曲管理軟件包中創建自定義混合批量操作。 當我選擇批處理操作時,我需要使用選定的列表視圖項目來配置一些更改,然後應用批處理。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個項目的批處理操作,因爲在我的解決方案中,所有ID都傳遞給查詢和重定向。

P.S. (這是草案)

+0

什麼是錯誤信息? – yceruto

回答

0

如果你想創建配置批處理動作:

  1. 列表項
  2. 創建自定義表單。
  3. 創建控制器法的形式處理程序batchAction
  4. 呈現形式,其中行動= controllerAction
  5. 表單處理後 返回新RedirectResponse($這個 - >管理 - > generateUrl(名單'));
相關問題