Jump to content

Menu backoffice


Recommended Posts

Bonjour,

 

je me tourne vers ou en ce jour funeste car ni la "doc" (noté les guillemets), ni google n'ont été en mesure de me donner une réponse (Ou du moins un début d'élément de réponse) plaisante :x .

 

Je travaille en ce moment sur des modules en 1.5.4.1. Pour me faciliter la vie, je voudrai rajouter une catégorie de menu en plus, avec peut-être des sous-menu, ou directement les modules.

Un exemple un peu plus concret :

- nouvel onglet/menu : Le juda'bricot menu

- Au passage de la souris plusieurs onglets/sous-menu :

* Custom module Header

* Custom module Footer

* etc

- Et dans les sous-menus : "un raccourci pour la page configuration du module"

 

Les documents les plus intéressants et pertinants que j'ai pu trouvé à ce sujet sortent de la doc 1.5, et mes interrogations se tournent vers l'input "Class". Je regarde comment dans quel état sont les menus déjà existants, et on leur à affecté pour la plupart une classe "AdminParentXXXX".

Bon déjà je suis déconcerté, je m'attendais à soit trouver une classe existante, soit un controller existant... Ou bien pour les menus/onglets, on leur associe juste une classe fictive et basta ?

 

Bon ensuite pour les modules en eux même, c'est déjà plus cohérent. L'input class pour le controller, et l'input module dans le cas où le controller se situe dans un module :) .

 

 

 

Donc premier constat, j'ai pas l'impression que l'on peut créer un système de sous-menu.

Créer un raccourci pour son module étouféfésableuh, malgrès le manque de doc ou d'API à ce sujet.

 

Le point qui me géne est donc cette classe fictive que j'ai mis pour créer mon nouvel onglet/menu...

Et bien entendu, tout est fait à la main... Je n'ai pas encore pigé si on pouvait l'ajouter nous même à l'installation du module (A fouiller du côté de la méthode ObjectModel::add).

 

Qu'en pensez-vous ?

 

Bien cordialement,

Juda.

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

Bonjour,

 

Rien de plus simple ? Depuis la 1.4, c'est à dire ? Si je regarde la doc 1.4 je remaque qu'il demandé de créer une nouvelle table dans la BD, puis de créer deux nouveau fichier directement dans les dossier "Core" de prestashop...

Peut-être suis-je dans un quiproquo et ne fais-tu que confirmer mes dires à propos de cette foutue classe fictive pour un onglet parent ?

 

Je t'avou que je n'ai pas pris le temps d'analyser la classe Tab (Juste vu en diagonale 2, 3 méthodes intéréssantes), et que pour l'instant je suis encore à l'aprentissage de la création d'onglet via l'interface du backoffice.

 

Pour reformulez la question : Pourquoi c'est écris "AdminParentXXX" (eg. AdminParentModule pour le menu modules), est-ce vraiment des classes fictives ?

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

Bonsoir Juda,

 

Il y a bien une classe fictive pour les onglets principaux. Et ce n'est pas spécialement gênant, puisqu'il n'est d'ailleurs pas possible de cliquer sur ce même onglet.

 

Concernant les sous-menus, tu dois faire référence à une classe réelle. Voici l'exemple que je donne personnellement:

// Install Tabs
$parent_tab = new Tab();
// Need a foreach for the language
$parent_tab->name[$this->context->language->id] = $this->l('Main Tab Example');
$parent_tab->class_name = 'AdminMainExample';
$parent_tab->id_parent = 0; // Home tab
$parent_tab->module = $this->name;
$parent_tab->add();

$tab = new Tab();
// Need a foreach for the language
$tab->name[$this->context->language->id] = $this->l('Tab Example');
$tab->class_name = 'AdminExample';
$tab->id_parent = $parent_tab->id;
$tab->module = $this->name;
$tab->add();

 

Et ceci se fait dans la méthode install() du module ;-)

  • Like 1
Link to comment
Share on other sites

Edit : @JDanse, c'est môche quand même cette histoire de classe fictive -_-

 

Yop du coup, j'ai eu un peu de temps ce matin. Je poste 2 petites méthodes (Private ;) ) tester sur prestashop 1.5.4.1

 

La première pour installer un nouvel onglet (par défaut dans le menu catalogue) et la deuxième pour la désinstaller.

tabClass correspond au controller admin (e.g. /controller/admin/adminCustom.php).

 

  /**
*
* @param string $tabClass
* @param string $tabName
* @param integer $idTabParent
* @return boolean
*/
private function installModuleTab($tabClass, $tabName, $idTabParent = 9) {	
	$tab = new Tab();

	foreach (Language::getLanguages(false) as $lang)
		$tab->name[$lang['id_lang']] = $this->l($tabName);

	$tab->class_name = $tabClass;
	$tab->id_parent = $idTabParent;
	$tab->module = $this->name;
	return $tab->add();
}

/**
 *
 * @param string $tabClass
 * @return boolean
 */
private function uninstallModuleTab($tabClass) {
	$idTab = Tab::getIdFromClassName($tabClass);
	if($idTab){
		$tab = new Tab($idTab);
		return $tab->delete();;
	}
	return false;
}

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

  • 2 weeks later...

Hmm j'étais aussi en train de me demander s'il existait un moyen de créer un onglet mais que le lien soit dirigé vers autres choses que le controllerAdmin ?

 

Un lien externe ou interne, comme l'accès rapide en faite mais dans les onglets ?... Oui en gros y'a longtemps j'ai codé un module 1.4 pour un ami, ça marche et tout, il peut accéder aux divers config' grâce au lien configuration dans les listes des modules. Et maintenant il aimerai juste pouvoir accéder au config' via un onglet.

 

C'est un fainéant... Mais moi aussi, j'ai aucune envie de me replonger dans mon code moche de l'époque (sans commentaires :3), ni envie de lui coder une classe admin.

 

Du coup j'ai rusé un peu : Quand je créé un nouveau menu, dans le champ classe j'ai glissé "AdminModules&configure=sliderdelamortquitue"... Et ça marche o/... Enfin je suis bel et bien redirigé vers le le lien de configuration excepté que j'ai un message "clé de sécurité non valable" du coup ^^'

Link to comment
Share on other sites

Hmmpf j'ai rien trouvé de très sensible sur ce problème... Et vu que je suis en pleine pause repas, j'ai opté pour la solution la plus simple qui me soit venu à l'esprit (ya 30 secondes). L'utilisation d'un header() o/ !

 

Dans mon controller Admin

   public function __construct() {
   /* Redirection vers une page différente du même dossier */
    $host  = $_SERVER['HTTP_HOST'];
    $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
    $extra = 'index.php?controller=AdminModules&token=xxxx&configure=sliderdelamortquitue';
    header("Location: http://$host$uri/$extra");
    exit;
   }

 

$extra est juste un copié/collé du lien configuration du module.

Link to comment
Share on other sites

  • 6 months later...

Hmm j'étais aussi en train de me demander s'il existait un moyen de créer un onglet mais que le lien soit dirigé vers autres choses que le controllerAdmin ?

 

Du coup j'ai rusé un peu : Quand je créé un nouveau menu, dans le champ classe j'ai glissé "AdminModules&configure=sliderdelamortquitue"... Et ça marche o/... Enfin je suis bel et bien redirigé vers le le lien de configuration excepté que j'ai un message "clé de sécurité non valable" du coup ^^'

 Je déterre un vieux sujet pour poster une astuce.

Vous pouvez créer un onglet ou sous-onglet pour rediriger vers l'équivalent de "configurer" pour un module. Cela évite de cliquer sur "modules", chercher le module correspondant puis cliquer sur "configurer".

 

Dans votre fichier principal mon_module.php utilisez la méthode suivante:

	public function install()
	{
		if (!parent::install() OR !$this->_blablabla)//dépend de votre install perso
			return false;
			
		//Installation de l'onglet:
		$tab = new Tab();
		$tab->class_name = 'AdminMonModule'; //la classe à créer
		$tab->id_parent = Tab::getIdFromClassName('AdminCatalog');//par exemple
		$tab->module = $this->name;
		$tab->name[(int)(Configuration::get('PS_LANG_DEFAULT'))] = $this->l('MonModule');
		if(!$tab->add())
			return false;
		Tools::redirectAdmin('index.php?controller=AdminModules&token='.Tools::getAdminTokenLite('AdminModules').'&configure=faq&tab_module=content_management&module_name=faq');
			return true;
	}

puis vous créez un petit fichier dans le répertoire controllers -> admin de votre module qui s'appelera AdminMonModule.php qui contiendra uniquement:

<?php

if (!defined('_PS_VERSION_'))
	exit;

class AdminFaqController extends AdminController
{
	public function __construct()
	{
		
		parent::__construct();	
		 	
		$this->lang = false;
		$this->context = Context::getContext();
		if(!Tools::redirectAdmin('index.php?controller=AdminModules&token='.Tools::getAdminTokenLite('AdminModules').'&configure=mon_module&tab_module=content_management&module_name=mon_module'))
			return false;
		return true;
	}
}
?>

Une simple direction, en fait :) Mais qui permet de conserver les avantages de la classe AdminController (autorisations, positions, etc....)

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

  • 5 years later...
On 3/1/2014 at 11:09 AM, Eolia said:

 Je déterre un vieux sujet pour poster une astuce.

Vous pouvez créer un onglet ou sous-onglet pour rediriger vers l'équivalent de "configurer" pour un module. Cela évite de cliquer sur "modules", chercher le module correspondant puis cliquer sur "configurer".

 

Dans votre fichier principal mon_module.php utilisez la méthode suivante:


	public function install()
	{
		if (!parent::install() OR !$this->_blablabla)//dépend de votre install perso
			return false;
			
		//Installation de l'onglet:
		$tab = new Tab();
		$tab->class_name = 'AdminMonModule'; //la classe à créer
		$tab->id_parent = Tab::getIdFromClassName('AdminCatalog');//par exemple
		$tab->module = $this->name;
		$tab->name[(int)(Configuration::get('PS_LANG_DEFAULT'))] = $this->l('MonModule');
		if(!$tab->add())
			return false;
		Tools::redirectAdmin('index.php?controller=AdminModules&token='.Tools::getAdminTokenLite('AdminModules').'&configure=faq&tab_module=content_management&module_name=faq');
			return true;
	}

puis vous créez un petit fichier dans le répertoire controllers -> admin de votre module qui s'appelera AdminMonModule.php qui contiendra uniquement:


<?php

if (!defined('_PS_VERSION_'))
	exit;

class AdminFaqController extends AdminController
{
	public function __construct()
	{
		
		parent::__construct();	
		 	
		$this->lang = false;
		$this->context = Context::getContext();
		if(!Tools::redirectAdmin('index.php?controller=AdminModules&token='.Tools::getAdminTokenLite('AdminModules').'&configure=mon_module&tab_module=content_management&module_name=mon_module'))
			return false;
		return true;
	}
}
?>

Une simple direction, en fait :) Mais qui permet de conserver les avantages de la classe AdminController (autorisations, positions, etc....)

Bonjour,

Est-ce que l'on peut faire cela sur une module déjà existant ?

Link to comment
Share on other sites

2 hours ago, Eolia said:

oui mais il faudra réinitialiser le module une fois la modification effectuée (risque de perte de données) ou créer le tab à la mano dans l'admin

Merci pour la réponse.

Dans le code, quand vous dites :

if (!parent::install() OR !$this->_blablabla)//dépend de votre install perso
			return false;

Est-ce qu'il faut remplacer le blablabla par quelque chose ?

Sinon en ajoutant dans Menus dans le backoffice ça peut fonctionner ?

 

Link to comment
Share on other sites

19 hours ago, Eolia said:

le blabla correspon au code existant de la fonction install() ^^

D'accord, je vais faire le test sur mon module existant sur ma boutique test pour ne pas perdre toutes les données. En attendant sur ma boutique en ligne j'ai mis un raccourci dans les accès rapides.

C'est plus clair comme ça.

Merci

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