在Sonata中,我创建了几个列表,并且一切正常。 (请注意那不久前,所以我可能已经做了一些修复了我将在这里描述的问题......)。
正如你在图片中看到的那样," 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;
}
}
答案 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');
}
它会起作用;)