首页 > 解决方案 > Sonata 管理包,如果用户不选择任何过滤器,如何不显示任何结果并且不对 DB 执行任何查询?

问题描述

我有典型的奏鸣曲管理员列表操作createQuery, configureFormFields, etc。我如何呈现标准页面,但如果用户不选择任何过滤器,我只向他展示“选择任何过滤器以获取结果”?

我可以使用hasFilters检查但查询仍然执行。

{% if  admin.hasFilters() %}
    {{ parent() }}
{% else %}

我需要一些类似的东西,但不对数据库执行任何查询。

// SomeController
public function listAction()
{
    if (!$this->admin->hasFilters()) {
        return $this->renderWithExtraParams($this->admin->getTemplate('list'), [
            'action' => 'list',
            'form' => $this->admin->getDatagrid()->getForm()->createView(),
            'csrf_token' => $this->getCsrfToken('sonata.batch'),
            'export_formats' => $this->has('sonata.admin.admin_exporter') ?
                $this->get('sonata.admin.admin_exporter')->getAvailableFormats($this->admin) :
                $this->admin->getExportFormats(),
        ], null);
    }

    return parent::listAction();
}

标签: phpsymfonysonata-admin

解决方案


这是kludge,但它正在工作。只需添加以下内容:

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

    if (!$this->hasFilters()) {
        $query->where('1 = 0');

        return $query;
    }

    // ...
}

推荐阅读