2016-09-17 7 views
1

コントローラーでデータグリッドを取得する必要がありますが、関数にパラメーターを入力することはできません。あなたはその情報をどのように回復しますか?symfonyのSonata Admin Bundleを使ったバッチアクション

services: 
     admin.category: 
       class: AppBundle\Admin\CategoryAdmin 
       arguments: [~, AppBundle\Entity\Category, AppBundle:CRUDCategory, ~]    
       tags: 
        - { name: sonata.admin, manager_type: orm, group: "General", label: Categories } 

これは、コントローラ

<?php 

namespace AppBundle\Controller; 

use Sonata\AdminBundle\Controller\CRUDController as SonataController; 
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery as ProxyQueryInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\HttpFoundation\Request; 

class CRUDCategoryController extends SonataController { 

    /** 
    * @param ProxyQueryInterface $selectedModelQuery 
    * @param Request    $request 
    * 
    * @return RedirectResponse 
    */ 
    public function batchActionInactive(ProxyQueryInterface $selectedModelQuery, Request $request) {   
     $em = $this->getDoctrine()->getManager(); 
     $category = $em->getRepository('AppBundle:Category')->find($request->getId()); 
     $category->setState('INACTIVE'); 
     $em->flush(); 
     return new RedirectResponse(
      $this->admin->generateUrl('list', $this->admin->getFilterParameters()) 
     ); 
    } 

} 

であり、これはエラーが

Catchable Fatal Error: Argument 2 passed to AppBundle\Controller\CRUDCategoryController::batchActionInactive() must be an instance of AppBundle\Controller\Request, none given

答えて

2

それを代わりにあなた自身でカテゴリを得るためのこの方法を行うことが、はるかに簡単です:

/** 
* @param ProxyQueryInterface $selectedModelQuery 
* 
* @return RedirectResponse 
*/ 
public function batchActionInactive(ProxyQueryInterface $selectedModelQuery) 
{ 
    $selectedCategories = $selectedModelQuery->execute(); 

    try { 
     /** @var Category $category */ 
     foreach ($selectedCategories as $category) { 
      $category->setState('INACTIVE'); 
      $this->admin->update($category); 
     } 
    } catch (\Exception $e) { 
     $this->addFlash(
      'sonata_flash_error', 
      'Could not mark Categories "INACTIVE"' 
     ); 

     $this->get('logger')->error($e->getMessage()); 

     return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters())); 
    } 

    $this->addFlash(
     'sonata_flash_success', 
     'Categories were marked as "INACTIVE"' 
    ); 

    return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters())); 
} 
1

これは、ソナタ、すべてとは何の関係もありませんで、関数getBatchActions

public function getBatchActions() { 
     $actions = parent::getBatchActions(); 
     unset($actions['delete']); 
     $actions['inactive'] = array(
      'label' => 'Disable category', 
      'ask_confirmation' => false 
     ); 
     return $actions; 
    } 

ですSymfと関係がありますony:Requestのuseステートメントを忘れた。 AppBundle\Controller\Requestはあなたが実感しました持つべき;)

EDIT:第二のエラー:アクションメソッドは、私はすでに解決してきた

+0

おかげで、私はライン 'symfonyの\コンポーネント\ HttpFoundation \要求を使用するを追加しました;'しかし、問題は続く – Dasaaf

+0

私の編集を参照してください、あなたは正しい場所に "行動"を入れていませんでした – greg0ire

+0

私はこのドキュメント[リンク](https://sonata-project.org/bundles/admin/master/doc/reference/ batch_actions.html#)symfonyはあなたが言及したように処理されましたが、Sonataは 'batchActionInactive'で行います – Dasaaf

0

**アクション*で終わる必要があります。

public function batchActionInactive(ProxyQueryInterface $selectedModelQuery) { 
    $em = $this->getDoctrine()->getManager(); 
    $request = $this->getRequest(); 
    $ids = $request->request->get('idx'); 
    foreach ($ids as $id) { 
     $category = $em->getRepository('AppBundle:Category')->find($id); 
     $category->setState('INACTIVE'); 
     $em->flush(); 
    } 
    return new RedirectResponse(
     $this->admin->generateUrl('list', $this->admin->getFilterParameters()) 
    ); 
} 
関連する問題