2016-09-17 1 views
1

J'ai besoin d'obtenir une grille de données sur le contrôleur mais cela ne permet pas d'entrer des paramètres dans la fonction. Comment vous récupérez cette information?Actions par lots avec Sonata Admin Bundle sur Symfony

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

C'est le contrôleur

<?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()) 
     ); 
    } 

} 

Et ceci est la fonction getBatchActions

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

L'erreur est

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

Répondre

2

Il est beaucoup plus facile, le faire de cette façon au lieu d'obtenir les catégories par votre propre:

/** 
* @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

Cela n'a rien à voir avec Sonata et tout faire avec Symf Ony: vous avez oublié la déclaration d'utilisation pour Request. Le AppBundle\Controller\Request aurait dû faire vous vous rendez compte que;)

EDIT: deuxième erreur: les méthodes d'action doivent se terminer par ** action *

+0

Merci, j'ai ajouté la ligne 'utiliser Symfony \ Component \ HttpFoundation \ demande;' , mais le problème continue – Dasaaf

+0

voir mon édition, vous n'avez pas mis "action" au bon endroit – greg0ire

+0

J'ai suivi cette documentation [link] (https://sonata-project.org/bundles/admin/master/doc/reference/ batch_actions.html #) bien que symfony soit traité comme vous le mentionnez, Sonata le fait avec 'batchActionInactive' – Dasaaf

0

Je l'ai déjà résolu.

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()) 
    ); 
}