我试图用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;
}
}
提前谢谢。
答案 0 :(得分:0)
我最好在这里使用任何类型的API。将大量实体发送到前端并不是一个好主意。从数千个实体中进行选择可能会使浏览器挂起。
例如,您可以使用任何类型的jQuery自动完成输入和简单的JSON API。
我很久以前就实现了一个。
不确定它是否与最新3.0表单兼容,但修改应该很容易