Création d'un module: Backend

ilune_fr > Contao - Typolight > Découverte de Contao > Création d'un module: Backend

Création d'un module dans le Backend

Généralités

Un module backend est lié à une page dans le menu. Il est appelé via la méthode get ($_GET['do']). Un seul module de Backend est donc chargé à la fois.

backend->getBackendModule($module);

==> Retourne le code HTML du module à afficher

La plupart du temps, le backend du module ne consiste qu'en un DataContainer (DCA = conteneur de données générant un forumulaire dans le backend) dans lequel on renseigne les entrées d'un élément à afficher dans le frontend, ou des options de configuration.

Définition du module dans le fichier config/config.php

Pour définir le nouveau module, on doit créer un fichier config.php dans le repertoire /config.

Il faudra se poser la question où sera affiché le module dans le menu du backend. Le groupe d'élément dans lequel vous placerez votre module sera remplacé par {arrGroup} pour un soucis de simplicité. Le nom que vous donnerez à votre module sera appelé {name_module}.

Vous trouverez les différents groupes (parties=> {arrGroup}) dans lequel vous pourrez placer votre module en regardant l'article sur la constitution de la variable $GLOBALS. Vous pouvez également choisir de reprendre un DCA déjà existant (un formulaire en fait), pour juste y rajouter des options (voir la page sur les DCA, et notamment les DCA prédéfinis)

Une fois ces éléments définis et le fichier config.php créé, vous devez y renseigner les paramètres généraux du module (cf paragraphe suivant).

Paramètres globaux du module Backend

Les paramètres globaux du module Backend, doivent être renseignés dans le fichier config/config.php

Feuille de style:

$GLOBALS['BE_MOD'][{arr_group}][{name_module}]['stylesheet']

Javascript

$GLOBALS['BE_MOD'][{arr_group}][{name_module}]['javascript']

Callback

$GLOBALS['BE_MOD'][{arr_group}][{name_module}]['callback']
(Voir le paragraphe sur la méthode par callback)

Icon

$GLOBALS['BE_MOD'][{arr_group}][{name_module}]['icon'] = "Chemin vers une icone du module"

Tables (DCA)

$GLOBALS['BE_MOD'][{arr_group}][{name_module}]['tables'] = {liste des DCA}
Voir le paragraphe suivant 

Repertorier les DCA liés au module

Pour avertir le système des DCA qu'il devra charger, on doit les lister dans ce tableau:

$GLOBALS['BE_MOD'][{arr_group}][{name_module}]['tables'][{num}] = "{Nom_DCA}"

(Voir page sur les DCA)

Exemple de déclaration dans config.php

$GLOBALS['BE_MOD']['content']['{name_module}'] = array
(
	'tables' => array('file_dca1','file_dca2'),
	'icon' => 'system/modules/*/*.gif'
	'stylesheet' => 'system/modules/*/*.css'
);

Les fichiers de langues

Pour définir le nom du module selon la langue, vous devrez renseigner son nom dans les fichiers langages présents du fichier /languages/[fr-en-de...]/modules.php:

$GLOBALS['TL_LANG']['MOD'][{nom_module}] = array("nom","description");

Méthode par DCA seulement

Pour la méthode avec seulement un DCA (donc où vous n'avez besoin que de renseigner des données), vous avez presque terminé votre module.

Vous devez créer un répertoire /dca, et créer un fichier où vous renseignerez les paramètres de votre DCA (que vous aurez déclaré dans le fichier config.php=> voir plus haut).

Prise en charge TOTALE du backend par la méthode callback

La méthode callback, consiste à définir une classe qui se chargera de gérer l'affichage du backend de façon indépendante.

Définition

Dans $GLOBALS['BE_MOD'][{arr_group}][{name_module}]['callback'] on renseigne le nom du fichier (sans le .php) à charger pour gérer le module (si le module se substitue totalement au système).

Construction de la classe appelée lors du callback

Notre classe devra avoir une méthode __construct(), qui prendra en argument un objet de type DataContainer:

public function __construct(DataContainer $objDc = null)
{

}

Le data container ($objDc dans le code), est un objet du type que vous aurez indiqué dans $GLOBALS['TL_DCA'][$strTable]['config']['dataContainer'] précédé de "DC_" donc soit:

  • DC_File
  • DC_Folder
  • DC_Table

==>N'hésitez pas à jeter un coup d'oeil au dossier system/drivers pour plus d'information et regarder les autres existants !
==>L'objet $objDc hérite de la classe DataContainer (polymorphisme) et implémente "listable" et "editable"
==>La classe DataContainer dispose de méthodes de compilation des formulaires à partir des DCA !

Enfin notre classe devra posséder une méthode generate(); qui retournera le code HTML affiché dans le backend, et une méthode compile(); qui retournera le code affiché dans le frontend (souvent rien du tout puisque la classe n'est sencé gérer que le backend).

Exemple de classe

class maclasse extends BackendModule
{
	public function __construct(DataContainer $objDc = null)
	{
		$this->objDc = $objDc;
	}
	function compile()
	{
	}
	function generate()
	{
		$dc = &$this->objDc;
		($dc instanceof DataContainer);
		//recuperation de $_GET['act'];
		$act = $dc->Input->get('act');
		if (!strlen($act) || $act == 'paste' || $act == 'select')
		{
			$act = ($dc instanceof listable) ? 'showAll' : 'edit';
		}
		//retourne le résultat de l'execution du DCA (par la méthode transmise par le get)
		return $dc->$act();
	}
}

Ce code vous fera obtenir le même résultat, que si vous n'utilisiez que les DCA dans le backend.

A vous d'y rajouter votre propre code, si vous souhaitez par exemple faire afficher le formulaire obtenu par les dataContainer ainsi que votre propre code, ou si vous souhaitez executer votre propre code avec son propre affichage.


  Cet article est sous licence LGPL, vous pouvez le modifier, le copier et le publier, mais en signalant son auteur d'origine. ( http://www.ilune.fr )