Bon, je me suis battue un bon moment mais visiblement j'ai mal call quelque chose à un moment parce qu'il n'arrive pas à trouver le model CategorieRecette.php si je ne lui indique pas et quand je le lui donne il essaie de déclarer la classe une seconde fois.
Je vous mets mon massacre code ici :
(J'ai mis le JS dans le tpl. Je sais, c'est pas bien, mais j'en suis à l'étape juste avant pleurer du sang donc on ne fera pas de remarque là-dessus)
PHP :
<?php /* Controller lié à la gestion des réceptions. Réalisé par : Allyta */ include '../modules/gestionProduction/classes/Fabrication.php'; include '../modules/gestionProduction/classes/CategorieRecette.php'; include '../modules/gestionProduction/classes/Recette.php'; include '../modules/gestionProduction/classes/Unite.php'; //include 'https://code.jquery.com/jquery-3.5.0.js'; class AdminGestionFabricationController extends ModuleAdminController{ // Instanciation de la classe public function __construct(){ $this->bootstrap = true; //Gestion de l'affichage en mode bootstrap $this->table = 'gp_fabrication'; //Table de l'objet $this->identifier = 'id_fabrication'; //Clé primaire de l'objet $this->className = Fabrication::class; //Classe de l'objet $this->lang = false; //Flag pour dire si utilisation de langues ou non // Range la liste par date décroissante $this->_orderBy = 'date_fabrication'; $this->_orderWay = 'DESC'; //Récupère le nom de la recette à partir de l'id_recette $this->_join .= ' INNER JOIN '._DB_PREFIX_. 'GP_' . 'recette r ON (a.id_recette = r.id_recette)'; $this->_select .= 'r.nom_recette AS `recette_reception`'; //Liste des champs de l'objet à afficher dans la liste $this->fields_list = array( 'recette_reception' => array('title' => 'Recette', 'width' => 'auto'), 'date_fabrication' => array('title' => 'Date', 'width' => 'auto'), 'num_lot_fabrication' => array('title' => 'N° de lot', 'width' => 'auto'), 'quantite_totale_fabrication' => array('title' => 'Quantité totale fabriquée', 'width' => 'auto'), ); //Ajout d'actions sur chaque ligne //$this->addRowAction('view'); $this->addRowAction('edit'); $this->addRowAction('delete'); parent::__construct(); } public function setMedia($isNewTheme = false) { parent::setMedia($isNewTheme); $this->addJS(_MODULE_DIR_ . 'gestionProduction/views/js/jquery-3.6.0.js'); $this->addJS(_MODULE_DIR_ . 'gestionProduction/views/js/ajax.js'); } /** * 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/ajoutFabrication.tpl'); return parent::renderForm(); } }
TPL :
{* * Affichage du formulaire d'ajout d'une fabrication. *} <div class="panel"> <!-- FORMULAIRE A REMPLIR --> <div class="form_formulaire_reception"> <form name="fabrication" method="post" action=""> <div class="form-group col"> <label for="categorieRecetteDataList">Catégorie recette :</label> {assign var=categoriesRecette value=CategorieRecette::getcategoriesRecette()} <select name="categorieRecette" class="form-select" id="categorieRecetteSelect"> <option selected="selected">Choisir une catégorie</option> {foreach from=$categoriesRecette item=categorieRecette} <option value="{$categorieRecette.id_categorie_recette}">{$categorieRecette.nom_categorie_recette}</option> {/foreach} </select> </div> <div class="form-group col"> <label for="recetteDataList">Nom de la recette :</label> {*{assign var=recettes value=Recette::getRecettes()}*} {assign var=recettes value=Recette::getRecettesByCategorie(id_categorie_recette_selected)} {*{assign var=recettes value=Recette::getRecettesByCategorie($("select#categorie_recette_selected option:checked").val())}*} <select class="form-control" id="recetteDataList"> <option selected="selected">Choisir une recette</option> {foreach from=$recettes item=recette} <option value="{$recette.id_recette}">{$recette.nom_recette}</option> {/foreach} </select> </div> <div class="form-group col"> <label for="date_fabrication">Date de fabrication :</label> <input type="date" name="date_fabriation" required/> </div> <div class="form-group col"> <label for="num_lot_farication">N° de lot : </label> <input type="text" name="num_lot_farication" required/> </div> <div class="form-group col"> <label for="quantite_meo">Quantité totale mise en oeuvre : </label> <input type="text" name="quantite_meo" required/> </div> <label for="recetteDataList">Unité de mesure :</label> {assign var=unites value=Unite::getUnites()} <select class="form-control" id="uniteDataList"> <option selected="selected">Choisir une unité</option> {foreach from=$unites item=unite} <option value="{$unite.id_unite}">{$unite.nom_unite}</option> {/foreach} </select> <p></p> <input type="submit" class="btn btn-lg btn-block" style="background-color: #4CAF50;color: white;" name="validerAjoutFabrication" value="VALIDER"/> </form> </div> </div> <script> $(document).ready(function(){ load_data(); function load_data(query=''){ $.ajax({ url:"AdminGestionFabricationController.php", method:"POST" }) } //Récupération et attribution de la catégorie sélectionnée à la variable $id_categorie_recette_selected function getFilterId(){ $('#categorie_recette_selected ').change(function(){ var id_categorie_recette_selected = null; id_categorie_recette_selected == $(this).val(); return id_categorie_recette_selected; }) } }); </script>
Utilisation de $id_categorie_recette_selected par getRecetteByCategorie() :
/** * Return recettesByCategorie. * * @return array recettesbyCategorie */ public static function getRecettesByCategorie($id_categorie_recette) { $query = new DbQuery(); $query->select('s.*'); $query->from('gp_recette', 's'); $query->join(Shop::addSqlAssociation('recette', 's')); $query->orderBy(' s.`nom_recette` ASC'); if($id_categorie_recette != null){ $query->where('s.`id_categorie_recette` = $id_categorie_recette'); } else {} $recettesbyCategorie = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($query); if ($recettesbyCategorie === false) { return false; } return $recettesbyCategorie; }
J'ai vu quelques tutos faire la query qui filtre dans la requête ajax mais je trouve que c'est plus propre de la ranger dans le model et de juste passer en argument l'id de filtrage.
Je continue de bidouiller de mon côté. Merci aux courageux qui tenteront de me débloquer. 😃
PS : Je peux aussi vous passer le module si vous êtes vraiment déterminés. Il s'installe et se désinstalle tout seul comme un grand. ![]()
.png.022b5452a8f28f552bc9430097a16da2.png)