<?php
namespace App\Form\Type;
use App\Entity\MaterielMouvement;
use App\Entity\Stock;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;
class MaterielMouvementFormType extends AbstractType
{
private $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$materielMouvement = $builder->getData(); // instance de MaterielMouvement (si édition)
$selectedIds = [];
if ($materielMouvement && $materielMouvement->getIdentifiants()) {
$selectedIds = $materielMouvement->getIdentifiants(); // ex: array d’IDs
}
$builder
->add('stock', EntityType::class, [
'class' => Stock::class,
'choice_label' => function ($s) {
return $s->getModele()->getIntitule();
},
'choice_attr' => function (Stock $stock) {
return [
'data-individuel' => $stock->getProduit()->getCategorie()->isIndividuel() ? 1 : 0
];
},
'placeholder' => 'Choisir',
'attr' => [
'class' => 'stock_select chosen-select',
],
'query_builder' => function (EntityRepository $er) {
$sub = $er->createQueryBuilder('s2')
->select('MIN(s2.id)')
->innerJoin('s2.modele', 'm')
->where('m.nonDefini = false')
// ->andWhere('s2.statut = :statut')
->groupBy('s2.modele');
return $er->createQueryBuilder('s')
->where('s.id IN (' . $sub->getDQL() . ')')
//->setParameter('statut', 'disponible')
->orderBy('s.modele');
},
])
->add('identifiants', ChoiceType::class, [
'choices' => [], // rempli via Ajax
'multiple' => true,
'attr' => [
'class' => 'identifiant_select chosen-select',
'data-placeholder' => 'Choisir des identifiants',
],
])
->add('qte', IntegerType::class, [
'constraints' => [new NotBlank()],
'attr' => [
'min' => 0,
],
])
->add('qteDisponible', IntegerType::class, [
'disabled' => true,
'mapped' => false
]);
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
$ids = [];
if (!empty($data['identifiants'])) {
foreach ($data['identifiants'] as $id) {
$stocks = $this->em->getRepository(Stock::class)->findBy(['identifiant' => $id]);
foreach ($stocks as $stock) {
$ids[$stock->getIdentifiant()] = $stock->getIdentifiant();
}
}
}
$form->add('identifiants', ChoiceType::class, [
'choices' => $ids, // rempli via Ajax
'multiple' => true,
'attr' => [
'class' => 'identifiant_select chosen-select',
'data-placeholder' => 'Choisir des identifiants',
],
]);
}
);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => MaterielMouvement::class,
]);
}
}