Расширение пользовательского пакета Sonata и настраиваемые действия

У меня есть приложение с Sonata Admin, Sonata User и Fosuser. Я расширил файл администратора из Sonata Admin, чтобы добавить новый столбец и поле:

<?php

namespace AppBundle\Admin;

use Sonata\UserBundle\Admin\Model\UserAdmin as SonataUserAdmin;
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;

class UserAdmin extends SonataUserAdmin 
{
/**
    * {@inheritdoc}
    */
protected function configureFormFields(FormMapper $formMapper)
{
    parent::configureFormFields($formMapper);

    $formMapper
        ->with('Others')
            ->add('company')  
            ->add('locations', 'sonata_type_collection', array(
                'required' => false
            ), array(
                'edit' => 'inline',
                'inline' => 'table',
                'sortable'  => 'position',
            ))               
        ->end()
    ;
}

// Fields to be shown on filter forms
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    parent::configureDatagridFilters($datagridMapper);

    $datagridMapper
        ->remove('email')      
        ->add('firstname')
        ->add('lastname')
        ->add('company.name')     
    ;
}    

// Fields to be shown on lists
protected function configureListFields(ListMapper $listMapper)
{
    unset($this->listModes['mosaic']);
    $listMapper
        ->add('company.name')     
        ->add('firstname')
        ->add('lastname') 
    ;
    parent::configureListFields($listMapper);
    $listMapper->remove('email');   
    $listMapper->add('_action', 'actions', array(
        'actions' => array(
            'Invoiced' => array(
                'template' => 'AppBundle:User:list__action_invoiced.html.twig'
            ),
            'Credited' => array(
                'template' => 'AppBundle:user:list__action_credited.html.twig'
            )                
        )
        ));         
}   

protected function configureRoutes(RouteCollection $collection)
{
    parent::configureRoutes($collection);

    $collection->add('invoiced', $this->getRouterIdParameter().'/invoiced');
    $collection->add('credited', $this->getRouterIdParameter().'/credited');
}      
}

Теперь у меня проблема с новыми действиями «выставлен счет» и «зачислен» ... Controller "Sonata\AdminBundle\Controller\CRUDController::invoicedAction" for URI "/admin/app/user/1/invoiced" is not callable.

Эта конфигурация работает с другой страницей администратора, но не с этим расширением SonataUserAdmin. На других страницах я расширяю "Sonata \ AdminBundle \ Admin \ Admin", но здесь мне нужно расширить "Sonata \ UserBundle \ Admin \ Model \ UserAdmin", чтобы использовать пользовательскую систему fos ...

У тебя есть идеи для меня ???

Спасибо


person Jean-marc Strauven    schedule 07.12.2016    source источник


Ответы (6)


Я думаю, вам просто нужно перенастроить значение аргумент baseControllerName для любого вашего контроллера. Вы можете сделать это в вашем admin.yml файле конфигурации.

person greg0ire    schedule 07.12.2016

У меня есть это

admin.user:
    class: AppBundle\Admin\UserAdmin
    arguments: [~, AppBundle\Entity\User, AppBundle:User]
    tags:
        - { name: sonata.admin, manager_type: orm, label: User, group: Users }     
    calls:
        - [ setTranslationDomain, [AppBundle]]    
person Jean-marc Strauven    schedule 07.12.2016

Вы уже настроили сервис. Теперь вам нужно создать UserController, который расширяет CRUDController и реализует ваши методы invoicedAction и creditedAction.

<?php

namespace AppBundle\Controller;

use AppBundle\Entity\User;
use Sonata\AdminBundle\Controller\CRUDController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;

class UserController extends CRUDController
{

    /**
     *
     * @param string $id
     * @param Request $request
     *
     * @return RedirectResponse
     */
    public function invoicedAction($id = null, Request $request = null)
    {
        if ( $request == null ) {
            $request = $this->getRequest();
        }
        $id = $request->get($this->admin->getIdParameter());

        $user = $this->admin->getObject($id);
        /* @var $user User */

        if (!$user) {
            throw $this->createNotFoundException(sprintf('unable to find the user with id : %s', $id));
        }

        $this->admin->checkAccess('invoiced', $user);

        $this->admin->setSubject($user);

        /// your code here...

        return new RedirectResponse($this->admin->generateUrl('show', array('id' => $user->getId())));
    }
}
person ClickLabs    schedule 07.12.2016

Всегда одно и то же..

Controller "Sonata\AdminBundle\Controller\CRUDController::invoicedAction" for URI "/admin/app/user/1/invoiced" is not callable.

:-(

person Jean-marc Strauven    schedule 07.12.2016

вам нужно установить свой контроллер в разделе sonata_user см.:

https://sonata-project.org/bundles/user/master/doc/reference/advanced_configuration.html app/config/config.yml

sonata_user:
  admin:
    user:
      controller: AppBundle:User
person Dmitry Kingston    schedule 20.03.2018

(Symfony4.1 + Symfony Flex) Нет необходимости регистрировать службу в services.yaml вашего класса userAdmin. Если вы это сделали - у вас будет две сущности в админпанели. Чтобы переопределить базовый класс userAdmin, убедитесь, что ваш config / packages / sonata.yaml выглядит следующим образом (этого достаточно для переопределения):

sonata_user:
security_acl: false
manager_type: orm
class:
    user: App\Entity\Manager
    group: App\Entity\Group
admin:
    user:
       class:          App\Admin\UserAdmin
       controller:     App\Controller\InitController
       translation:    SonataUserBundle
person EvhenKaravan    schedule 20.11.2018