Krapoutchniek Posted March 12, 2015 Share Posted March 12, 2015 (edited) Salut, J'ai un souci au niveau du développement d'un module. J'ai déjà soumis le problème sur les forums d'openclassroom. => J'ai encore un souci avec Prestashop (que je découvre). Je suis en train de créer un module qui affichera des news sur la page d'accueil du site. J'ai créé deux tables en BD : ps_news et ps_news_lang. Pour l'instant j'ai réussi à afficher les news sur le panneau d'admin : Maintenant je veux m'attaquer à la gestion des news : modifier / supprimer celles qui existent et en ajouter. J'ai pas mal cherché mais aucun tuto n'est vraiment clair et précis à ce sujet. Je ne sais pas où mettre le code des formulaires, je ne sais pas non plus comment lier les actions. Pour l'instant si je clique sur ma news, ça me donne cette erreur : Fatal error: Class 'News' not found in C:\wamp\www\prestashop\classes\controller\AdminController.php on line 1418 Pareil si je clique sur le bouton + pour ajouter une news. En gros, je voudrais pouvoir lier les actions (cliquer sur la news, éditer, supprimer, ajouter) à mon module, créer les formulaires et gérer le tout en BD. Pour l'affichage en front, je verrai après (et j'imagine que ce sera beaucoup plus facile). J'utilise Prestashop 1.0.6.11 (la dernière version). Merci d'avance Krap. Edited March 12, 2015 by Krapoutchniek (see edit history) 1 Link to comment Share on other sites More sharing options...
Krapoutchniek Posted March 12, 2015 Author Share Posted March 12, 2015 Je ne m'en sors pas. Je commence à tout mélanger... Voilà la structure de mon module : Pour l'instant je n'ai encore rien dans les tpl. Vu que je ne sais pas comment inclure de formulaire (je ne sais même pas si je dois faire un tpl par formulaire), j'essaie d'afficher les news. Même ça ça ne fonctionne pas... D'une part j'ai ce code dans news.php : models/news.php <?php class News extends ObjectModel { public $id_news; public $date; public $active; public static $definition = array( 'table' => 'news', 'primary' => 'id_news', 'multilang' => false, 'fields' => array( 'id_news' => array( 'type' => ObjectModel :: TYPE_INT ), 'date' => array( 'type' => ObjectModel :: TYPE_DATE, 'required' => true ), 'active' => array( 'type' => ObjectModel :: TYPE_BOOL, 'required' => true ) ) ); public static function findAll() { /* $sql = 'select * from ' . _DB_PREFIX_ . 'news where active = 1'; */ $sql = new DbQuery(); $sql->select('*'); $sql->from(_DB_PREFIX_ . 'news', 'N'); $sql->innerJoin(_DB_PREFIX_ . 'news_lang', 'NL', 'N.id_news = NL.id_news AND NL.id_lang = ' . (int)$id_lang); $sql->where('N.active = 1'); if ($rows = Db :: getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql)) { return ObjectModel :: hydrateCollection(__CLASS__, $rows); } return array(); } } Et ça fonctionne très bien pour afficher les news dans la partie admin : controllers/admin/adminnews.php <?php require_once '/../../models/news_lang.php'; class AdminNewsController extends ModuleAdminController { public function __construct() { $this->bootstrap = true; $this->table = 'news'; $this->className = 'News'; $this->name = 'dashhomenews'; $this->tab = 'dashhomenews'; $this->lang = true; parent :: __construct(); //$news = new News; //print(NewsLang::findAllNewsDisplayFront()); $this->initList(); $this->renderForm(); } private function initList() { $this->fields_list = array(); $this->fields_list['id_news'] = array( 'title' => 'ID', 'align' => 'left', 'width' => 25, 'type' => 'integer' ); $this->fields_list['titre'] = array( 'title' => $this->l('Title'), 'align' => 'left', 'width' => 150, 'type' => 'string' ); $this->fields_list['resume'] = array( 'title' => $this->l('Summary'), 'align' => 'left', 'width' => 200, 'type' => 'string' ); $this->fields_list['texte'] = array( 'title' => $this->l('Text'), 'align' => 'left', 'width' => 200, 'type' => 'string' ); $this->fields_list['date'] = array( 'title' => $this->l('Date'), 'align' => 'left', 'width' => 'auto', 'type' => 'date', 'orderby' => 'true' ); $this->fields_list['active'] = array( 'title' => $this->l('Displayed'), 'align' => 'left', 'width' => 'auto', 'active' => 'status' ); $this->addRowAction('edit'); $this->addRowAction('delete'); } public function renderForm() { $fields_form = array( 'form' => array( 'legend' => array( 'title' => $this->l('Settings'), 'icon' => 'icon-cogs' ), 'input' => array( array( 'type' => 'switch', 'label' => $this->l('Ajax cart'), 'name' => 'titre', 'desc' => $this->l('Title of the news') ) ), 'submit' => array( 'title' => $this->l('Save'), 'class' => 'btn btn-default pull-right') ), ); $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->table; $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); $helper->default_form_language = $lang->id; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; $this->fields_form = array(); $helper->identifier = $this->identifier; $helper->submit_action = 'submitBlockCart'; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false) .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->tpl_vars = array( 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id ); return $helper->generateForm(array($fields_form)); } } (la fonction renderForm ne fait rien pour l'instant, j'ai lu que cette fonction servait à afficher des formulaires) Par contre le même code dans news_lang ne fonctionne pas... models/news_lang.php <?php class NewsLang extends ObjectModel { public $id_news; public $id_lang; public $titre; public $resume; public $texte; public static $definition = array( 'table' => 'news_lang', 'primary' => 'id_news', 'multilang' => true, 'fields' => array( 'id_news' => array( 'type' => ObjectModel :: TYPE_INT ), 'id_lang' => array( 'type' => ObjectModel :: TYPE_INT ), 'titre' => array( 'type' => ObjectModel :: TYPE_STRING, 'required' => true ), 'resume' => array( 'type' => ObjectModel :: TYPE_STRING, 'required' => true ), 'texte' => array( 'type' => ObjectModel :: TYPE_STRING, 'required' => true ), 'date' => array( 'type' => ObjectModel :: TYPE_DATE, 'required' => true ), 'active' => array( 'type' => ObjectModel :: TYPE_BOOL, 'required' => true ) ) ); public static function findAll() { /* $sql = 'select * from ' . _DB_PREFIX_ . 'news N LEFT JOIN ' . _DB_PREFIX_ . 'news_lang NL where N.id_news=NL.id_news AND id_lang="$id_lang"'; */ $sql = new DbQuery(); $sql->select('*'); $sql->from(_DB_PREFIX_ . 'news', 'N'); $sql->innerJoin(_DB_PREFIX_ . 'news_lang', 'NL', 'N.id_news = NL.id_news AND NL.id_lang = ' . (int)$id_lang); $sql->where('N.active = 1'); if ($rows = Db :: getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql)) { return ObjectModel :: hydrateCollection(__CLASS__, $rows); } return array(); } public static function findAllNewsDisplayFront() { $sql = new DbQuery(); $sql->select('*'); $sql->from(_DB_PREFIX_ . 'news', 'N'); $sql->innerJoin(_DB_PREFIX_ . 'news_lang', 'NL', 'N.id_news = NL.id_news AND NL.id_lang = ' . (int)$id_lang); $sql->where('N.active = 1'); $sql->limit(3); if ($rows = Db :: getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql)) { return ObjectModel :: hydrateCollection(__CLASS__, $rows); } return array(); } } Là il ne connait plus $id_lang et pour une raison inconnue, _DB_PREFIX_ est doublé : Quant à la structure de mes tables : ps_news : id_news (int primary) date (date) active (boolean) ps_news_lang id_news (int) id_lang (int) titre (text) resume (text) texte (text) En théorie je suis censé afficher un certain nombre de news sur la page d'accueil. Et ces news, je dois pouvoir les créer / modifier / supprimer en back office. Malheureusement, à part l'affichage sur ce dernier, je n'arrive à rien... Je ne sais pas quoi faire. Merci d'avance. Link to comment Share on other sites More sharing options...
coeos.pro Posted March 12, 2015 Share Posted March 12, 2015 Changez les$sql->from(_DB_PREFIX_ . 'news',...$sql->innerJoin(_DB_PREFIX_ . 'news_lang',...par$sql->from('news',...$sql->innerJoin('news_lang',...Dans les bonnes pratiques de la classe Db (https://www.prestashop.com/blog/fr/les-bonnes-pratiques-de-la-classe-db-sur-prestashop-1-5/ ) on voit qu'il ne faut pas mettre _DB_PREFIX_ pour insert et delete par exemple et pour les fonctions que vous utilisez (innerJoin, from...) on voit qu'il ne faut pas le rajouter : public function innerJoin($table, $alias = null, $on = null){return $this->join('INNER JOIN `'._DB_PREFIX_.bqSQL($table).'`'.($alias ? ' '.pSQL($alias) : '').($on ? ' ON '.$on : ''));} Link to comment Share on other sites More sharing options...
Krapoutchniek Posted March 12, 2015 Author Share Posted March 12, 2015 (edited) Merci pour votre réponse Je viens de réussir à afficher les news sur la page d'accueil. Donc point de vue affichage sur le front office, c'est réglé. Il me reste donc la gestion en partie admin. J'ai vu qu'il fallait employer la méthode renderForm (que j'ai reprise) mais j'ignore comment la déclencher quand on appuye sur le bouton "+" pour ajouter une news et comment faire pour la lier à la modification d'une news existante (en choisissant "Modifier" dans la liste déroulante ou en cliquant sur la news). Edit : Ca avance. Je parviens à afficher le formulaire quand je clique sur "Ajouter" et quand je veux modifier la news (mais c'est le même formulaire qui est chargé). Par contre j'ai une erreur : Le code : public function renderForm() { $fields_form = array( 'form' => array( 'legend' => array( 'title' => $this->l('Add a news'), 'icon' => 'icon-cogs' ), 'input' => array( array( 'type' => 'text', 'label' => $this->l('Title'), 'name' => 'titre', 'desc' => $this->l('Title of the news') ), array( 'type' => 'text', 'label' => $this->l('Summary'), 'name' => 'resume', 'desc' => $this->l('Summary of the news') ), array( 'type' => 'text', 'label' => $this->l('Text'), 'name' => 'texte', 'desc' => $this->l('Text of the news') ) ), 'submit' => array( 'title' => $this->l('Save'), 'class' => 'btn btn-default pull-right') ), ); $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->table; $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); $helper->default_form_language = $lang->id; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; $this->fields_form = array(); $helper->identifier = $this->identifier; $helper->submit_action = 'submitBlockCart'; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false) .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->tpl_vars = array( 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id ); return $helper->generateForm(array($fields_form)); } Je pense que ça bug au niveau de l'attribut 'name' de mes inputs. Cependant le nom est bien attribué. Par contre je ne vois pas comment ajouter un select qui permet de choisir parmi les langues installées et faire en sorte que les textes des champs correspondent à la langue choisie ? Pour la suite j'imagine que je dois utiliser une fonction "addNews", quelque chose du genre pour récupérer les données ? Qu'est-ce que je lui passe comme argument pour pouvoir manipuler les données et les mettre en BDD ? Edited March 12, 2015 by Krapoutchniek (see edit history) Link to comment Share on other sites More sharing options...
xmatox Posted March 12, 2015 Share Posted March 12, 2015 Salut, tu as pas un petit problème au niveau du nombre de tableau que tu ouvres et que tu fermes là : $fields_form = array( 'form' => array( 'legend' => array( 'title' => $this->l('Add a news'), 'icon' => 'icon-cogs' ), 'input' => array( array( 'type' => 'text', 'label' => $this->l('Title'), 'name' => 'titre', 'desc' => $this->l('Title of the news') ), array( 'type' => 'text', 'label' => $this->l('Summary'), 'name' => 'resume', 'desc' => $this->l('Summary of the news') ), array( 'type' => 'text', 'label' => $this->l('Text'), 'name' => 'texte', 'desc' => $this->l('Text of the news') ) ), 'submit' => array( 'title' => $this->l('Save'), 'class' => 'btn btn-default pull-right') ), ); Comme ça, ça serai pas mieux ? $fields_form = array( 'legend' => array( 'title' => $this->l('Add a news'), 'icon' => 'icon-cogs' ), 'input' => array( array( 'type' => 'text', 'label' => $this->l('Title'), 'name' => 'titre', 'desc' => $this->l('Title of the news') ), array( 'type' => 'text', 'label' => $this->l('Summary'), 'name' => 'resume', 'desc' => $this->l('Summary of the news') ), array( 'type' => 'text', 'label' => $this->l('Text'), 'name' => 'texte', 'desc' => $this->l('Text of the news') ) ), 'submit' => array( 'title' => $this->l('Save'), 'class' => 'btn btn-default pull-right') ), ); Link to comment Share on other sites More sharing options...
Krapoutchniek Posted March 12, 2015 Author Share Posted March 12, 2015 Si je supprime le 'form' => array, j'obtiens ce message : Notice à la ligne 149 du fichier C:\\wamp\\www\\prestashop\\cache\\smarty\\compile\\e7\\90\\58\\e79058cea39f59e38a5bdb059d845dbf8d6b1f8d.file.form.tpl.php [8] Undefined index: form Et le formulaire ne s'affiche plus. Link to comment Share on other sites More sharing options...
xmatox Posted March 12, 2015 Share Posted March 12, 2015 Pour les langues, normalement ça se fait tout seul si tu as bien tout configuré peut etre ajouter à tes champs multilangue : array( 'type' => 'text', 'label' => $this->l('Title'), 'name' => 'titre', 'lang' => true, 'desc' => $this->l('Title of the news') ), 1 Link to comment Share on other sites More sharing options...
Krapoutchniek Posted March 12, 2015 Author Share Posted March 12, 2015 (edited) Bien vu pour la langue, ça fonctionne Edit : Par contre j'ai toujours mes undefined index. Re-édit : J'ai réglé le problème Au lieu d'utiliser $this->fields_form pour mon formulaire, j'utilisais une variable $fields_form... Je rédéfinissais aussi le helper (et sans doute d'une mauvaise manière) alors qu'il me suffisait de faire un return parent::renderForm(). Bref, plus qu'à trouver le moyen pour mettre les infos en BDD. Edited March 12, 2015 by Krapoutchniek (see edit history) Link to comment Share on other sites More sharing options...
CHEF Angélina Posted March 13, 2015 Share Posted March 13, 2015 (edited) Bonjour, C'est exactement le type de module que je recherche, car je suis obligé de mettre mes news en image sur mon site ce qui me prend plus de temps et qui ne fait pas très beau. Quand vous aurez trouvé la solution pourriez vous nous faire partager le module SVP? Edited March 13, 2015 by CHEF Angélina (see edit history) Link to comment Share on other sites More sharing options...
Krapoutchniek Posted March 13, 2015 Author Share Posted March 13, 2015 Probablement, oui. Mais je débute dans la création de module Prestashop, donc il risque d'y avoir des erreurs de débutant ou des trucs pas très catholiques dans le code. Quoi qu'il en soit, j'ai réussi à gérer l'ajout en BDD, avec la gestion des multi langues Reste plus qu'à gérer la suppression et la modification. Link to comment Share on other sites More sharing options...
CHEF Angélina Posted March 13, 2015 Share Posted March 13, 2015 Oui mais c'est pas grave ça vaut le coup d'essayer votre module je pense, en plus vous aurez passé beaucoup de temps dessus donc pourquoi pas Merci à vous. Link to comment Share on other sites More sharing options...
xmatox Posted March 13, 2015 Share Posted March 13, 2015 En fait normalement, quand c'est des traitements classiques comme ça à l'air d'être ton cas, il se fait tout seul mais je pense que tu as peut être un problème au niveau de tes models et de tes tables Comme table tu devrais avoir (si j'ai bien compris) ta table news = 'id_news' 'date' 'active' et news_lang 'id_news' 'id_lang' 'titre' 'resume' 'texte' et tu as besoin que du model News, pas de news_lang qui devrait ressembler à un truc du style : <?php class News extends ObjectModel { public $titre; public $resume; public $texte; public $date; public $active; public static $definition = array( 'table' => 'news', 'primary' => 'id_news', 'multilang' => true, 'fields' => array( 'titre' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate'=> 'isString', 'required' => true ), 'resume' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate'=> 'isString', 'required' => true ), 'texte' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate'=> 'isString', 'required' => true ), 'date' => array('type' => self::TYPE_DATE,'required' => true), 'active' => array('type' => self::TYPE_BOOL,'required' => true), ) ); } ensuite si tu as des traitements spécifiques comme rajouter le contenu des deux champs obligatoires qui te manque c'est dans postProcess de ton controller que ça se passe, comme par exemple : public function postProcess() { // tu ajoutes une valeur à active $_POST["active"] = 1; // tu executes le traitement par défaut return parent::postProcess(); } 1 Link to comment Share on other sites More sharing options...
Krapoutchniek Posted March 13, 2015 Author Share Posted March 13, 2015 (edited) J'ai essayé et plus rien ne fonctionne. Mes champs 'date' et 'active' ont une valeur par défaut en BDD quand je crée une news donc logiquement ils ne devraient pas être modifiables par le formulaire d'ajout. Voilà le code de renderForm : public function renderForm() { $this->fields_form = array( 'legend' => array( 'title' => $this->l('Add a news'), 'icon' => 'icon-cogs' ), 'input' => array( array( 'type' => 'text', 'label' => $this->l('Title'), 'name' => 'titre', 'lang' => true, 'desc' => $this->l('Title of the news') ), array( 'type' => 'text', 'label' => $this->l('Summary'), 'name' => 'resume', 'lang' => true, 'desc' => $this->l('Summary of the news') ), array( 'type' => 'text', 'label' => $this->l('Text'), 'name' => 'texte', 'lang' => true, 'desc' => $this->l('Text of the news') ) ), 'submit' => array( 'title' => $this->l('Save'), 'class' => 'btn btn-default pull-right' ) ); return parent::renderForm(); } Edited March 13, 2015 by Krapoutchniek (see edit history) Link to comment Share on other sites More sharing options...
xmatox Posted March 13, 2015 Share Posted March 13, 2015 si c'est des valeurs par défaut dans ta BDD, il faut surement que tu enlèves 'required' => true de ton model sur ses deux champs 1 Link to comment Share on other sites More sharing options...
Krapoutchniek Posted March 13, 2015 Author Share Posted March 13, 2015 (edited) Ca ne fonctionne pas non plus. Et quand je veux modifier une news, les champs ne se remplissent pas. Je ne sais pas comment fonctionne Prestashop au niveau des jointures mais si je ne réécris pas la fonction postProcess, la jointure entre 'news' et 'news_lang' n'est indiquée nulle part. Quand je veux supprimer une news, j'ai cette erreur : Une erreur s'est produite pendant la suppression de l'objet. news (impossible de charger l'objet) Edit : Il y a du nouveau ! J'ai modifié un truc dans mon contrôleur. J'ai inclus le fichier de la classe News et j'ai défini un classname dans le contrôleur. Depuis lors ça fonctionne comme avant, sans redéfinir postProcess Seuls bémols : maintenant quand je crée une news, la date prend la valeur 0000 0000 etc. et le champ active prend la valeur 0 au lieu de 1 (comme défini en BDD). Et les champs du formulaire de modification ne prennent toujours pas les valeurs de l'enregistrement à modifier. Re-édit : L'ajout et la suppression fonctionnent sans le moindre problème ! Il ne me reste plus que la modification. Note qu'elle s'effectue correctement en BDD. Le seul souci réside dans le fait que les champs du formulaire ne se remplissent pas avec les données existantes. C'est là mon dernier problème. En tout cas merci de m'aider. Ca fait plaisir Edited March 13, 2015 by Krapoutchniek (see edit history) Link to comment Share on other sites More sharing options...
xmatox Posted March 13, 2015 Share Posted March 13, 2015 tu dois avoir un truc de mal configuré quelque part si tu veux, remets ton model et ton controller pour voir si il y a un truc qui cloche 1 Link to comment Share on other sites More sharing options...
Krapoutchniek Posted March 13, 2015 Author Share Posted March 13, 2015 (edited) J'ai trouvé ! Effectivement il y avait un léger problème de configuration. Il se trouve que j'avais bêtement fait un $this->renderForm() dans le constructeur. Et visiblement ça empêchait le formulaire de prendre les données. Tout fonctionne bien. Plus qu'à mettre une couche CSS J'en profite pour poser des questions, parce que le module pourrait évoluer en ce sens : Pour l'instant j'affiche les trois dernières news sur la page d'accueil, de la plus récente à la plus ancienne : 1) Quand je modifie une news, ça met à jour sa date par la date actuelle. Je peux empêcher ça ? (si je ne veux pas faire remonter en page d'accueil une vieille news que j'update) 2) Que dois-je faire pour pouvoir consulter chaque news sur une page qui lui est dédiée ? Un peu comme les catégories qui ont une page dédiée. => Pour ce deuxième point, j'ai par exemple une catégorie "Alain Navarre". Quand je clique dessus, j'arrive sur la page prestashop/fr/16-alain-navarre. J'aimerais pouvoir faire la même chose avec une news et avoir une page du style prestashop/fr/2-ceci-est-une-news en admettant que la news de l'id soit le 2. Merci à toi de m'avoir aidé. J'y vois maintenant plus clair pour la création de modules Edited March 13, 2015 by Krapoutchniek (see edit history) Link to comment Share on other sites More sharing options...
xmatox Posted March 13, 2015 Share Posted March 13, 2015 (edited) pour ta date, si tu en mis par défaut CURRENT_TIMESTAMP direct dans ta BDD ça doit pas la modifier sur un update il me semble pour accéder à une page de ton module ça va être dans les controllers de front que tu pouvoir géré tout ça par exemple dans controllers/front/mapage.php tu peux avoir un truc du style : <?php class monmodulemapageModuleFrontController extends ModuleFrontController { public function initContent() { $this->context->controller->addCSS(_MODULE_DIR_.'/monmodule/css/monmodule.css'); $this->context->controller->addJS(_MODULE_DIR_.'/monmodule/js/monmodule.js'); $this->context->smarty->assign('mavar', 'mon texte'); parent::initContent(); $this->setTemplate('mapage.tpl'); } } là c'est un truc basique, il faut que tu rajoutes des variables en post ou get à récupérer pour détecter de quelle news il sagit et du coup récupéré les infos dont tu as besoin ... et ensuite dans views/templates/front/mapage.tpl tu as ton html avec smarty pour les variables et pour accéder à ta page ça sera plus un truc comme : prestashop/module/monmodule/mapage voilà en gros Edited March 13, 2015 by xmatox (see edit history) Link to comment Share on other sites More sharing options...
Krapoutchniek Posted March 14, 2015 Author Share Posted March 14, 2015 Merci, j'essayerai ça Link to comment Share on other sites More sharing options...
Krapoutchniek Posted March 16, 2015 Author Share Posted March 16, 2015 (edited) Salut, J'essaie de faire ce que tu as dit l'autre jour mais j'ai un problème : Notice: Undefined index: controller in C:\wamp\www\prestashop\classes\Dispatcher.php on line 763 Et ma news ne s'affiche pas car il y a des erreurs similaires (Undefined index: titre et Undefined index: texte - mais j'imagine que c'est dû à la première erreur) Voilà le code de mon contrôleur : modules/dashhomenews/controllers/front/default.php <?php class dashhomenewsdefaultModuleFrontController extends ModuleFrontController { public function initContent() { //$this->context->controller->addCSS(_MODULE_DIR_.'/dashhomenews/css/news.css'); if(Tools::getValue('id')) { global $smarty; $sql = new DbQuery(); $sql->select('*'); $sql->from('news', 'N'); $sql->innerJoin('news_lang', 'NL', 'N.id_news = NL.id_news AND NL.id_lang = ' . (int)$this->context->language->id); $sql->where('N.active = 1 AND N.id_news = ' . Tools::getValue('id')); $news = Db::getInstance()->ExecuteS($sql); $this->context->smarty->assign('news', $news); } parent::initContent(); $this->setTemplate('news.tpl'); } } Et le tpl : modules/dashhomenews/views/templates/front/news.tpl <div id="news"> {if $news} <h4>{$news.titre}</h4> <p>{$news.texte}</p> {else} <p>Il n'y a pas de news.</p> {/if} </div> Sachant que la page est appelée en cliquant sur un résumé de news qui se trouve sur la page d'accueil : modules/dashhomenews/views/templates/hook/home.tpl <h3>News !</h3> {if $tab_news} {foreach from=$tab_news item=news} <a href="module/dashhomenews?id={$news.id_news}"> <h4>{$news.titre}</h4> <p>{$news.resume}</p> </a> <hr /> {/foreach} {else} <p>Il n'y a pas de news.</p> {/if} J'ai l'impression que le contrôleur du front n'est pas chargé. Et du coup, forcément ma news ne peut pas s'afficher. Le lien de la news ressemble bien à ce que tu as dit : prestashop/fr/module/dashhomenews?id=2. Tiens j'en profite aussi pour demander un truc. Pour les produits, catégories, etc. on peut définir un autre lien, du style /produit/2-ceci-est-un-produit, comme je le disais plus haut. Comment peut-on le faire pour un module ? Merci d'avance. Edit : J'ai trouvé l'erreur, c'était tout con ^^ J'ai construit mes liens de telle sorte : /prestashop/module/dashhomenews?id=2 alors que c'était /prestashop/module/dashhomenews/default?id=2 (reste plus qu'à trouver un nom plus explicite que "default" par contre...). Le bug est réglé. Par contre je suis toujours intéressé pour savoir comment faire des liens plus propres. Edited March 16, 2015 by Krapoutchniek (see edit history) Link to comment Share on other sites More sharing options...
Krapoutchniek Posted March 19, 2015 Author Share Posted March 19, 2015 (edited) Je remonte. Je tente d'intégrer des url simplifiées pour mes news, pour avoir quelque chose du style /news-champagne/1-ceci-est-une-news. Première étape : /news-champagne/1. Je verrai pour ajouter le titre quand ça fonctionnera. Je fais un override de la classe Dispatcher : <?php class Dispatcher extends DispatcherCore { public $news_routes = array( 'news_rules' => array( 'controller' => 'newschampagne', 'rule' => 'news-champagne/{id}', 'keywords' => array( 'id' => array('regexp' => '[0-9]+', 'param' => 'id_news'), 'rewrite' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), 'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'), ) ) ); protected function loadRoutes() { foreach($this->news_routes As $Routes) array_push($this->default_routes, $Routes); parent::loadRoutes(); } } Le paramètre rewrite n'est pas (encore) utilisé. C'est ce qui correspondra au titre. Ca ne fonctionne pas. J'ai l'impression que la règle ne se crée pas dans le htaccess. J'ai déjà vidé le cache, ça n'a rien changé. Après je ne sais pas si je dois faire un truc spécial pour que cette règle se crée ? Edited March 19, 2015 by Krapoutchniek (see edit history) Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now