roillion Posted August 20, 2014 Share Posted August 20, 2014 Salut tous le monde Je galère pour ajouter tout simplement un onglet et du contenu dans celui ci dans le BO de prestashop. Voici le début de la fonction install() de mon module qui m'ajoute bien un onglet dans ma partie admin. public function install() { $parent_tab = new Tab(); // Need a foreach for the language $parent_tab->name[$this->context->language->id] = $this->l('Evenements'); $parent_tab->class_name = 'AdminMyModule'; //Id 0 car il s'agit d'un onglet parent $parent_tab->id_parent = 0; // Home tab $parent_tab->module = $this->name; $parent_tab->add(); $tab->module = $this->name; if (Shop::isFeatureActive()) Shop::setContext(Shop::CONTEXT_ALL); Quand je clic dessus j'ai un message comme quoi je n'ai pas de controleur. J'ai donc mis ce code : \controllers\admin AdminMyModule.php <?php class AdminMyModuleController extends ModuleAdminController { public function __construct() { parent::__construct(); $this->context->smarty->assign( array( 'my_module_message' => $this->l('This is a simple text message') ) ); return $this->display(__FILE__, 'AdminMyModule.tpl'); } } ?> \views\templates\admin AdminMyModule.tpl HEYY! <h2>HOOHOOO</h2> Mais là, il je n'ai qu'une page toute blanche !! Et si j'enlève la ligne return $this->display(__FILE__, 'AdminMyModule.tpl'); j'ai juste un onglet vide. Une idée ?? Un grand merci d'avance !! Link to comment Share on other sites More sharing options...
Eolia Posted August 21, 2014 Share Posted August 21, 2014 Salut tous le monde Je galère pour ajouter tout simplement un onglet et du contenu dans celui ci dans le BO de prestashop. Voici le début de la fonction install() de mon module qui m'ajoute bien un onglet dans ma partie admin. public function install() { $parent_tab = new Tab(); // Need a foreach for the language $parent_tab->name[$this->context->language->id] = $this->l('Evenements'); $parent_tab->class_name = 'AdminMyModule'; //Id 0 car il s'agit d'un onglet parent $parent_tab->id_parent = 0; // Home tab $parent_tab->module = $this->name; $parent_tab->add(); $tab->module = $this->name; if (Shop::isFeatureActive()) Shop::setContext(Shop::CONTEXT_ALL); Quand je clic dessus j'ai un message comme quoi je n'ai pas de controleur. J'ai donc mis ce code : \controllers\admin AdminMyModule.php <?php class AdminMyModuleController extends ModuleAdminController { public function __construct() { parent::__construct(); $this->context->smarty->assign( array( 'my_module_message' => $this->l('This is a simple text message') ) ); return $this->display(__FILE__, 'AdminMyModule.tpl'); } } ?> \views\templates\admin AdminMyModule.tpl HEYY! <h2>HOOHOOO</h2> Mais là, il je n'ai qu'une page toute blanche !! Et si j'enlève la ligne return $this->display(__FILE__, 'AdminMyModule.tpl'); j'ai juste un onglet vide. Une idée ?? Un grand merci d'avance !! Vous avez regardé la classe ModuleAdminController ? public function createTemplate($tpl_name) { if (file_exists(_PS_THEME_DIR_.'modules/'.$this->module->name.'/views/templates/admin/'.$tpl_name) && $this->viewAccess()) return $this->context->smarty->createTemplate(_PS_THEME_DIR_.'modules/'.$this->module->name.'/views/templates/admin/'.$tpl_name, $this->context->smarty); elseif (file_exists($this->getTemplatePath().$this->override_folder.$tpl_name) && $this->viewAccess()) return $this->context->smarty->createTemplate($this->getTemplatePath().$this->override_folder.$tpl_name, $this->context->smarty); return parent::createTemplate($tpl_name); } /** * Get path to back office templates for the module * * @return string */ public function getTemplatePath() { return _PS_MODULE_DIR_.$this->module->name.'/views/templates/admin/'; } Donc créez votre template dans votre_module/views/templates/admin/ et utlisez $this->createTemplate('AdminMyModule.tpl') Link to comment Share on other sites More sharing options...
Eolia Posted August 21, 2014 Share Posted August 21, 2014 Edit: Si vous voulez juste que l'onglet renvoie vers la page de config de votre module: class MyModuleController extends AdminController { public function __construct() { parent::__construct(); $this->lang = false; $this->context = Context::getContext(); Tools::redirectAdmin('index.php?controller=AdminModules&token='.Tools::getAdminTokenLite('AdminModules').'&configure=mymodule&tab_module=content_management&module_name=mymodule'); } } Link to comment Share on other sites More sharing options...
roillion Posted August 21, 2014 Author Share Posted August 21, 2014 Merci de votre réponse !! J'ai effectivement pas encore le réflexe d'aller voir la classe mère. Merci de ce conseil ! La redirection marche très bien mais ce n'est pas ce que je cherche. Votre premier message est parfait Cependant le fichier TPL n'est toujours pas lié. J'ai juste mis ce code dans mon controleur : <?php class AdminMyModuleController extends ModuleAdminController { public function __construct() { parent::__construct(); $this->createTemplate('AdminMyModule.tpl'); } } ?> Et je vous ai mis l'emplacement en capture d'écran de mes 2 fichiers. Normalement ils sont bons. Je ne vois pas pourquoi rien ne s'affiche. Une idée ? Encore merci d'avance Eolia !! Link to comment Share on other sites More sharing options...
Eolia Posted August 21, 2014 Share Posted August 21, 2014 (edited) En fait c'est normal comme cela, car tu dois utiliser renderview et renderform si tu veux voir quelquechose. Les onglets de l'admin cherchent des templates de l'admin. Donc soit tu copies ton tpl à la racine de ton thème admin,soit tu utilises les renders. Un code qui marche mais qui n'est pas vraiment dans la logique Presta: <?php class AdminMyModuleController extends AdminController { public function initContent() { $this->display = 'view'; return parent::initContent(); } public function renderView() { $content = $this->displayTpl(); return parent::renderView().$content; } public function initToolbarTitle() { $this->toolbar_title = array_unique($this->breadcrumbs); } public function displayTpl() { $tpl = $this->context->smarty->createTemplate(_PS_MODULE_DIR_.'mymodule/views/admin/AdminMyModule.tpl'); $tpl->assign(array( 'test' => 'test', )); return $tpl->fetch(); } } ?> Edited August 21, 2014 by Eolia (see edit history) 1 Link to comment Share on other sites More sharing options...
roillion Posted August 21, 2014 Author Share Posted August 21, 2014 Au top !! Tu gères !! Je précise que c'est mymodule/views/templates/admin/AdminMyModule.tpl pour les suivants Je profite de ta bonté et de ton savoir-faire pour te demander 2 choses : 1) Est ce que la méthode de création de l'onglet et la meilleurs ? (Facilement adaptable pour les sous-onglets par exemple ?) 2) Sais-tu désinstaller un onglet si on supprime le module. Il y a une méthode ou il faut taper comme une brute dans la BDD ? Encore merci pour ta solution et pour tes réponses !! Link to comment Share on other sites More sharing options...
Eolia Posted August 21, 2014 Share Posted August 21, 2014 Bon c'est mon jour de bonté <?php class Mymodule extends Module { public function __construct() { global $currentIndex; $this->name = 'mymodule'; $this->tab = 'others'; $this->version = '1.0'; $this->author = 'Eolia'; parent::__construct(); $this->displayName = $this->l('My Module'); $this->description = $this->l('Test for creating module with admin tabs'); $this->confirmUninstall = $this->l('Are you sure you will delete this wonderful module ?'); $this->context = Context::getContext(); } public function install() { // Install Tabs $parent_tab = new Tab(); $parent_tab->name[$this->context->language->id] = $this->displayName; $parent_tab->class_name = 'AdminMainMyModule'; $parent_tab->id_parent = 0; // Home tab $parent_tab->module = $this->name; $parent_tab->add(); $tab = new Tab(); $tab->name[$this->context->language->id] = $this->l('Sub menu'); $tab->class_name = 'AdminMyModule'; $tab->id_parent = $parent_tab->id; $tab->module = $this->name; $tab->add(); if( !parent::install()) return false; return true; } public function uninstall() { // Uninstall Tabs $id_tabs = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS("SELECT id_tab FROM `"._DB_PREFIX_."tab` WHERE `module` = '".$this->name."'"); foreach ($id_tabs as $id_tab) { $tab = new Tab((int)$id_tab['id_tab']); $tab->delete(); } // Uninstall Module if (!parent::uninstall()) return false; return true; } } Après, l'histoire des onglets c'est un choix, mais il plus simple de se greffer sur une catégorie existante. En effet Presta est fait pour ça et les méthodes sont adaptées aux modules. Si te greffes dans l'admin il faut qu'il y ait une raison... Rien ne t'empêche ensuite de créer des onglets en jquery au sein de ton module 1 Link to comment Share on other sites More sharing options...
roillion Posted August 22, 2014 Author Share Posted August 22, 2014 Un grand merci Eolia !! Tu es au top !! Link to comment Share on other sites More sharing options...
roillion Posted August 22, 2014 Author Share Posted August 22, 2014 Bon puisque c'est ton jour de bonté je vais en abuser J'espère que ca va pas polluer le début du topic mais je me lance : Comment je fais pour rajouter dans mon controller un renderForm associé à mon template ? Donc d'utiliser mon template AdminMyModule.tpl et de rajouter à un endroit précis un tableau regroupant des données d'une table (un peu comme le tableau des produits mais en plus simple) Il faut redéfinir form.tpl si j'ai bien compris mais cette variable n'existe plus dans mon controller :$this->name... Bref je suis un peu perdu... Il y a un sujet pas mal sur le forum mais je suis quand même complétement pommé. C'est la première fois que je me lance dans les renderForm() parce que ca ) l'air cool Sur le sujet il conseil de rajouter ça et d'overider mon TPL en plaçant dans views/templates/admin/NOM_DE_LA_TABLE/helpers/form/form.tpl avec NOM_DE_LA_TABLE = $this->table du constructeur de ton ModuleAdminController $helper->base_folder = 'helpers/form/'; //Indique le chemin vers le dossier contenant ton tpl $helper->base_tpl = 'form.tpl'; //Indique le nom de ton tpl Mais il utilise la fonction createTemplate () : $tpl = $this->createTemplate('form_several_images.tpl'); Bref je suis perdu et je vois pas comment ajouter un renderForm() au .tpl que tu as déjà réussi à lier au controller. Encore un grand merci d'avance pour toutes tes solutions !! Link to comment Share on other sites More sharing options...
Eolia Posted August 22, 2014 Share Posted August 22, 2014 Ben si tu utilises les helpers et renders tu n'as plus besoin de ma modif Tu écris ta fonction renderview et renderform et tu lui associes ton tpl $helper->base_folder = _PS_MODULE_DIR_ . 'mymodule/views/admin/templates/'; //Indique le chemin vers le dossier contenant ton tpl $helper->base_tpl = 'AdminMyModule.tpl'; //Indique le nom de ton tpl Link to comment Share on other sites More sharing options...
roillion Posted August 22, 2014 Author Share Posted August 22, 2014 Ouai mais on peut pas faire les 2 en même temps ? Link to comment Share on other sites More sharing options...
Eolia Posted August 22, 2014 Share Posted August 22, 2014 Je ne vois pas l'intéret de charger 2 fois le même template ? Link to comment Share on other sites More sharing options...
roillion Posted August 22, 2014 Author Share Posted August 22, 2014 J'ai peut-être pas bien compris ce qu'on pouvais faire avec les renders... On peut envoyer des variables en plus des renders dans un template ? Link to comment Share on other sites More sharing options...
Eolia Posted August 23, 2014 Share Posted August 23, 2014 Avec les renders et helpers tu remplis ta vue, ensuite tu traites les éléments récupérés avec tes propres fonctions getContent() ou autres Link to comment Share on other sites More sharing options...
roillion Posted August 23, 2014 Author Share Posted August 23, 2014 Ok. Imaginons que je veuille mettre un modal bootstrap dans ma view. C'est pas un peu dégeu de faire ca avec les renders et helpers ? Link to comment Share on other sites More sharing options...
Eolia Posted August 23, 2014 Share Posted August 23, 2014 Ben non c'est fait pour ça: 'input' => array( array( 'type' => 'text', 'label' => $this->l('Minimum number of products :'), 'name' => 'product_length', 'desc' => $this->l('Minimal products required for all activated shop'), 'align' => 'text-center', 'class' => 'fixed-width-xs', 'required' => true ), Vous assignez vos classes ou vos styles imbriqués Link to comment Share on other sites More sharing options...
roillion Posted August 23, 2014 Author Share Posted August 23, 2014 Ouai mais un modal sous boostrap ca ressemble à ca : <!-- Button trigger modal --> <button class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal"> Launch demo modal </button> <!-- Modal --> <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span class="sr-only">Close</span></button> <h4 class="modal-title" id="myModalLabel">Modal title</h4> </div> <div class="modal-body"> ... </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> <button type="button" class="btn btn-primary">Save changes</button> </div> </div> </div> </div> On est foutu là non ? ^^ 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