私はSonataでいくつかの動的フィルタを実装しようとしています。そして、私は髪を引っ張ります。ソナタで動的フィルタ(リンクされた選択ボックス)を実装する方法は?
実際、私には3つのオブジェクト(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;
}
}
は、事前にありがとうございます。
簡単にする必要があります問題は新しいバージョンで解決されます。どうもありがとう – Mausly