在Symfony-Sonata中,除了一个字段外,所有字段都是可排序的

时间:2016-06-23 11:21:36

标签: php sonata-admin symfony-sonata

Sonata中,我创建了几个列表,并且一切正常。 (请注意那不久前,所以我可能已经做了一些修复了我将在这里描述的问题......)。

现在我创建了一个新的播放列表实体列表: enter image description here

正如你在图片中看到的那样," Id"专栏和" Aangemaakt op"列是可排序的,但"播放列表"列不是。

" Aangemaakt op"和#34;播放列表"字段是日期字段,但是因为" Aangemaakt op"字段是可排序的我会说它与它无关。

我一直在搜索Sonata文档,Google和StackOverflow,但是没有找到关于这个问题的任何线索。我找到了基于实体字段排序列表的线程,但我的字段不是实体。

相关代码:

/**
 * @param ListMapper $listMapper
 */
protected function configureListFields(ListMapper $listMapper) {
    $listMapper
        ->add('id')
        ->add('playlist_date', 'date', array('label' => 'Playlist'))
        ->add('created', 'datetime', array('label' => 'Aangemaakt op'))
        ->add(
            '_action', 'actions', array(
                'actions' => array(
                    'delete' => array(),
                )
            )
        );
}

一些StackOverflow线程和下面的答案提到将'sortable' => true添加到必须可排序的字段中。

这样做确实可以使列可点击进行排序,但是单击它会导致以下异常:

Catchable Fatal Error: Argument 1 passed to
Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery::entityJoin() 
must be of the type array, null given, called in
/path/of/my/project/sonata-project/doctrine-orm-admin-bundle/Datagrid/ProxyQuery.php
on line 142 and defined.

根据其他StackOverflow线程,因为必须创建连接。但是,该字段只是与其他字段相同的Mysql记录的字段。我确实发现了一个StackOverflow线程也提到了这个,并且为了使这个工作,他们加入了相同的记录,但我没有得到它的工作。此外,我感谢不应该是订购列内容的方式。

有没有人有线索?

对Hibatallah Aouadni回答的更新

正如Hibatallah所说,我在播放列表中添加了以下内容:

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper
        ->add('id')
        ->add('playlist_date')
        ->add('created');
}

这导致以下错误消息:

Notice: Undefined index: playlist_date

所以我检查了我的实体,发现它有一个UniqueConstraint:

uniqueConstraints={@ORM\UniqueConstraint(name="playlist_date", columns={"playlist_date"})}

它没有实际的"索引"定义,但当然是。然而,作为测试,我添加了以下内容:

, indexes={@ORM\Index(name="playlist_date", columns={"playlist_date"})}

这并没有给出任何不同的结果。 所以仍然没有运气:(

**实体和实体管理员**

实体管理员:

<?php

namespace Company\AdminBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\AdminBundle\Route\RouteCollection;

class PlaylistsAdmin extends Admin
{
    protected $baseRoutePattern = 'playlists';
    protected $baseRouteName = 'playlists';

    protected function configureRoutes(RouteCollection $collection) {
        $collection->clearExcept(array('list', 'delete', 'show'));
    }

    /**
     * @param ListMapper $listMapper
     */
    protected function configureListFields(ListMapper $listMapper) {
        $listMapper
            ->add('id')
            ->add('playlist_date', 'date', array('label' => 'Playlist'))
            ->add('created', 'datetime', array('label' => 'Aangemaakt op'))
            ->add(
                '_action', 'actions', array(
                'actions' => array(
                    'show' => array(),
                    /*'edit' => array(),*/
                    'delete' => array(),
                )
            )
            );
    }

    public function getBatchActions() {
        return array();
    }
}

实体:

<?php

namespace Company\AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Playlist
 *
 * @ORM\Table(name="playlist", uniqueConstraints={@ORM\UniqueConstraint(name="playlist_date", columns={"playlist_date"})})
 * @ORM\Entity()
 */
class Playlist
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", options={"unsigned"=true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="playlist_date", type="date", nullable=true)
     */
    protected $playlistDate;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="created", type="datetime", nullable=true)
     */
    protected $created;

    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    protected $video;

    /**
     * Constructor
     */
    public function __construct() {
        $this->video = new \Doctrine\Common\Collections\ArrayCollection();
        $this->setCreated(new \DateTime());
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Set playlistDate
     *
     * @param \DateTime $playlistDate
     * @return Playlist
     */
    public function setPlaylistDate($playlistDate) {
        $this->playlistDate = $playlistDate;

        return $this;
    }

    /**
     * Get playlistDate
     *
     * @return \DateTime
     */
    public function getPlaylistDate() {
        return $this->playlistDate;
    }

    /**
     * Set created
     *
     * @param \DateTime $created
     * @return Playlist
     */
    public function setCreated($created) {
        $this->created = $created;

        return $this;
    }

    /**
     * Get created
     *
     * @return \DateTime
     */
    public function getCreated() {
        return $this->created;
    }

    /**
     * Add video
     *
     * @param \Company\AppBundle\Entity\Video $video
     * @return Playlist
     */
    public function addVideo(\Company\AppBundle\Entity\Video $video) {
        $this->video[] = $video;

        return $this;
    }

    /**
     * Remove video
     *
     * @param \Company\AppBundle\Entity\Video $video
     */
    public function removeVideo(\Company\AppBundle\Entity\Video $video) {
        $this->video->removeElement($video);
    }

    /**
     * Get video
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getVideo() {
        return $this->video;
    }
}

3 个答案:

答案 0 :(得分:2)

最后我发现它,这很荒谬,在configureListFields方法中,你必须调用名称而不是DataBase名称的属性,所以:

变化

->add('playlist_date', 'date', array('label' => 'Playlist'))

->add('playlistDate', 'date', array('label' => 'Playlist'))

:D我无法相信我们花了这么多时间来处理一些荒谬的错误;)

答案 1 :(得分:0)

您需要做的就是将可排序的参数添加到数组中,并将true添加为值:

->add('playlist_date', 'date', array(
   'label' => 'Playlist',
   'sortable' => true
))

答案 2 :(得分:0)

尝试在实体admin中的configureDatagridFilters中添加播放列表字段:

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper
        ->add('id')
        ->add('playlist_date')
        ->add('created');
}

它会起作用;)