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

时间:2016-05-20 08:21:26

标签: php symfony sonata-admin

我试图用Sonata实现一些动态过滤器。我拉了头发。

事实上,我有三个对象(Engine> Motor> Sensor)。

class Engine {
    /**
     * @ORM\OneToMany(targetEntity=Motor, mappedBy=engine)
     */
    private $motors;
}

class Motor {
    /**
     * @ORM\OneToMany(targetEntity=Sensor, mappedBy=motor)
     */
    private $sensors;

    /**
     * @ORM\ManyToOne(targetEntity=Engine, inversedBy=motors)
     */
    private $engine;
}

class Sensor {
    /**
     * @ORM\ManyToOne(targetEntity=Motor, inversedBy=sensors)
     */
    private $motor;
}

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

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

经过一番研究,我的研究引导我进行回调。但我从未使用它,关于它的文档非常小。所以,如果有人可以帮助我。

以下是管理员方面的代码:

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;
    }
}

提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

我很久以前就实现了一个。

表格类型 https://github.com/scaytrase/form-extensions/blob/master/src/ScayTrase/Forms/ExtensionsBundle/Form/Type/EntityAutocompleteType.php

jQuery插件 https://github.com/scaytrase/form-extensions/blob/master/src/ScayTrase/Forms/ExtensionsBundle/Resources/public/js/jquery.entity_autocomplete.js

Twig模板 https://github.com/scaytrase/form-extensions/blob/master/src/ScayTrase/Forms/ExtensionsBundle/Resources/views/Form/entity_autocomplete.html.twig

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