Php 如何使用Sonata实现动态过滤器(链接选择框)?

Php 如何使用Sonata实现动态过滤器(链接选择框)?,php,symfony,sonata-admin,Php,Symfony,Sonata Admin,我试图用索纳塔实现一些动态过滤器。我拉我的头发 事实上,我有三个对象(引擎>电机>传感器) 这段代码只是为了了解模型 在管理部分,我想通过发动机和电机过滤传感器。所以当我选择发动机时,我希望发动机的过滤器能自动更换 经过一些研究,我的研究让我找到了回调。但我从未使用过它,关于它的文档非常少。如果有人能帮我 以下是我在管理方面的代码: use Sonata\AdminBundle\Admin\Admin; use Sonata\AdminBundle\Datagrid\DatagridMapper

我试图用索纳塔实现一些动态过滤器。我拉我的头发

事实上,我有三个对象(引擎>电机>传感器)

这段代码只是为了了解模型

在管理部分,我想通过发动机和电机过滤传感器。所以当我选择发动机时,我希望发动机的过滤器能自动更换

经过一些研究,我的研究让我找到了回调。但我从未使用过它,关于它的文档非常少。如果有人能帮我

以下是我在管理方面的代码:

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;

class SensorAdmin extends Admin {

    /**
     * @param DatagridMapper $prmDatagridMapper
     */
    protected function configureDatagridFilters(DatagridMapper $prmDatagridMapper)
    {
        $prmDatagridMapper
            ->add("motor.engine", null, array("label" => "Engine"))
            ->add('motor', null, array(
                "callback" => array($this, "callbackMotorFilter")
            ))
        ;
    }

    public function callbackMotorFilter ($queryBuilder, $alias, $field, $value)
    {
        if (!$value) {
            return;
        }

        $queryBuilder->leftJoin(sprintf('%s.motor', $alias), 'm');
        $queryBuilder->leftJoin("m.engine", "e");
        $queryBuilder->andWhere('e.id = :engine_id');
        $queryBuilder->setParameter('engine_id', $value['value']);

        return true;
    }
}

提前谢谢。

我最好在这里使用任何类型的API。将大量实体发送到前端不是一个好主意。从数千个实体中进行选择可能会挂起浏览器

例如,您可以将任何类型的jQuery自动完成输入与简单的JSON API一起使用

我很久以前就实现了一个

表格类型

jQuery插件

小枝模板


不确定它是否与最新的3.0表单兼容,但修改应该很容易

我最好在这里使用任何类型的API。将大量实体发送到前端不是一个好主意。从数千个实体中进行选择可能会挂起浏览器

例如,您可以将任何类型的jQuery自动完成输入与简单的JSON API一起使用

我很久以前就实现了一个

表格类型

jQuery插件

小枝模板


不确定它是否与最新的3.0表单兼容,但修改应该很容易

所以,最后,问题可以通过新版本解决。多谢了,终于,新版本解决了这个问题。谢谢
use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;

class SensorAdmin extends Admin {

    /**
     * @param DatagridMapper $prmDatagridMapper
     */
    protected function configureDatagridFilters(DatagridMapper $prmDatagridMapper)
    {
        $prmDatagridMapper
            ->add("motor.engine", null, array("label" => "Engine"))
            ->add('motor', null, array(
                "callback" => array($this, "callbackMotorFilter")
            ))
        ;
    }

    public function callbackMotorFilter ($queryBuilder, $alias, $field, $value)
    {
        if (!$value) {
            return;
        }

        $queryBuilder->leftJoin(sprintf('%s.motor', $alias), 'm');
        $queryBuilder->leftJoin("m.engine", "e");
        $queryBuilder->andWhere('e.id = :engine_id');
        $queryBuilder->setParameter('engine_id', $value['value']);

        return true;
    }
}