【发布时间】:2016-05-20 08:21:25
【问题描述】:
我正在尝试使用 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;
}
}
提前谢谢你。
【问题讨论】:
标签: php symfony sonata-admin