Jump to content

Créer un module en mode Back-office


Recommended Posts

Bonjour,

 

J'ai en charge la mise en place d'un site web de 30 000 références. J'ai décidé de la faire à l'aide de prestashop, avec lequel je débute (mais qui me semble très bien ;-) ).

 

Dans un premier temps je souhaiterai créer un module qui va importer un fichier XML sur mesure contenant mes 30 000 produits et de mon arborescence (plus tard je mettrai les caractéristiques, les prix...).

 

Mais pour l'instant je bloque sur la création du module dans la partie back-office. J'ai créé un dossier "import" (nom de mon module) contenant le fichier "import.php" et la class Import (class GpImport extends Module). j'ai réussi à mettre un nouvel onglet dans le menu "Administration" qui m'ouvre une nouvelle page dans le back office (avec l'entête, le pied de page, les menus...mais le contenu blanc).

 

class GpImport extends Module {
	public function __construct() {
			$this->name = 'import';
			$this->tab = 'front_office_features';
			$this->version = '1.0';
			$this->author = 'mon nom';
			$this->displayName = $this->l('importation XML');
			$this->description = $this->l('Test module import');
			parent::__construct();
			}
public function install()
			{
			if(
					!parent::install()
					|| !$this->installModuleTab('AdminImport', array(1=>'Importation', 2=>'Importation'),17)
					)
			return false;
			return true;
			}
public function installModuleTab($tabClass, $tabName, $idTabParent)
			{
			@copy(_PS_MODULE_DIR_.$this->name.'/logo.gif', _PS_IMG_DIR_.'t/'.$tabClass.'.gif');
			$tab = new Tab();
			$tab->name = $tabName;
			$tab->class_name = $tabClass;
			$tab->module = $this->name;
			$tab->id_parent = $idTabParent;
			if(!$tab->save())
			  return false;
			return true;
			}
	public function uninstallModuleTab($tabClass)
			{
			$idTab = Tab::getIdFromClassName($tabClass);
			if($idTab != 0)
					{
					$tab = new Tab($idTab);
					$tab->delete();
					return true;
					}
			return false;
			}
	public function uninstall()
			{
			  if(!parent::uninstall()
			|| !Configuration::deleteByName('MOD_TUTORIAL_IMG')
			|| !$this->uninstallModuleTab('AdminImport')
					)
					return false;
			return true;
			}
}

 

1) Le premier problème, c'est que mon nouvelle onglet affiche le texte "AdminImport" (nom de ma class) et non pas "Importation" (voir fonction install()). Mais ça encore ce n'est pas bloquant.

 

2) Le deuxième problème c'est que quand je clique sur mon module avec le noueau lien créé (Back-office => Administration => bouton "AdminImport", je n'arrive pas à mettre du code HTML dans ma nouvelle page. J'ai pourtant bien créé une page nommé "AdminImport.php" avec le code :

<?php
class AdminGpImport extends ModuleAdminController {

	public function __construct() {

			parent::__construct();
			}
}

 

Mais je ne vois pas comment mettre le texte "Veuillez sélectionner le fichier XML à importer" avec un formulaire de sélection de fichier.

 

J'ai essayé d'utiliser les HOOK mais je ne vois pas comment accrocher une page .php dans cette nouvelle page ?

 

Si quelqu'un connait la solution ça serait sympa de m'aiguiller. C'est peut-être une question bête mais je n'ai pas encore tous les outils pour bien comprendre le fonctionnement de prestashop. Surtout que j'ai la toute dernier version (1.5) et d'après la doc il y a des modifs au niveau des HOOK.

 

Merci d'avance ;-)

Link to comment
Share on other sites

Salut Guillaume, merci pour ton aide ;-)

 

Apparement depuis la version 1.5 y a une méthode précise pour gérer les controlleur, j'ai trouvé mon bonheur ici :

 

https://github.com/prestarocket/prcustomeropinion

 

;-)

 

Par contre j'affiche des informations dans ma page avec des "view helpers" :

 

public function __construct() {

  $this->table   = 'opinion';
  $this->className  = 'Opinion';

 parent :: __construct();

 $this->fields_list = array(
  'id_opinion' => array(
   'title'  => '#'
  ),
  'id_customer' => array(
   'title'  => $this->module->l('Customer'),
   'callback'  => 'getCustomerName'
  ),
  'opinion' => array(
   'title'  => $this->module->l('Opinion')
  ),
  'active' => array(
   'title'  => $this->module->l('Valider'),
   'active'  => 'status'
  )
 );

 $this->actions = array('delete');

}

 

Mais je n'ai pas encore trouvé comment afficher simplement un texte html (par exemple <b>bonjour</b>).

 

Merci pour votre aide, ça avance ;-)

Link to comment
Share on other sites

A priori vous êtes en 1.5 c'est ça ?

Pour m'être déjà penché sur la création de modules 1.5 je peux vous dire que la démarche est globalement la même que pour la 1.4.

 

Aussi procédez étape par étape. En suivant le tutoriel que je vous ai apporté (merci Julien B.) vous devriez trouver votre bonheur, et comprendre son fonctionnement pour ensuite l'appliquer à votre cas.

 

;)

Link to comment
Share on other sites

Bonjour,

 

Merci pour votre aide.

 

Le tutorial du "canvas de module" est génial, il m'a permis de confirmer ce que j'avais compris en grapillant des informations à gauche à droite pendant 2 jours ;-)

 

Par contre je ne vois toujours pas comment afficher un texte tout simple dans mon controller dans le back office (je débute dans prestashop, je n'ai pas encore tout saisi, mais je continu, ça permet d'apprendre ;-) ).

 

J'ai utilisé la méthode de julien breux mais çe me fait planter l'affichage, j'ai l'impression que ce n'est pas compatible avec la 1.5. Je ne vois pas comment afficher un texte tout simple sans utiliser les "help viewer". J'ai aussi essayé de donner le chemin d'un templete, mais ça ne marche pas. Vous faites comment vous pour afficher un simple texte dans un contrôleur ? J'ai ouvert le controller de base "AdminImportControler.php" mais malgrés mes connaissance de PHP et POO c'est encore très flou.

 

En tout cas merci pour votre aide précieuse ;-)

Link to comment
Share on other sites

Je cherche à faire un formulaire dans lequel l'utilisateur pourra choisir un fichier (bouton parcourir) puis un bouton "importer" permettra d'importer le fichier XML choisi et de le traiter (mise à jour de la base de données de l'arbo, des produits, des caractéristiques...).

Link to comment
Share on other sites

  • 3 months later...

Salut !

Je cherchais à peu près à faire la même chose, donc je complète ce topic, ça peut toujours aider !

Mon but était d'utiliser renderForm(), mais en personnalisant totalement le tpl (Pour pouvoir faire tout ce que je veux dedans). Un simple override local de l'helper montrant assez vite ses limites, et pas forcément agréable à utiliser. donc :

 

dans renderForm() :

$this->context->smarty->assign('maVariable', $ma_variable);
/* test.tpl se trouve dans : 'MonModule/views/templates/admin/' */
$chemin = $this->getTemplatePath().'test.tpl';
$this->content = $this->createTemplate($chemin)->fetch();
return parent::renderForm();

 

En espérant que ça puisse être utile. C'est un peu plus propre et surtout plus commode que de mettre le html à afficher directement dans le controller ($html = '...'), où on se retrouve vite perdu ! ;)

Edited by Zulian (see edit history)
  • Like 1
Link to comment
Share on other sites

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...