Fiche
Niveau de difficulté : | Avoir de très bonnes bases. |
---|---|
Recommandations : | Aide à la création de plugins. |
A lire aussi : | [Exemple] Plugin "Event Cats" |
Inspirez vous de ce qui existe déjà. Regardez comment ont fait les autres simplement en regardant leurs plugins.
Dans les anciennes versions de Piwigo, il regorge encore beaucoup d'exemples !
Le principe de cette page est de décrire les façons de faire son plugin personnel pour y intégrer les modifications souhaitées sur son site qui ne peuvent pas l'être par la surcharge de la configuration ou la surcharge des css..
C'est à dire dans de très nombreux cas :
Conseil: Avant d'installer et d'activer un plugin public, contrôler qu'il n'utilise pas les techniques de la personnalisation par plugin (c'est à dire modification du template par substitution directe).
Dans cette page, on utilisera le terme “personal” pour désigner le plugin que l'on conçoit. Vous pouvez bien entendu modifier ce terme mais n'oubliez pas de le faire partout (nom répertoire, fichier, noms des fonctions, etc.)
<?php /* Plugin Name: Personal Version: 0.0.0.0 Description: It's your personal plugin / c'est votre plugin personnel Plugin URI: http://www.phpwebgallery.net Author: Moi, nous et vous Author URI: http://www.phpwebgallery.net */ ?>
Ce sont différentes méthodes applicables pour élaborer son plugin personnel.
Ajouter la fonction suivante dans votre fichier main.inc.php après l'en-tête :
/* Suppression d'une partie du code dans un template */ /* Code compris entre la chaine $str_begin et $str_end */ function personal_remove_tpl_code($tlp_handle, $str_begin, $str_end) { global $template; $template->loadfile($tlp_handle); $p_beg = strpos($template->uncompiled_code[$tlp_handle], $str_begin); $p_end = strpos($template->uncompiled_code[$tlp_handle], $str_end) + strlen($str_end); $s = substr($template->uncompiled_code[$tlp_handle], $p_beg, $p_end - $p_beg); $template->uncompiled_code[$tlp_handle] = substr_replace($template->uncompiled_code[$tlp_handle], '', $p_beg, $p_end - $p_beg); return $s; }
Le code supprimé est retourné par la fonction.
Ajouter la fonction suivante dans votre fichier main.inc.php après l'en-tête :
/* Ajout de code dans un template après la chaine $insert_after */ function personal_add_after_tpl_code($tlp_handle, $insert_after, $code) { global $template; $template->loadfile($tlp_handle); $template->uncompiled_code[$tlp_handle] = str_replace($insert_after, $insert_after.$code, $template->uncompiled_code[$tlp_handle]); }
Ajouter la fonction suivante dans votre fichier main.inc.php après l'en-tête :
/* Ajout de code dans un template avant la chaine $insert_before */ function personal_add_before_tpl_code($tlp_handle, $insert_before, $code) { global $template; $template->loadfile($tlp_handle); $template->uncompiled_code[$tlp_handle] = str_replace($insert_before, $code.$insert_before, $template->uncompiled_code[$tlp_handle]); }
Ajouter la fonction suivante dans votre fichier main.inc.php après l'en-tête :
/* Remplace une partie du code par une autre dans un template */ function personal_replace_tpl_code($tlp_handle, $old, $new) { global $template; $template->loadfile($tlp_handle); $template->uncompiled_code[$tlp_handle] = str_replace($old, $new, $template->uncompiled_code[$tlp_handle]); }
Permet de mettre le bouton filtre à côté des autres boutons disponibles et d'afficher à côté “Affichage”.
Ajouter le code suivant dans votre fichier main.inc.php après l'entête:
add_event_handler('loc_begin_menubar', 'personal_filter_button_move'); function personal_filter_button_move() { // Recupere le bout de code des boutons filtres $s = personal_remove_tpl_code('menubar', '<!-- BEGIN start_filter -->', '<!-- END stop_filter -->'); // Ajout le bout de code des boutons filtres //personal_add_after_tpl_code('index', '<!-- END mode_created -->', ' //<li>'.$s.'</li> //'); // Ajout le bout de code des boutons filtres avant le bouton order // Les retours à la ligne sont nécessaire pour le tpl fonctionne // Ajout de <li> necessaire et du texte language // La traduction est à ajouté dans les fichiers local.lang.php // Il existe un autre moyen d'ajouter des boutons mais cet exemple sert à montrer comment déplacer et modifier du code personal_add_before_tpl_code('index', '<!-- BEGIN preferred_image_order -->', ' <b>{lang:Display}</b> <li>'.$s.'</li> '); }
Cette astuce se retouve aussi dans la personnalisation de la branche 1.7
Permet d'avoir la case à cocher “Simuler uniquement” non coché par defaut.
Ajouter le code suivant dans votre fichier main.inc.php après l'en-tête :
add_event_handler('loc_begin_page_tail', 'personal_sync_not_simulate'); function personal_sync_not_simulate() { global $page, $template; if ( is_admin() and (script_basename() == 'admin') and ($page['page'] == 'site_update') ) { personal_add_after_tpl_code('tail', '</div> <!-- the_page -->', ' <script type="text/javascript"> document.getElementsByName("simulate")[0].checked = false; </script> ' ); } }
Cette astuce se retouve aussi dans la personnalisation de la branche 1.7
Il est bien entendu possible de fusionner les différentes fonctions des triggers entre elles.
Pour éviter le listage des répertoires et sous-répertoires de vos plugins, il est préférable d'y mettre le même fichier index.php que celui présent dans les autres répertoires de Piwigo.
Vous pouvez également retrouver d'autres évènements personnels dans les Trucs et Astuces de la 1.7, par exemple : Gommer le compteur de catégorie.
La modification de template par plugin est intéressante quand elle est liée à une modification de code php, c'est à dire si j'ai besoin de modifier un peu de php et qu'en raison de ce changement, j'ai en parallèle besoin de changer le fichier .tpl correspondant.
La modification seule de .tpl ne se justifie pas pour :
Dans ce cas, il vaut mieux modifier directement le fichier .tpl une fois pour toute au lieu de dérouler du code php supplémentaire à chaque visite de page. Au besoin, créer son propre template est indispensable dès que le nombre de modifications est trop important.
Exemple à éviter pour les sites très actifs :
[PLUGIN] Déplacer « Identification » en haut du menu
Autant dans ce cas, faire cela une fois pour toute à la “main” dans menubar.tpl.
A l'inverse, certaines fonctionnalités ne peuvent pas être assurées par des directives css : dans ces cas très exceptionnels, l'usage du plugin personnel deviendra indispensable.
Si vous rencontrez des difficultés à la mise en place ou à l'élaboration de votre personal plugin, n'hésitez pas à poser des question sur le forum.
MERCI DE NE PAS TOUCHER AUX LIGNES QUI SUIVENT.