Sonata Admin - 管理员列表中的可排序行为

时间:2016-04-05 12:27:54

标签: symfony sonata-admin

我试图在我的奏鸣曲管理列表中实现一个可排序的系统。 我关注此文档:https://sonata-project.org/bundles/admin/master/doc/cookbook/recipe_sortable_listing.html 但它没有工作。

这是我的配置: 我的实体字段

* @Gedmo\SortablePosition
* @ORM\Column(name="rank", type="integer")
*/
protected $rank;

我的service.yml:

services:
    gedmo.listener.sortable:
        class: Gedmo\Sortable\SortableListener
        tags:
            - { name: doctrine.event_subscriber, connection: default }
        calls:
            - [ setAnnotationReader, [ "@annotation_reader" ] ]

  app.admin.client:
          class: AppBundle\Admin\ClientAdmin
          tags:
              - { name: sonata.admin, manager_type: orm, label: "Clients" }
          arguments:
              - ~
              - AppBundle\Entity\Client
              - 'PixSortableBehaviorBundle:SortableAdmin' 

stof_doctrine_extensions:
    orm:
        default:
        sortable: true

我对Sonata的问题忠告编辑

class Question extends Admin
{
    public $last_position = 0;

    private $positionService;

    protected $datagridValues = array(
        '_page' => 1,
        '_sort_by' => 'ASC',
        '_sort_order' => 'position',
    );

    public function setPositionService(PositionHandler $positionHandler)
    {
        $this->positionService = $positionHandler;
    }

    protected function configureRoutes(RouteCollection $collection)
    {
        $collection->add('move', $this->getRouterIdParameter().'/move/{position}');
    }

    /**
     * @param DatagridMapper $datagridMapper
     */
    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper
            ->add('headline')
            ->add('body')
            ->add('category')
            ->add('slug');
    }
    /**
     * @param ListMapper $listMapper
     */
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('id')
            ->add('headline', null, array(
                'identifier' => true,
                'label' => 'Titres',
            ))
            ->add('category', null, array(
                'label' => 'Catégories',
            ))
            ->add('position')
            ->add('_action', 'actions', array(
                'actions' => array(
                    'edit' => array(),
                    'delete' => array(),
                    'move' => array('template' => 'PixSortableBehaviorBundle:Default:_sort.html.twig'),
                ),
                'label' => 'Actions',
            ));
    }
    /**
     * @param FormMapper $formMapper
     */
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('headline', null, array(
                'attr' => array('class' => 'span12'),
                'label' => 'Questions',
            ))
            ->add('body', null, array(
                'required' => false,
                'label' => 'Réponses',
                'attr' => array('class' => 'span12'),
            ))
            ->add('category', null, array(
                'expanded' => true,
                'required' => true,
                'label' => 'Catégories',
                'attr' => array('class' => 'radio-list vertical'),
            ))
            ->add('position', 'hidden', array(
                'required' => true,
                'attr' => array('class' => 'span12'),
                'label' => 'Rang',
                'data' => 1,
            ))
            ->add('slug', null, array(
                'required' => false,
                'attr' => array('class' => 'span12'),
            ))
            ->end();
    }
}

我有这个错误: Call to undefined method AppBundle\Entity\Faq\Question::getPosition()

1 个答案:

答案 0 :(得分:1)

1。 您必须为数据库字段位置命名

2。 在您的实体use Gedmo\Mapping\Annotation as Gedmo;

3

/*
 * @Gedmo\SortablePosition
 * @ORM\Column(name="position", type="integer", nullable=false)
 */
private $position;

4。 为它创建setter和getter

5。 使用作曲家StofDoctrineExtensionsBundlePixSOrtableBehaviorBundle

进行安装和配置

6。 并在AppKernel中使用它们

$bundles = array(
    ...
    new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),
    new Pix\SortableBehaviorBundle\PixSortableBehaviorBundle(),
);

7。 在services.yaml中启用gedmo侦听器

gedmo.listener.sortable:
    class: Gedmo\Sortable\SortableListener
    tags:
      - { name: doctrine.event_subscriber, connection: default }
    calls:
      - [ setAnnotationReader, [ "@annotation_reader" ] ]

(坚持正确的缩进,否则你的听众将无法工作)

8。 在您的管理服务中,连接新的可排序行为并激活呼叫

admin.something:
    class: AppBundle\Admin\SomethingAdmin
    tags:
      - { name: sonata.admin, manager_type: orm, label: Articles }
    arguments:
      - ~
      - AppBundle\Entity\Something
      - 'PixSortableBehaviorBundle:SortableAdmin'
    calls:
      - [setPositionService, ["@pix_sortable_behavior.position"]]

(按照正确的缩进,否则它将无效并会引发一些奇怪的错误)

9。 在config.yml中配置您的stof-doctrine-extenstions包:

    stof_doctrine_extensions:
        orm:
            default:
                sortable: true

(sortable在教程中默认缩进,显示错误)

享受:)