Jump to content

[Résolu] Réaliser un formulaire avec un select dynamique dans un tpl


Recommended Posts

Bonjour,

J'essaie de faire un formulaire comprenant un select qui doit afficher les fournisseurs que j'ai dans ma BDD en guise de possibilité :1.thumb.JPG.bcd93cb12bb1fabd11d7fd8a519fe9fd.JPG
 

J'ai du mal à faire le lien entre mon controller et ma vue. Je débute tout juste avec la technologie Smarty.
 

Mon controller

/**
  * Affichage du formulaire d'ajout / création de l'objet
  * @return string
  * @throws SmartyException
  */
  public function renderForm()
  {
    return $this->module->display(_PS_MODULE_DIR_.'gestionProduction', 'views/templates/admin/ajoutReception.tpl');
    return parent::renderForm();

    $sql = 'SELECT id, nom_fournisseur FROM ' . _DB_PREFIX_ . 'GP_' . 'fournisseur';
    $result = $mysqli->query($sql);
    while ($row = $result->fetch_array(MYSQLI_ASSOC)){

      // set array index of fournisseur as id
      $fournisseurs[$row['id']] = $row['nom_fournisseur'];

      // get id of selected fournisseur
     if ($row['selected'] == true)
       $selected = $row['id'];
      else{}
    }
    
    $smarty = new Smarty;
    $smarty->assign('fournisseurs', $fournisseurs);
    $smarty->display('ajoutReception.tpl');
  }

 

et mon tpl

{*
* Affichage du formulaire d'ajout d'une réception.
*}
<div class="panel">
<!-- FORMULAIRE A REMPLIR -->
<div class="form_formulaire_reception">
    <form name="reception" method="post" action="">
    <div class="form-group col">
        <label for="fournisseurDataList">Nom du fournisseur :</label>
        <select class="form-control" list="selectOptions" id="fournisseurSelect" required>
          <option selected>Rechercher...</option>
          { for item in $fournisseurs }
          <option value="{{ item }}"></option>
          { endfor }
        </select>
    </div>
    <div class="form-group col">
        <label for="transporteurDataList">Nom du transporteur :</label>
        <input class="form-control" list="datalistOptions" id="transporteurDataList" placeholder="Rechercher..." >
        <datalist id="datalistOptions">
            <option>...</option>
        </datalist>
    </div> 
    <div class="form-group col">
        <label for="date_reception">Date de réception :</label>
        <input type="date" name="date_reception" required/> 
    </div>
    <p><p>
    <div class="row">
      <table id="myTable" class="table order-list">
        <thead>
        </thead>
        <tbody>
        <tr>
          <td scope="table order-list">
            <label for="ingredientSelect">Désignation</label>
          </td>
          <td>
            <label for="num_lot_fournisseur">N° de lot fournisseur</label>
          </td>
          <td>
            <label for="num_lot_reception">N° de lot</label>
          </td>
          <td>
            <label for="ddm_fournisseur_reception">DLC/DDM fournisseur</label>
          </td>
          <td>
            <label for="ddm_reception">DLC/DDM</label>
          </td>
          <td>
            <label for="quantite_conforme">Quantité conforme</label>
          </td>
          <td>
            <label for="integrite_reception">Intégrité</label>
          </td>
          <td>
            <label for="quantite_reception">Quantité reçue</label>
          </td>
        </tr>
        <tr>
          <th scope="table order-list">
            <select class="form-control" list="selectOptions" id="ingredientSelect" required>
              <option selected>Rechercher...</option>
              <option value="1">...</option>
            </select>
          </th>
          <td>
            <input type="text" name="num_lot_fournisseur" placeholder="N° de lot fournisseur" class="form-control" pattern="[A-Za-z0-9]+" required/>
          </td>
          <td>
            <input type="text" name="num_lot_reception" placeholder="N° de lot" class="form-control" pattern="[A-Za-z0-9]+" required/>
          </td>
          <td>
           <input type="date" name="ddm_fournisseur_reception" placeholder="DLC/DDM fournisseur" class="form-control" required/>
          </td>
          <td>
           <input type="date" name="ddm_reception" placeholder="DLC/DDM" class="form-control" required/>
          </td>
          <td style="text-align: center;">
            <input class="form-check-input" type="checkbox"  value="" name="quantite_conforme" required>
          </td>
          <td style="text-align: center;">
            <input class="form-check-input" type="checkbox"  value="" name="integrite_reception" required>
          </td>
          <td>
           <input type="text" name="quantite_reception" placeholder="Quantité reçue" class="form-control" required/>
          </td>
          <td><a class="deleteRow"></a></td> 
        </tr>
        </tbody>
        <tfoot>
        <tr>
          <td colspan="12" style="text-align: left;">
             <input type="button" class="btn btn-lg btn-block " id="addrow" value="Ajouter un ingrédient" />
          </td>
        </tr>
        </tfoot>
      </table>
      <div class="form-group col">
        <label for="visa">Opérateur : </label>
        <input type="text" name="visa" required/> 
      </div>
    </div>
    <p><p>
    <input type="submit" class="btn btn-lg btn-block" style="background-color: #4CAF50;color: white;" name="valider" value="VALIDER"/>
  </form>
  </div>
  
  <script type="text/javascript">
  //JS qui génère des lignes supplémentaires pour ajouter des ingrédients
  $(document).ready(function () {
    var counter = 0;
    $("#addrow").on("click", function () {
      var newRow = $("<tr>");
      var cols = "";
      cols += '<td><select class="form-control" list="selectOptions" name="id_ingredient' + counter + '"/></select></td>';
      cols += '<td><input type="text" class="form-control" placeholder="N° de lot fournisseur" name="num_lot_fournisseur' + counter + '"/></td>';
      cols += '<td><input type="text" class="form-control" placeholder="N° de lot" name="num_lot_reception' + counter + '"/></td>';
      cols += '<td><input type="date" class="form-control" placeholder="DLC/DDM fournisseur" name="ddm_fournisseur_reception' + counter + '"/></td>';
      cols += '<td><input type="date" class="form-control" placeholder="DLC/DDM" name="ddm_reception' + counter + '"/></td>';
      cols += '<td style="text-align: center;"><input type="checkbox" class="form-check-input" name="quantite_conforme' + counter + '"/></td>';
      cols += '<td style="text-align: center;"><input type="checkbox" class="form-check-input" name="integrite_reception' + counter + '"/></td>';
      cols += '<td><input type="text" class="form-control" placeholder="Quantité reçue" name="quantite_reception' + counter + '"/></td>';
      cols += '<td><input type="button" class="ibtnDel btn btn-md btn-danger "  value="Supprimer"></td>';
      newRow.append(cols);
      $("table.order-list").append(newRow);
      counter++;
    });
    $("table.order-list").on("click", ".ibtnDel", function (event) {
      $(this).closest("tr").remove();       
      counter -= 1
    });
  });
  </script>
</div>

Si quelqu'un veut bien m'aiguiller sur la façon de procéder, ce serait gentil 😃

Edited by Allyta (see edit history)
Link to comment
Share on other sites

Evolution du code (mais toujours non fonctionnel)

Vue :

 <div class="form-group col">
        <label for="fournisseurDataList">Nom du fournisseur :</label>
        <select class="form-control" list="selectOptions" id="fournisseurSelect" required>
          <option selected>Rechercher...</option>
          { for id_fournisseur in $fournisseurs }
          <option value="{{ id_fournisseur }}">{{ id_fournisseur.nom_fournisseur }}</option>
          { endfor }
        </select>
    </div>

Controller

public function renderForm()
  {
    $sql = new DbQuery();    
    $sql = 'SELECT id_fournisseur, nom_fournisseur FROM ' . _DB_PREFIX_ . 'GP_' . 'fournisseur';
    if ($results = Db::getInstance()->ExecuteS($sql)){
	    foreach ($results as $row){
        // set array index of fournisseur as id
        $fournisseurs[$row['id_fournisseur']] = $row['nom_fournisseur'];}
    }
    else{}

    return $this->module->display(_PS_MODULE_DIR_.'gestionProduction', 'views/templates/admin/ajoutReception.tpl');
    return parent::renderForm();
  }

 

Link to comment
Share on other sites

Salut, regarde dans la classe Supplier... dans ta vue


{assign var=suppliers value=Supplier::getSuppliers()}
<select name="supplier" class="form-select">
   {foreach from=$suppliers item=supplier}
      <option value="{$supplier.id}">{$supplier.name}</option>
   {/foreach}
</select>

cdt

  • Thanks 1
Link to comment
Share on other sites

Merci pour ta réponse 😃

Je vais essayer ta méthode.
Par contre j'utilise bien Fournisseur et non Supplier (ma table fournisseur dans la bdd est trop différente de la fonctionnalité supplier native de Prestashop).
Je vais adapter le model de Fournisseur en suivant ce qui est fait pour Supplier du coup.

Si je comprend bien, ton getSuppliers() importe la liste des fournisseurs directement depuis le model (Supplier.php) donc pas besoin de faire un array de suppliers dans le controller avant de l'appeler dans la vue ?
 

Link to comment
Share on other sites

Ah ok d accord tu as donc un nouvel objet fournisseur, et bien tu ajoute une fonction getAllFournisseurs() qui retourne tout tes fournisseurs

 public static function getAllFournisseurs()
{
 $results = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS(
                '
					SELECT  *
					FROM `' . _DB_PREFIX_ . 'fournisseurs`
					WHERE 1)
                );

return  $results;
}

ensuite soit tu appelles cette fonction dans ton controller et ensuite tu l'assigne a smarty, soit tu l'appelle directement dans ta vue,

cdt

Edited by Alexandre Carette (see edit history)
Link to comment
Share on other sites

  • Allyta changed the title to [Résolu] Réaliser un formulaire avec un select dynamique dans un tpl

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...