Laravel France

Boucle lectures données

Avatar de sergentMicklin
sergentMicklin

Bonjour à tous,

Alors, grâce à bestmomo et KYoann, je puis à présent faire ma table pivot, et afficher mes commandes : https://laravel.fr/t/projets-laravel-france/projet-gestion-clients-commandes-produits

Maintenant, je souhaiterais afficher mes commandes, et les produits associés, mais pour les modifier.

J'affiche le No de commande, et chaque produit, un par ligne, pas de souci, tout ok.

Ex :

Commande 10

produit a quantite 12 produit b quantite 3 produit z quantite 0

Pour modifier la commande, j'affiche un form ayant les quantités dans un input text, dont le name est produit_id, ou id est bien sûr l'id du produit :

<input type="text" name="quantite_1" value="9" /> <input type="text" name="quantite_4" value="0" /> <input type="text" name="quantite_17" value="45" />

J'ai donc affiché mon No de commande, mes quantités par produit et les id_produits correspondants.

Maintenant, comment récupérer les quantités entrées dans ces champs au niveau de mon controller pour faire l'update en bdd ? Ou si vous auriez une meilleure solution (ce dont je ne doute pas) ?

A noter que pour l'instant je ne souhaite pas utiliser d'Ajax, ni Vue.js... pour l'instant !

Merci à vous !

Posté il y a 2 mois
Avatar de KYoann
KYoann

Salut,

La quantité est enregistrer dans ta table pivot ?

Posté il y a 2 mois
Avatar de sergentMicklin
sergentMicklin

Salut KYoann,

Pas directement, j'ai :

3 colonnes : id_pivot, commande_id et produit_id dans la table pivot.

Ainsi, dans la commande 1, si j'ai deux produits 5, j'aurais

commande_id        1        produit        5
commande_id        1        produit        5

Certes, peut être pas le plus optimal... mais bon, je suis là pour apprendre :)
Au pire, je corrigerais ensuite cette partie ;)
Posté il y a 2 mois
Avatar de KYoann
KYoann

Effectivement vue comme cela c'est pas optimal

Ta table pivot devrait avoir les colonnes

commande_id | produit_id | quantité

Dans la définition de ta table de pivot de ton model commande, il faut déclarer les champs supplémentaires

return $this->belongsToMany('App\Produit')->withPivot('quantite');

Quand tu veux récupérer les valeurs supplémentaire de ta table pivot

@foreach($commande->produits)

    {{$produit->nom}}
    {{$produits->pivot->quantite}}

@endforeach

Je ne sais pas quelle type de boutique il s'agit, mais si tu dois gérer les expéditions, j'ajouterais bien une quantité expédié, et des created_at et updated_at afin de pouvoir récupérer au besoin ces informations.

Posté il y a 2 mois
Avatar de KYoann
KYoann

Pour revenir sur ta demande initiale, pour mettre à jour ta table pivot

Tu créer un form qui envoie l'id de commande, l'id du produit à quantifier, et la nouvelle quantité

Dans le controlleur cible du formulaire :

$commande = App\Commande::find($request->commande_id);

$commande->produits()->updateExistingPivot($request->produit_id, ['quantite' => $request->quantite]);
Posté il y a 2 mois
Avatar de sergentMicklin
sergentMicklin

Super-merci KYoann !

Je vais cogiter tes infos, et voir à mettre les quantités dans la table pivot. Les expés ne sont pas prévues, ceci étant rien ne m'empêche de réfléchir à leur implémentation. Alors, à partir d'un form simple d'ajout d'un seul produit, pas de souci, je récupère tout, et je fais un update ou un attach dans le controller. C'est ce que je faisais, pas de prob.

Maintenant, j'avais décidé de faire une page de modif de commande, laquelle liste tous les produits, et leurs quantités. Ainsi, on visualise les commande et on peut la modifier sur la même page.

Si quantité = 0 : ils ne sont pas dans la commande, sinon il y en a xx dans cette commande.

Bref, j'ai donc un formulaire avec à l'intérieur un champ d'inputs de produits (produit 1, produit 6, produit x...) et les quantités associées, tu vois ?

<form>

Produit 1 <input type="text" name="quantite_1" value="9" />
Produit 12<input type="text" name="quantite_12" value="5" /> <------ on peut modifier cette quantité, par exemple passer de 5 à 23...

</form>

Mon souci est donc de récupérer (dans le controller) quelle quantité pour quel produit, afin de faire mon update ou mon attach. Je me suis débrouillé pour que chaque nom d'input soit de la forme : quantité_(id_produit).

Ceci étant, je récupère cela dans le request (j'ai tronqué) :

Illuminate\Http\Request {#43 ?
  #json: null
  #convertedFiles: null
  #userResolver: Closure($guard = null) {#206 ?
    class: "Illuminate\Auth\AuthServiceProvider"
    this: Illuminate\Auth\AuthServiceProvider {#52 …}
    use: {?}
    file: "C:\wamp64\www\Laravel\crm\vendor\laravel\framework\src\Illuminate\Auth\AuthServiceProvider.php"
    line: "83 to 85"
  }
  #routeResolver: Closure() {#208 ?
    class: "Illuminate\Routing\Router"
    this: Illuminate\Routing\Router {#26 …}
    use: {?
      $route: Illuminate\Routing\Route {#190 …}
    }
    file: "C:\wamp64\www\Laravel\crm\vendor\laravel\framework\src\Illuminate\Routing\Router.php"
    line: "650 to 652"
  }
  +attributes: Symfony\Component\HttpFoundation\ParameterBag {#45 ?
    #parameters: []
  }
  +request: Symfony\Component\HttpFoundation\ParameterBag {#44 ?
    #parameters: array:7 [?
      "_method" => "PATCH"
      "_token" => "COaW9PauVIQee6UT1pXdhK6N57UbtO5fgp9qkx9X"
      "quantite_1" => "0"
      "quantite_2" => "0"
      "quantite_3" => "0"
      "quantite_4" => "0"
      "quantite_5" => "0"
    ]
  }
  
  ....

Mes quantités y sont bien, mais je ne sais comment récupérer ces champs...

$champ = $request->input('quantite_3');
dd($champ);

Cela me sort bien la quantité saisie pour le produit 3 (ou 6 ou 8 ou...), mais comment faire pour que ce soit dynamique ?

Style un foreach de chaque champ, je récup les values et j'explose le nom autour de l'underscore, ainsi j'ai mes id et quantités tout prêts pour l'insert...

Il n'y aura pas 10000 produits, donc la liste sera relativement courte (style 10 ou 20).

Merci à vous, en tout cas !

Posté il y a 2 mois
Avatar de KYoann
KYoann

Si tu n'utilise qu'un seul bouton pour mettre à jours les quantité de chaqu'un des produits, il faudrait peut être voir à manipuler le nom des inputs en y inserant l'id du produit dans le "name" du champs.

<form action="{{route('updateCommande}}" type="POST">
<input type hidden="{{$commande->id}}">

@foreach($commande->produits as $produit)

Produit :
<label>{{$produit->nom}}</label>
<input name="product_{{$produit->id}}" type="number" value="{{$produit->pivot->quantite}}"> 

@endforeach

<button type="submit" value="Valider">
</form>

Restera, dans le controlleur à vérifier que l'utilisateur actuel est le droit d'intéragir avec cet id de commande, puis d'extraire les id de produits des nom des variables request reçu.

Posté il y a 2 mois
Avatar de sergentMicklin
sergentMicklin

Alors, pour préciser un peu :

  • le directeur commercial gère les produits (CRUD). Donc produit_1, produit_2, produit_x... avec tarif, description, etc.

  • les commerciaux font des commandes intégrant ces produits (mais les commerciaux eux ne gèrent pas les produits).

  • forcément, tous sont authentifiés, chacun son compte et ses niveaux d'accès (impossible pour un commercial de changer un prix, p. ex.).

Ainsi, côté commerciaux, pour une commande donnée, j'affiche la liste de tous les produits et leur quantité. Si 0 le produit n'est pas dans la commande.

Ce qui me donne exactement le formulaire dont tu parles ci-dessus. Pas de souci, il est fait, il fonctionne, et je récupère mes quantités ainsi :

$champ = $request->input('quantite_3');
dd($champ);

(cf mon request tronqué).

Là, c'est la quantité du produit 3 (comme tu disais : produit_id). No soucy.

Mon prob, c'est de récupérer le NOM du champ, ici quantite_3 directement du formulaire, tu vois ? Comme cette liste est dynamique, je ne puis deviner les noms directement dans le controller... bref, je voudrais avoir ce genre de tableau/collection :

"quantite_1" => "1"
"quantite_2" => "3"
"quantite_3" => "0"
"quantite_4" => "12"
"quantite_5" => "56"

venant directement du form...

En clair,ds le controller, j'accède bien à la quantité via $request->input('quantite_3'), mais comment accéder au NOM de cet input ?

Ensuite, ne me restera plus qu'à faire du attach() ou sync() (ou autre) sur ma table pivot, et cela devrait aller (et voir à y mettre la qté, aussi !).

Posté il y a 1 mois
Avatar de KYoann
KYoann

Salut,

Regarde bien la ligne que j'ai mis dans la boucle foreach

<input name="product_{{$produit->id}}" type="number" value="{{$produit->pivot->quantite}}"> 

Je génére le nom de la variable request avec l'id du produit, et la valeur de cette variable est la quantité. Il te reste plus qu'a éclater le nom de la variable request pour récupérer l'id du produit est faire le traitement dans ton controlleur.

PS : Si j'ai bien compris ta problématique :P

Posté il y a 1 mois
Avatar de sergentMicklin
sergentMicklin

Pas de souci, c'est bien ce que je fais, et dans le controller, je récupère bien la value du input, donc les quantités, là tout va bien :

$quantite = $request->input('quantite_3');

Sauf que là, je triche, car c'est statique (c'est moi qui ait écrit quantite_3 directement dans le code...). Et je souhaite du dynamique.

Ainsi, je souhaite récupérer le contenu de name pour l'éclater (puisqu'il contient l'id du produit : c'est à dire produit_1, produit_2, produit_x,...).

Et c'est justement cela que je n'arrive pas à faire : comment, dans le controller, récupérer le contenu de l'attribut name ?

Sachant que dans mon form, je n'ai pas qu'un seul input, mais plusieurs...

Bon, j'espère être clair, tu me dis :)

Posté il y a 1 mois
Avatar de KYoann
KYoann

Ca semble bien galère pour recupérer le nom du variable puis d'en extraire l'id. je pense qu'il va falloir procéder autrement.

Si tu veux rester en html pur, peut être en ajoutant un input caché contenant l'id du produit en question avant l'input de quantité, et ceux pour chacun de tes produits, après, ca sera à gerer dans ton controlleur.

Si jamais tu veux reconcidérer l'utilisation de l'ajax, il y'a des méthode assez simple, et surtout reconnu pour faire ce que tu a besoin en utilisant "serialize".

Posté il y a 1 mois
Avatar de sergentMicklin
sergentMicklin

Oui, c'est tout à fait cela mon souci.

Récupérer les values des input c'est facile, tant que l'on connait le name de ces input.

Or (puisque ma liste input est dynamique), je ne connais pas ces noms par avance -> souci.

Je pensais qu'il existait une fonction (que je ne connaissait pas, donc) renvoyant les éléments du form sous la forme clef/valeur, il semble que non. Arf.

C'est d'autant plus dommage qu'il ne me manque que cela pour faire fonctionner la chose :D

Bon, je vais réfléchir soit au champ caché, soit effectivement à un peu d'Ajax, merci de ta réponse.

Sinon, je puis aussi reconsidérer l'ensemble du process, c'est à dire (idées en vrac) :

- afficher commande
- afficher contenu :
- chaque produit y possèderait un bouton "modifier produit_id" ----> controller update_commande
- page ajout produit ----> page avec une liste select + champ quantité pour tel produit (1 à la fois, donc).

Mais cela fait un peu clickodrome, je trouve. Quoiqu'en Vue.js...

Posté il y a 1 mois
Avatar de sergentMicklin
sergentMicklin

Alors, je me suis débrouillé autrement : un peu comme en Vue.js, j'ai placé deux boutons + et - autour de la quantité :

<a href="/add/edit/{{$panier->id}}/{{$id_commande}}" title="Add_produit"><img src="images/add.jpg" alt="add"/></a>

Ainsi, grâce aux routes définies dans web.php, j'arrive dans mon controller aux fonctions add ou remove.

Ensuite, par le biais de la table pivot (->withPivot('quantite')), j'affiche bien (et met à jour) correctement mes valeurs dans les view.

Problem solved !

Posté il y a 1 mois

Vous ne pouvez pas répondre à ce sujet.