私は、フィールド(Paciente)をフォームに動的にロードするためにeventSubscriberを使用しています.pacienteのID、pacienteのIDに加えて取得する必要があるpreSubmit関数でフォームに挿入します。 idは私が直接得ることができますが、dniはエンティティを持ってくる必要があり、私はここからどのようにできるのか分かりません。次のようにeventSubscriberからエンティティを取得
問題の私のイベントは次のとおりです。LifecycleEventArgsとMETHOD preSubmit OF
class AddHistoriaClinicaFieldSubscriber implements EventSubscriberInterface
{
private $propertyPathToHistoriaClinica;
public function __construct($propertyPathToHistoriaClinica)
{
$this->propertyPathToHistoriaClinica = $propertyPathToHistoriaClinica;
}
public static function getSubscribedEvents()
{
return array(
FormEvents::POST_SET_DATA => 'preSetData',
FormEvents::PRE_SUBMIT => 'preSubmit'
);
}
private function addHistoriaClinicaForm($form, $paciente_id)
{
$formOptions = array(
'class' => 'BiobancoBundle:HistoriaClinica',
'empty_value' => '-- SELECCIONAR HISTORIA CLINICA --',
'label' => 'Historia Clínica',
'attr' => array(
'class' => 'historia_clinica_selector',
),
'query_builder' => function (EntityRepository $repository) use ($paciente_id) {
$qb = $repository->createQueryBuilder('h')
->innerJoin('h.paciente', 'p')
->where('p.id = :p')
->setParameter('p', $paciente_id)
;
return $qb;
},
);
$form->add($this->propertyPathToHistoriaClinica, 'entity', $formOptions);
}
public function preSetData(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
$accessor = PropertyAccess::createPropertyAccessor();
$h = $accessor->getValue($data, $this->propertyPathToHistoriaClinica);
$paciente_id = ($h) ? $h->getPaciente()->getNumeroIdentificacion() : null;
$this->addHistoriaClinicaForm($form, $paciente_id);
}
public function preSubmit(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
$paciente_id = array_key_exists('paciente', $data) ? $data['paciente'] : null;
//HERE IS WHERE I NEED TO OBTAIN THE DNI, TO PASS IT TO THE FORM
//dump($data);die();
$this->addHistoriaClinicaForm($form, $paciente_id);
}
}
は、EDIT 1:メソッドの行の宣言で
use Doctrine\ORM\Event\LifecycleEventArgs;
...
public function preSubmit(FormEvent $event, LifecycleEventArgs $args)
{
$data = $event->getData();
$form = $event->getForm();
$paciente_id = array_key_exists('paciente', $data) ? $data['paciente'] : null;
dump($args->getEntityManager()->getRepository("BiobancoBundle:Paciente")->find($paciente_id));die();
$this->addHistoriaClinicaForm($form, $paciente_id);
}
ERROR:
Catchable Fatal Error: Argument 2 passed to BiobancoBundle\Form\EventListener\AddHistoriaClinicaFieldSubscriber::preSubmit() must be an instance of Doctrine\ORM\Event\LifecycleEventArgs, string given.
よあなたは 'paciente'を取得するためにQueryBuilderを使用していますが、その結果はあなたにプロパティを与えませんか? – Dymen1
こんにちは@ Dymen1、クエリビルダでは、すべてのhistoryia_clinicaを取得します。ここで、p.dni = dniのpacienteです。以前はどのようにdniを得ることができますか? –
ファクトリを作成し、依存関係注入を処理する方法を知っていますか?もしそうなら、あなたは 'paciente'リポジトリを注入する必要があります。その後、リポジトリを介してエンティティを見つけることができます。 (そうでない場合は、私は答えとして例を作成するかもしれませんが、あなたはすでにこれを行う方法を知っていれば少し些細です) – Dymen1