在 Symfony-Sonata 中,所有字段都是可排序的,除了一个
In Symfony-Sonata all fields are sortable except for one
在 Sonata 中,我创建了几个列表,并且一切正常。 (请注意,那是不久前的事了,所以我可能在那里做了一些事情,解决了我将在此处描述的问题...)。
现在我已经创建了一个新的播放列表实体列表:
如图所示,"Id" 列和 "Aangemaakt op" 列都是可排序的,但 "Playlist" 列不是。
"Aangemaakt op" 和 "Playlist" 字段都是 日期字段 ,但由于 "Aangemaakt op" 字段是可排序的,我会说与它无关。
我一直在搜索 Sonata 文档、Google 和 Whosebug,但没有找到有关此问题的任何线索。我确实找到了关于根据实体字段对列表进行排序的帖子,但我的字段不是实体。
相关代码:
/**
* @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(),
)
)
);
}
一些 Whosebug 线程和下面的答案提到将 '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.
根据其他 Whosebug 线程,这是因为必须创建连接。但是,该字段只是与其他字段相同的 Mysql 记录的一个字段。我确实找到了一个 Whosebug 线程也提到了这一点,并且他们在其中加入了相同的记录以使其工作,但我没有让它工作。此外,我感谢这不应该是对列内容进行排序的方式。
有人知道吗?
更新以响应 Hibatallah Aouadni 的回答
按照 Hibatallah 的建议,我将以下内容添加到我的 PlaylistsAdmin 中:
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"})}
它没有实际的 "index" 定义,但当然是。但是作为测试,我添加了以下内容:
, 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;
}
}
您需要做的就是将参数 sortable 添加到 array 和 true 作为值:
->add('playlist_date', 'date', array(
'label' => 'Playlist',
'sortable' => true
))
尝试在实体管理员的 configureDatagridFilters 中添加播放列表字段:
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('id')
->add('playlist_date')
->add('created');
}
它会起作用 ;)
终于找到了,太荒谬了,在configureListFields方法中,你必须用它的名字而不是DataBase的名字来调用属性,所以:
改变
->add('playlist_date', 'date', array('label' => 'Playlist'))
至
->add('playlistDate', 'date', array('label' => 'Playlist'))
:D 真不敢相信我们花了这么多时间来犯一些荒谬的错误 ;)
在 Sonata 中,我创建了几个列表,并且一切正常。 (请注意,那是不久前的事了,所以我可能在那里做了一些事情,解决了我将在此处描述的问题...)。
现在我已经创建了一个新的播放列表实体列表:
如图所示,"Id" 列和 "Aangemaakt op" 列都是可排序的,但 "Playlist" 列不是。
"Aangemaakt op" 和 "Playlist" 字段都是 日期字段 ,但由于 "Aangemaakt op" 字段是可排序的,我会说与它无关。
我一直在搜索 Sonata 文档、Google 和 Whosebug,但没有找到有关此问题的任何线索。我确实找到了关于根据实体字段对列表进行排序的帖子,但我的字段不是实体。
相关代码:
/**
* @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(),
)
)
);
}
一些 Whosebug 线程和下面的答案提到将 '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.
根据其他 Whosebug 线程,这是因为必须创建连接。但是,该字段只是与其他字段相同的 Mysql 记录的一个字段。我确实找到了一个 Whosebug 线程也提到了这一点,并且他们在其中加入了相同的记录以使其工作,但我没有让它工作。此外,我感谢这不应该是对列内容进行排序的方式。
有人知道吗?
更新以响应 Hibatallah Aouadni 的回答
按照 Hibatallah 的建议,我将以下内容添加到我的 PlaylistsAdmin 中:
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"})}
它没有实际的 "index" 定义,但当然是。但是作为测试,我添加了以下内容:
, 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;
}
}
您需要做的就是将参数 sortable 添加到 array 和 true 作为值:
->add('playlist_date', 'date', array(
'label' => 'Playlist',
'sortable' => true
))
尝试在实体管理员的 configureDatagridFilters 中添加播放列表字段:
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$datagridMapper
->add('id')
->add('playlist_date')
->add('created');
}
它会起作用 ;)
终于找到了,太荒谬了,在configureListFields方法中,你必须用它的名字而不是DataBase的名字来调用属性,所以:
改变
->add('playlist_date', 'date', array('label' => 'Playlist'))
至
->add('playlistDate', 'date', array('label' => 'Playlist'))
:D 真不敢相信我们花了这么多时间来犯一些荒谬的错误 ;)