Sonata Admin v2.3 - 使用sortable = false对多个列进行排序

时间:2014-12-04 22:22:42

标签: symfony doctrine-orm sql-order-by sonata-admin

我一直在版本ORDER BY的多个列上使用[this] [1]解决方案2.2.*它已经运行了近一年。

最近升级到版本2.3.*,列表不再对结果进行排序。

我注意到,如果我将至少一列设置为sortable,则事情会恢复正常。在我的情况下,我将所有列设置为'sortable' => false,但我仍然希望按特定顺序查看事物;我只是不希望用户选择排序顺序!

有什么方法可以让它再次运作?

2 个答案:

答案 0 :(得分:2)

这是由于新version中增加了以下内容;如果orderBy没有返回任何内容,则会移除ProxyQuery::getSortOrder()个选项。

在这种情况下,Datagrid::buildPager() IF会自动调用该方法,并且只有列表配置至少有一列设置为'sortable' => true,请参阅DataGrid.php#L126。如果所有列都不可排序,则会删除自定义ORDER BY选项!

在多列上ORDER BY的唯一方法是确保在某个时刻调用方法ProxyQuery::setSortOrder,请参阅ProxyQuery.php#140

我不确定这是否是一种意想不到的副作用,或者它是如何设计的。

要解决此问题,请将至少一列设置为'sortable' => true(或根本不设置排序)或修改管理类中的createQuery方法,如下所示:

public function createQuery($context = 'list')
{
    $proxyQuery = parent::createQuery($context);
    // Default Alias is "o"
    $proxyQuery->orderBy('o.name', 'ASC');
    // This can only be used for a single column. 
    $proxyQuery->setSortBy([], ['fieldName' => 'date']);
    $proxyQuery->setSortOrder('DESC');

    return $proxyQuery;
}

答案 1 :(得分:0)

在Sonata admin版本2.3中,这个简单的解决方案可以使用或不使用可排序列:

public function createQuery($context = 'list')
{
    $proxyQuery = parent::createQuery($context);

    $proxyQuery->orderBy('o.root', 'ASC');
    $proxyQuery->addOrderBy('o.lft', 'ASC');

    return $proxyQuery;
}