Ich versuche, einige dynamische Filter mit Sonata zu implementieren. Und ich ziehe meine Haare.Wie implementiere ich dynamische Filter (verknüpfte Auswahlbox) mit Sonata?
Tatsächlich habe ich drei Objekte (Motor> 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;
}
Dieser Code soll nur eine Vorstellung vom Modell haben.
Im Admin-Teil möchte ich Sensor nach Motor und Motor filtern. Wenn ich den Motor auswähle, möchte ich, dass der Filter des Motors automatisch wechselt.
Nach etwas Forschung führt mich meine Forschung zu den Rückrufen. Aber ich habe es nie benutzt und die Dokumentation darüber ist sehr klein. Also wenn mir jemand helfen könnte.
Hier ist mein Code für die Seite Admin:
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;
}
}
Vielen Dank im Voraus.
so einfach sein, schließlich, Problem wird durch neue Version behoben. Danke vielmals – Mausly