Bonjour à tous, j'ose espérer que vous vous portez bien. Dans le code si dessous je souhaite récupérer l'id de la collection dans laquelle l'utilisateur ajoutra un produit, le formulaire d'ajout de produit se faisant en ajax et sans redirection, je ne peux donc pas passer cette id dans l'url et le récuperer en utilisant la méthode get. Je n'est donc que la méthode post comme option mais j'ai tout éssayé et ca ne fonctionne pas j'aimerai savoir si quelqu'un aurai une idée.

La fonction d'ajout de produit

#[Route('/', name: 'app_products_new', methods: ['GET', 'POST'])]
    public function new(
        Request $request, 
        ProductsRepository $productsRepository): Response
    {
        $product = new Products();
        $form = $this->createForm(ProductsType::class, $product);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            // $id= $request->query->get('id');
            $id =9;
            $collection = $this->defineCollection($id);
            $product->setCollections($collection);

            $this->persisteFile->persisteImage($form, $product, $this->fileUploader);
            $productsRepository->save($product, true);
            $this->addFlash('success', 'Nouveau produit ajouté à la collection'.' '.$collection->getName().'.');

        }else{ $this->addFlash('invalid_form','Formulaire invalide.');}

        return $this->redirectToRoute('Shop', [], Response::HTTP_SEE_OTHER);
    }

La fonction qui permet de récupérer la collection dans la base de données grace à l'id récupéré

public function defineCollection(int $id)
    {
        $repository = $this->entityManager->getRepository(Collections::class);
        $entity = $repository->find($id);
        if (!$entity) {
            throw $this->createNotFoundException('Entité non trouvée');
        }
        return $entity;

    }

Le formulaire d'ajout de produit avec l'attribut action qui mene vers méthode new() que j'ai donnée plus haut

{{ form_start(addProductForm, {'action': path('app_products_new')}) }} 
            <div class="imageArticle">
                <label for="" id="labelText">Image: Format(JPEG, PNG, ou GIF)</label>
                {{form_row(addProductForm.image)}}
            </div>
            <div class="collectionField">
                {{form_row(addProductForm.name)}}
                {{form_row(addProductForm.price)}}
                {{form_row(addProductForm.categories)}}
                {{form_row(addProductForm.stock)}}
                {{form_row(addProductForm.description)}}
                <div class="coll-toggle-row">
                {{form_label(addProductForm.isActive)}}
                {{form_widget(addProductForm.isActive)}}
                </div>
            </div>
            <div>
                <button type="button" id="addArticleAnnuler" class="close-modal">Annuler</button>
                <button>{{ button_label|default('Sauvegarder') }}</button>
            </div>
        {{ form_end(addProductForm) }}

13 réponses


Hello,

Comment ça ajax ne permet pas de passer l'id ? Est-ce que tu sais ce que permet Ajax ? Cela permet de call une url comme le ferait ton navigateur mais avec du JS donc tu peux très bien faire des appel avec des urls comme : /products/123 ou /products?id=123 (même si la première est mieux) en GET comme en POST

ce que j'essai de dire en faite c'est que lors de la soumition du formulaire l'utilisateur n'est pas dirigé vers une nouvelle url à travers laquelle je pourai passer un Id de cette facon /products/123 mais il est dirigé vers la page courante. de plus la page courante et la page qui gere la soumition du formulaire ont deux controller distincts

Faudrait plus de détails sur les urls et ce que tu utilise. Mais je ne vois pas la difficulté car tu as bien à un moment donnée l'id.

Salut, si tu veux récupérer l'id, tu peux le faire depuis la request.
Pour récupérer l'id. Il faut tout simplement que tu persists puis flush ton entité avant de faire la redirection. J'espère que ça pourra t'aider.

Salut l'id en lui ne me servira juste a déterminer la collection dans laquelle l utilisateur envera son produit il ne n'est pas envoyé en base de donne

 if ($form->isSubmitted() && $form->isValid()) {
            // $id= $request->query->get('id');
            $id =9;
            $collection = $this->defineCollection($id);
            $product->setCollections($collection);

            $this->persisteFile->persisteImage($form, $product, $this->fileUploader);
            $productsRepository->save($product, true);
            $this->addFlash('success', 'Nouveau produit ajouté à la collection'.' '.$collection->getName().'.');

j'utilise une methode defineCollection qui recupere la collection dans la base de donne en fonction de l'id qui sera recuperer via le formulaire. j'ai essaye de faire $request->request->get('id') en passant l'id dans l url mais a chaque fois ca me renvois null. donc j'aimerai savoir si quelqu'un aurai une idee de comment puis procede pour pouvoir recuperer cet id

Dans un premier temps, pour la redirection, il faudra ajouter l'id en paramètre.
return $this->redirectToRoute('Shop', ['id' => $`collection->getId()]);

et dans ton controller tu as ta méthode avec comme nom de route "Shop" et tu lui as défini l'id.
Exemple : #[Route('/collection/{id}', name: 'Shop')]

Sinon dans t'as request, tu n'a pas mis la propriété "collection" dans ton formulaire.
Tu l'ajoutes manuellement dans ton controller, tu coup du ne l'aura pas dans t'as request.
Vu que tu l'as récupérer. Fait tout simplement $collection->getId()
Et tu n'as pas besoin de faire $product->setCollections($collection); vu que tu ne l'enregistres pas dans la base de donnée

Salut merci beaucoup Jessy brs. Je vais tester ca

Avec plaisir, j'espère que tu as réussi à te débloquer

tu as la possibilite de recuperer l'id grace à $form->getData('id') avant de faire le persiste
je ne sais pas si c'est ta question

Non ce n'est pas sa question et il n'y a pas d'id dans son formulaire. je doute que ça fonctionne. l'id sera créér au moment du flush.
je pense qu'il à résolu son problème

oui Jessy Brs mais j'ai finalement opter pour une autre approche je ne sais si c'est la meilleur mais j'ai opté pour un champ input caché qui habritera dans un attribut data- la valeur de l'id de la collection qui serra selectioné, cette valeur changera bien sur en fonction de la collection selectioné par l'utilisateur du coup lors de la soumision du formulaire je recevrai un id unique a chaque fois ,ce qui me permettra en suite de définir de mon coter exactement de quelle collection il s'agit avant de passer au flush

exatement SiProdAzz t'as tout compris.

C'est moi SiProdZz ^^
Oui top, t'as solution est très bien également selon moi ! Bravo :D