Customisation du fonctionnement des types dans le back-office
Un article de ReaxiaWiki.
Sommaire |
Introduction
Il est possible de customiser l'affichage de l'éditeur du contenu d'un type donné.
Chaque type de contenu peut bénéficier aussi d'un traitement particulier à l'aide de fonctions Hook executées lors d'événements prédéfinis, comme par exemple lors de la sauvegarde des modifications d'un enregistrement.
Principe Généraux
Les fichiers de customisation sont placés dans un dossier par type de contenu customisé.
Ces dossiers, dont le nom est un GUID*, sont placés eux-mêmes dans le dossier mon_site/reaxia_lib/_type_templates/
Le lien entre un type et son GUID peut être fait en consultant la table reaxia_types dans la base de données
* Le GUID (Globally Unique Identifier) sera un identifiant unique de 32 caractères (128 bits), suivant l'exemple:
008FD5DD-6DBB-48E3-991B-2D3ED658516A
Dans chaque dossier GUID on trouvera au minimum un fichier manifest.php puis, si il y en a, les fichiers des templates d'édition.
Le fichier manifest.php contiendra les définitions de chaque onglet de page d'édition et les fonctions Hook.
Exemple de structure de fichiers :
Au minimum : mon_site/reaxia_lib/_type_templates/008FD5DD-6DBB-48e3-991B-2D3ED658516A/ mon_site/reaxia_lib/_type_templates/008FD5DD-6DBB-48e3-991B-2D3ED658516A/manifest.php
Avec des templates : mon_site/reaxia_lib/_type_templates/008FD5DD-6DBB-48e3-991B-2D3ED658516A/template_d_edition_01.html mon_site/reaxia_lib/_type_templates/008FD5DD-6DBB-48e3-991B-2D3ED658516A/template_d_edition_01.css mon_site/reaxia_lib/_type_templates/008FD5DD-6DBB-48e3-991B-2D3ED658516A/image_01.gif mon_site/reaxia_lib/_type_templates/008FD5DD-6DBB-48e3-991B-2D3ED658516A/...
Fonctions Hook
Introduction
Les fonctions Hook sont des fonctions qui s'éxécutent lors d'évènements prédéfinis pour un certain type de contenu donné.
Ces évènements peuvent être, par exemple, le fait de sauvegarder un enregistrement.
Principe
A certains endroits, dans le code de l'administration de Reaxia, on peut ajouter une fonctionnalité pour capturer un évènement et exécuter une fonction particulière.
Par exemple, on a intégré dans Reaxia la capture de l'évènement 'on save' qui est déclenchée lors de chaque sauvegarde d'un enregistrement. Lors de la sauvegarde d'un évènement, Reaxia va appeller la fonction Hook correspondante, si elle existe pour le type de contenu concerné.
Mise en oeuvre
- Les fonctions Hook sont écrites et déclarées dans le fichier manifest.php selon la syntaxe :
$GLOBALS['Types Editors']['008654DD-6DBB-48e3-991B-2D3EDFG8516A']['Hooks']['OnSave'] = 'IWasSavedNow';
- OnSave est le nom de l'évènement déclencheur de la fonction Hook.
- 111FD5DD-6DBB-48e3-99EB-2D3ED658516B sera remplacé par le GUID correspondant au type de contenu personnalisé.
- IWasSavedNow est le nom de la fonction appellée par le déclenchement de l'évènement.
Cette fonction est définie plus bas dans le fichier manifest.php.
Exemple de fonction Hook déclarée dans le manifest.php
function IWasSavedNow($aBlocBeforeSave, $RawPostData) { // do any stuff you might want // return false prevents the record from being saved ! return true; }
Ici, l'évènement OnSave est intégré dans Reaxia qui, lors de chaque sauvegarde, va vérifier l'existence d'une fonction Hook OnSave pour le type de contenu concerné.
Personnalisation de l'affichage de l'éditeur
Introduction
Lorsque l'on édite le contenu d'un enregistrement donné, l'affichage par défaut liste tous les éditeurs des champs du type correspondant dans une seule page.
En répartissant les éditeurs sur plusieurs pages accessibles par des onglets, il est possible de personnaliser cet affichage de deux manières :
- En listant les editeurs à afficher sur une page donnée.
- En définissant des thèmes graphiques, avec une mise en page totalement personnalisée.
Il est possible de définir et d'utiliser les deux types d'onglets en même temps.
Principe
Les onglets seront définis dans le fichier manifest.php.
Pour regrouper une partie des editeurs dans des onglets
Chaque onglet qui affichera une liste d'éditeurs sera déclaré de la manière suivante dans le fichier manifest.php :
$GLOBALS['Types Editors']['111FD5DD-6DBB-48e3-99EB-2D3ED658516B']['Tabs'][] =
array('tab_name' => 'Champs listés',
'tab_fields' => array( 'single_line_1', 'paragraph_1', 'yesno_1', 'date_1'));
- tab_name correspond au nom de l'onglet affiché.
- La table tab_fields contient les noms de tous les champs dont les éditeurs seront affiché pour cet onglet.
- 111FD5DD-6DBB-48e3-99EB-2D3ED658516B sera remplacé par le GUID correspondant au type de contenu personnalisé.
Il est possible de définir ainsi plusieurs onglets à la suite dans le fichier manifest.php.
Les champs sont affichés dans l'ordre dans lequel ils sont déclarés dans le tableau 'tab_fileds'.
Il est possible de spécifier un paramètres pour les champs paragraphes pour qu'ils utilisent le système d'édition multipage :
$GLOBALS['Types Editors']['111FD5DD-6DBB-48e3-99EB-2D3ED658516B']['Tabs'][] =
array('tab_name' => 'Champ multipage',
'tab_fields' => array('single_line_1', 'single_line_2', 'paragraph_1'),
'fields_options' => array('paragraph_1' => array('multipage')));
Ainsi, cet onglet affichera tous les champs indiqués dans 'tab_fields', dans l'ordre dans lequels ils sont déclarés, et le champ paragraph_1, redéclaré, dont l'options 'fields_options' est 'multipage' sera affiché avec le système dédition multipages.
Pour utiliser des templates graphiques
Chaque onglet qui affichera des éditeurs dans un template graphique sera déclaré de la manière suivante dans le fichier
$GLOBALS['Types Editors']['008FD5DD-6DBB-48e3-991B-2D3ED658516A']['Tabs'][] =
array('tab_name' => 'Champs mis en page',
'tab_template' => 'template_d_edition_01.html');
- tab_name correspond au nom de l'onglet affiché.
- tab_template correspond au nom du fichier du template graphique placé dans le même dossier que le manifest.php.
- 111FD5DD-6DBB-48e3-99EB-2D3ED658516B sera remplacé par le GUID correspondant au type de contenu personnalisé.
Il est possible d'utiliser des images, css, ect, dans les fichier templates en utilisant la syntaxe suivante pour conserver des liens valides :
<img src="<?=GetTypeTemplateURL() ?>myImage.gif">
Il est possible de définir ainsi plusieurs onglets à la suite dans le fichier manifest.php et de les mélanger avec les onglets définis précédemment.
Exemples
fichier manifest.php
<?php
// Onglet défini par des templates :
$GLOBALS['Types Editors']['111FD5DD-6DBB-48e3-99EB-2D3ED658516B']['Tabs'][] = array('tab_name' => 'Champs mis en page', 'tab_template' => 'template_d_edition_01.html');
// Onglet défini par une liste de champs à afficher:
$GLOBALS['Types Editors']['111FD5DD-6DBB-48e3-99EB-2D3ED658516B']['Tabs'][] = array('tab_name' => 'Champs listés', 'tab_fields' => array('single_line_1', 'paragraph_1', 'yesno_1', 'date_1'));
// Onglet qui liste tous les champs existants sauf ceux déclarés dans la table tab_fields_excluding :
$GLOBALS['Types Editors']['008FD5DD-6DBB-48e3-991B-2D3ED658516A']['Tabs'][] = array('tab_name' => 'Données complémentaires', 'tab_fields_excluding' => array('single_line_25', 'single_line_26', 'paragraph_10'));
$GLOBALS['Types Editors']['111FD5DD-6DBB-48e3-99EB-2D3ED658516B']['Tabs'][] = array('tab_name' => 'Champs Vide', 'tab_fields' => array());
// Déclaration de la capture de l'évènement OnSave faisant appel à la fonction Hook IWasSavedNow
$GLOBALS['Types Editors']['111FD5DD-6DBB-48e3-99EB-2D3ED658516B']['Hooks']['OnSave'] = 'IWasSavedNow';
// Déclaration de la fonction Hook IWasSavedNow
function IWasSavedNow($aBlocBeforeSave, $RawPostData) { // Do any stuff you might want
// Exemple : Send an email if some value has changed...
// Return false prevents the record from being saved ! return true; }
?>
Un template : template_d_edition_01.html
Template avec des mots clés :
<table border="0" cellspacing="0" cellpadding="10" width="100%">
<tr>
<td>single_line_1: </td>
<td>{{single_line_1}}</td>
</tr>
<tr>
<td>paragraph_1 : </td>
<td>{{paragraph_1}}</td>
</tr>
<tr>
<td>paragraph_2 100px: </td>
<td>{{paragraph_2|100px}}</td>
</tr>
</table>
