Commit 0d7ec6cf authored by Johnny Leveneur's avatar Johnny Leveneur
Browse files

commit intermédiare

parent 5693ceb1
Loading
Loading
Loading
Loading
+76 −49
Original line number Diff line number Diff line
@@ -98,57 +98,24 @@ class InscriptionController extends AbstractActionController
     */
    public function modifierAction(): ViewModel
    {

        $inscription = $this->getInscriptionService()->getRequestedEntity($this);
        $inscPlaces = $inscription->getPlaces();
        foreach($inscPlaces as $insPlace){
            /** @var InscriptionPlace $insPlace */
            $nom = $insPlace->getNom();
            $prenom = $insPlace->getPrenom();
        }

        $form = $this->getInscriptionParticipantForm();
        $form->setAttribute("action", $this->url()->fromRoute("evenementiel/inscription/modifier", ["entity" => $inscription->getId()]));
        $form->setAttribute("method", "post");
        // 1) Liaison objet
        $form->bind($inscription);

        // 2) Injecter les valeurs pour l’affichage (extraction depuis l’hydrator parent)
        $extracted = $form->getHydrator()->extract($inscription);
    //    $form->get('places')->populateValues($extracted['places'] ?? []);
     //   $form->setData($form->getHydrator()->extract($inscription)); // pousse partout en array

        $form->setBindOnValidate(false); // facultatif, mais évite la liaison “tardive”

        // Helper pour retrouver la Collection "places" où qu’elle soit (racine ou base fieldset)
        $getPlacesCollection = static function ($form) {
            if ($form->has('places')) return $form->get('places');
            if (method_exists($form, 'getBaseFieldset') && $form->getBaseFieldset() && $form->getBaseFieldset()->has('places')) {
                return $form->getBaseFieldset()->get('places');
            }
            return null;
        };
        // 2) Extraction parent
//        $extracted = $form->getHydrator()->extract($inscription);

        if ($this->getRequest()->isPost()) {
            $postData =$this->getRequest()->getPost()->toArray();
            $form->setData($postData);
            if ($form->isValid()) {
                $this->getInscriptionService()->update($inscription);
        // 3) Pousser UNIQUEMENT la collection (évite les autres fieldsets qui attendent des objets)
//        $form->get('places')->populateValues($extracted['places'] ?? []);

                $this->flashMessenger()->addSuccessMessage("Inscription mise à jour.");
                exit();
            }
        }else {
            $placesColl = $getPlacesCollection($form);

            // Nombre souhaité = nb demandé ou nb réel existant
            $nbSouhaite = (int) ($inscription->getNombrePlacesDemandees() ?? 0);
            $nbReel     = (int) ($inscription->getPlaces()->count() ?? 0);

            // Si aucune place existante (création visuelle), on pré-génère nbSouhaite lignes
            if ($placesColl && $nbReel === 0 && $nbSouhaite > 0) {
                $placesColl->setCount($nbSouhaite);
                // versions de laminas/form anciennes : il faut peupler pour matérialiser les children
                if (count($placesColl->getElements()) === 0 && count($placesColl->getFieldsets()) === 0) {
                    $placesColl->populateValues(array_fill(0, $nbSouhaite, []));
                }
            }
        }
        // 4) Prépare (noms/indices)
        $form->prepare();

        $vm = new ViewModel();
@@ -160,6 +127,67 @@ class InscriptionController extends AbstractActionController
        return $vm;
    }

//    public function modifierAction(): ViewModel
//    {
//        $inscription = $this->getInscriptionService()->getRequestedEntity($this);
//        $inscPlaces = $inscription->getPlaces();
//        foreach ($inscPlaces as $insPlace) {
//            /** @var InscriptionPlace $insPlace */
//            $nom = $insPlace->getNom();
//            $prenom = $insPlace->getPrenom();
//        }
//        $form = $this->getInscriptionParticipantForm();
//        $form->setAttribute("action", $this->url()->fromRoute("evenementiel/inscription/modifier", ["entity" => $inscription->getId()]));
//        $form->setAttribute("method", "post");
//        $form->bind($inscription);
//        $form->setBindOnValidate(false); // facultatif, mais évite la liaison “tardive”
//        $form->prepare();
//
//
//        // Helper pour retrouver la Collection "places" où qu’elle soit (racine ou base fieldset)
//        $getPlacesCollection = static function ($form) {
//            if ($form->has('places')) return $form->get('places');
//            if (method_exists($form, 'getBaseFieldset') && $form->getBaseFieldset() && $form->getBaseFieldset()->has('places')) {
//                return $form->getBaseFieldset()->get('places');
//            }
//            return null;
//        };
//
//        if ($this->getRequest()->isPost()) {
//            $postData = $this->getRequest()->getPost()->toArray();
//            $form->setData($postData);
//            if ($form->isValid()) {
//                $this->getInscriptionService()->update($inscription);
//
//                $this->flashMessenger()->addSuccessMessage("Inscription mise à jour.");
//                exit();
//            }
//        } else {
//            $placesColl = $getPlacesCollection($form);
//
//            // Nombre souhaité = nb demandé ou nb réel existant
//            $nbSouhaite = (int)($inscription->getNombrePlacesDemandees() ?? 0);
//            $nbReel = (int)($inscription->getPlaces()->count() ?? 0);
//
//            // Si aucune place existante (création visuelle), on pré-génère nbSouhaite lignes
//            if ($placesColl && $nbReel === 0 && $nbSouhaite > 0) {
//                $placesColl->setCount($nbSouhaite);
//                // versions de laminas/form anciennes : il faut peupler pour matérialiser les children
//                if (count($placesColl->getElements()) === 0 && count($placesColl->getFieldsets()) === 0) {
//                    $placesColl->populateValues(array_fill(0, $nbSouhaite, []));
//                }
//            }
//        }
//
//        $vm = new ViewModel();
//        $vm->setTemplate("evenementiel/inscription/modifier");
//        $vm->setVariables([
//            "title" => "Modifier une inscription",
//            "form" => $form,
//        ]);
//        return $vm;
//    }

    /**
     * Historiser une entité
     *
@@ -274,9 +302,7 @@ class InscriptionController extends AbstractActionController
            $this->getInscriptionService()->update($inscription);
            $this->getNotificationService()->triggerValidation($inscription);
            $this->flashMessenger()->addSuccessMessage("<strong>" . $inscription->getParticipantDenomination() . "</strong> vient d'être ajouté&middot;e en liste principale.");
        }
        else
        {
        } else {
            $this->flashMessenger()->addSuccessMessage("<strong>" . $inscription->getParticipantDenomination() . "</strong> ne peut être ajouté&middot;e en liste principale car il n'y a pas assez de places disponibles");
        }

@@ -329,6 +355,7 @@ class InscriptionController extends AbstractActionController
        /** @see EvenementController::afficherAction() */
        return $this->redirect()->toRoute('evenementiel/evenement/afficher', ['entity' => $evenement->getId()], ['fragment' => 'inscriptions'], true);
    }

    public function desinscriptionAction(): ViewModel
    {
        $inscription = $this->getInscriptionService()->getRequestedEntity($this);
+5 −0
Original line number Diff line number Diff line
@@ -20,6 +20,11 @@ class InscriptionPlace // implements HistoriqueAwareInterface
        return $this->id;
    }

    public function setId(?int $id): void
    {
        $this->id = $id;
    }

    public function getInscription(): ?Inscription { return $this->inscription; }
    public function setInscription(?Inscription $i): self { $this->inscription = $i; return $this; }

+41 −29
Original line number Diff line number Diff line
@@ -3,6 +3,9 @@ namespace Evenementiel\Form\Fieldset;

use Evenementiel\Entity\Db\InscriptionPlace;
use Laminas\Filter\ToNull;
use Laminas\Form\Element\Hidden;
use Laminas\Form\Element\Select;
use Laminas\Form\Element\Text;
use Laminas\Form\Fieldset;
use Laminas\Hydrator\ClassMethodsHydrator;
use Laminas\Hydrator\Filter\FilterComposite;
@@ -11,30 +14,49 @@ use Laminas\InputFilter\InputFilterProviderInterface;

class InscriptionPlaceFieldset extends Fieldset implements InputFilterProviderInterface
{
    // TODO à vérifier si c'est necessaire
    public function setBoundObject(InscriptionPlace $object): static
    public function __construct()
    {
        $this->setObject($object);
        $this->setAllowedObjectBindingClass(InscriptionPlace::class);
        return $this;
        parent::__construct('place'); // nom logique du fieldset
        // NE PAS mettre ici setObject(new InscriptionPlace()) ni setHydrator(...)
        // → fais-le via la factory pour éviter tout setObject(array) accidentel.
    }

    public function init()
    {
        $this->setName('place');
        // fait dans le factory
        //$this->setObject(new InscriptionPlace());

        $this->setObject(new InscriptionPlace());
        // Id (hidden)
        $this->add([
            'name' => 'id',
            'type' => Hidden::class,
        ]);

        $this->add(['name' => 'id', 'type' => 'hidden']);
        // l’inscription est fixée dans le contrôleur, pas dans le form:
        $this->add(['name' => 'nom', 'type' => 'text', 'options' => ['label' => 'Nom']]);
        $this->add(['name' => 'prenom', 'type' => 'text', 'options' => ['label' => 'Prénom']]);
//        $this->add(['name' => 'nom', 'type' => 'text', 'options' => ['label' => '']]);
//        $this->add(['name' => 'prenom', 'type' => 'text', 'options' => ['label' => '']]);
        // Nom
        $this->add([
            'name'    => 'nom',
            'type'    => Text::class,
            'options' => [
                'label' => 'Nom',
            ],
            'attributes' => [
                'required' => true,
            ],
        ]);

        // Prénom (nullable)
        $this->add([
            'name'    => 'prenom',
            'type'    => Text::class,
            'options' => [
                'label' => 'Prénom',
            ],
        ]);

        // Statut
        $this->add([
            'name'    => 'statut',
            'type' => 'select',
            'type'    => Select::class,
            'options' => [
                'label' => 'Statut',
                'value_options' => [
@@ -43,9 +65,6 @@ class InscriptionPlaceFieldset extends Fieldset implements InputFilterProviderIn
                    'annule'     => 'Annulé',
                ],
            ],
            'attributes' => [
                'id' => 'places',
            ]
        ]);

        // 🔧 Hydrator compatible getters/setters (évite ArraySerializable)
@@ -57,26 +76,19 @@ class InscriptionPlaceFieldset extends Fieldset implements InputFilterProviderIn
    public function getInputFilterSpecification(): array
    {
        return [
            // id peut être vide -> on convertit '' en null (au cas où)
            'id' => [
                'required' => false,
                'filters' => [[
                    'name' => ToNull::class,
                    'options' => ['type' => ToNull::TYPE_STRING],
                ]],
            ],
            'nom' => [
                'required' => true,
                'filters'  => [['name' => 'StringTrim']],
                'validators' => [
                    ['name' => 'StringLength', 'options' => ['min' => 1, 'max' => 255]],
                'filters'  => [
                    ['name' => 'StringTrim'],
                ],
            ],
            'prenom' => [
                'required' => false,
                'filters'  => [['name' => 'StringTrim']],
                'validators' => [
                    ['name' => 'StringLength', 'options' => ['max' => 255]],
                'filters'  => [
                    ['name' => 'StringTrim'],
                ],
            ],
            'statut' => [
+1 −1
Original line number Diff line number Diff line
@@ -24,8 +24,8 @@ class InscriptionPlaceFieldsetFactory
        $hydrator = $container->get('HydratorManager')->get(InscriptionPlaceHydrator::class);

        $fieldset = new InscriptionPlaceFieldset();
        $fieldset->setBoundObject(new InscriptionPlace());
        $fieldset->setHydrator($hydrator);
        $fieldset->setObject(new InscriptionPlace());

        return $fieldset ;
    }
+1 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@ class InscriptionPlaceHydrator implements HydratorInterface
    {
        /** @var InscriptionPlace $object */
        return [
            'id'     => $object->getId(),
            'nom'    => $object->getNom(),
            'prenom' => $object->getPrenom(),
            'statut' => $object->getStatut(),
Loading