Salut,
J'aurais besoin d'informations sur les bases d'un plugin.
L'utilisation LocalFilesEditor est très simple, y créer une fonction de base aussi mais il me manque des petites choses !
1ère => Comment on ajoute le lien dans la liste des plugins installés ?
2ème => Quant j'aurais ce lien, est ce qu'on doit absolument faire un fichier.tpl ou un simple echo "hello world" dans main.inc.php suffit à afficher le résultat de notre plugin ?
3ème => On va déjà voir le résultat de ma function :D
Hors ligne
LocalFile Editor te permet de faire de petites modifications, en aucun cas on n'utilise LocalFile Editor pour faire un plugin tel que ceux que tu trouves dans les extensions.
1/ Un plugin apparait dans la liste des plugins installés s'il s'agit dun plugin répondant à toutes les conditions d'intégration dans Piwigo
2/ C'est toi qui voit. Le "echo" c'est l'option facile et rapide. Dis toi que çà va vite devenir le bazard dès que tu souhaitera faire des évolutions. Tu peux le faire, mais ce n'est pas conseillé.
Je t'invite à jeter un oeil sur la façon dont quelques plugins ont déjà été écrits pour bien comprendre comment on les fabrique.
Hors ligne
Bon,
Comme personne ne veut m'aider :D j'ai trouver la 1ère solution en épluchant le plugin statistiques, celui pour le code de google !
Donc j'ai copié et adapté ça :
define('P_DIR' , basename(dirname(__FILE__))); define('P_PATH' , PHPWG_PLUGINS_PATH . P_DIR . '/'); function perso_menu($menu) { array_push($menu, array('NAME' => 'Personnel', 'URL' => get_admin_plugin_menu_link(P_PATH . 'main.inc.php'))); return $menu; }
Ainsi on définit quelques variables et on insert notre lin "Personnel" qui affiche "main.inc.php"
Par contre j'ai une erreur je pensais pouvoir utilisé IMAGES pour la table IMAGES comme on peut voir USER_ACCESS dans le plugin d'exemple de la documentation, un truc autologin ...
Pour le moment je vais mettre ma table en dur mais si quelqu'un sait .... je suis preneur
Hors ligne
grum a écrit:
LocalFile Editor te permet de faire de petites modifications, en aucun cas on n'utilise LocalFile Editor pour faire un plugin tel que ceux que tu trouves dans les extensions.
1/ Un plugin apparait dans la liste des plugins installés s'il s'agit dun plugin répondant à toutes les conditions d'intégration dans Piwigo
2/ C'est toi qui voit. Le "echo" c'est l'option facile et rapide. Dis toi que çà va vite devenir le bazard dès que tu souhaitera faire des évolutions. Tu peux le faire, mais ce n'est pas conseillé.
Je t'invite à jeter un oeil sur la façon dont quelques plugins ont déjà été écrits pour bien comprendre comment on les fabrique.
Merci,
Oui le echo c'est pour les tests ;)
Ma question, dont j'ai trouvé une solution, était d'afficher le lien dans la liste des plugins déjà installés et qui vont vers la page de configuration de celui-ci.
Je fouille, je fouille ;) ça avance, doucement !
Hors ligne
YannCo a écrit:
Bon,
Donc j'ai copié et adapté ça :Code:
define('P_DIR' , basename(dirname(__FILE__))); define('P_PATH' , PHPWG_PLUGINS_PATH . P_DIR . '/'); function perso_menu($menu) { array_push($menu, array('NAME' => 'Personnel', 'URL' => get_admin_plugin_menu_link(P_PATH . 'main.inc.php'))); return $menu; }Ainsi on définit quelques variables et on insert notre lin "Personnel" qui affiche "main.inc.php"
pas tout à fait.
Le fichier main.inc.php est tout le temps appelé par Piwigo : c'est le fichier principal de ton plugin. Il n'y a pas besoin de l'appeler via le lien dans la liste des plugins.
En général (ce n'est pas obligatoire), quand le plugin nécessite une interface d'administration, on gère cette interface dans un sous répertoire "admin" du plugin. Je te conseille de faire un fichier "admin/plugin_admin.php" par exemple, dans lequel tu vas gérer l'interface d'dministration du plugin. C'est vers ce fichier que l'URL doit pointer.
tu trouvera la déclaration de toutes les tables de Piwigo dans le fichier /include/constants.php
Hors ligne
Effectivement, cette manip est un peu bête ....
Je veux =>
Un lien qui me permet d'atteindre une page de gestion, mon plugin.
Et donc ma page du plgin.
Considérons que j'ai ceci =>
PersonalPlufin/main.inc.php
PersonalPlugin/admin/admin_plugin.php
PersonalPlugin/admin/admin_plugin.tpl
Serait il possible d'avoir les codes pour une fonctionnalité simple de type "Hello World"
main.inc.php
<?php /* Plugin Name: Plugin Personnel Version: 1.0 Description: Plugin Personnel Plugin URI: http://piwigo.org Author: Author URI: */ define('P_DIR' , basename(dirname(__FILE__))); define('P_PATH' , PHPWG_PLUGINS_PATH . P_DIR . '/'); function admin_menu($menu) { array_push($menu, array('NAME' => 'Personnel', 'URL' => get_admin_plugin_menu_link(P_PATH . 'admin/admin_plugin.php'))); return $menu; } add_event_handler('get_admin_plugin_menu_links', 'admin_menu'); ?>
Par contre la suite je n'ai que des erreurs de variables non déclarées et de header déja envoyé ....
$template->quelquechose, variable et fonction inconnu et un simple echo 'hello' me créé une erreur de header !
Hors ligne
Bonsoir YannCo ;
je suis comme toi : j'attends de l'équipe qu'elle publie une documentation précise sur la création de plugins, avec la liste des fonctions nécessaires et leurs arguments, la liste des fonctions disponibles fournies par Piwigo, la structure-type d'un plugin avec ou sans page admin...
Mais j'ai bien peur que la seule réponse à cette demande soit : "bravo ! on attendait que quelqu'un s'y mette ! Bon courage !"
;-)
YannCo a écrit:
(...) un simple echo 'hello' me créé une erreur de header !
Si j'ai bien tout compris, le fonctionnement de base de Piwigo, c'est :
_ une page PHP qui exécute du code, et ajuste des variables ;
_ à la fin de la page PHP, transmission des variables à "une page HTML sous modèle Smarty" (en fait une instance d'objet Smarty, mais bon), c'est-à-dire que la page HTML n'existe pas encore quand le code PHP a fini d'être exécuté ; seulement là est appelé la page .tpl qui génèrera le code HTML grâce à des instrucions Smarty (en ayant auparavant généré un header "universel" pour toutes les pages d'un même site).
=> donc, si je ne m'abuse, aucune possibilité qu'un "echo" fasse partie de qqch qui puisse fonctionner : c'est du PHP, or la page PHP ne génère pas elle-même la page HTML. Si un "echo" apparaît, le "header" est censé avoir déjà été envoyé (or il n'en a pas été défini, en plus), et ensuite le header "normal" de Piwigo est en surcharge => message "header already sent".
Sinon, ce que j'ai compris du fonctionnement du plugin, c'est (pour l'exemple, appelons-le toto) :
_ fonctions principales : dans ./piwigo/plugins/toto/main.inc.php => l'existence du dossier toto implique l'existence du plugin et fournit un nom utilisé par Piwigo ;
_ quatre fonctions particulières, dans ./piwigo/plugins/toto/maintain.inc.php : plugin_install() , plugin_activate() ; plugin_deactivate() ; et plugin_uninstall() => les corps de ces fonctions sont exécutés lors des actions correspondantes (install, activation, etc) lorsque l'administrateur du site appuye sur les boutons correspondants dans la page Admin > Spéciales > Plugins
_ quasi indispensable (pour l'exemple ci-dessous en tous cas) : créer un ./piwigo/plugins/toto/language/fr_FR/plugin.lang.php (et aussi un .../en_UK/... aussi, si on sait, et aussi un .../de_DE/... si on peut... bref) qui contiendra les $lang[''] permettant de ne donner que des codes à Smarty, qui les traduira comme indiqué dans les différents plugin.lang.php, en fonction du langage choisi par l'utilisateur.
_ code-type à insérer dans main.inc.php pour déclarer l'existence d'une page d'administration du plugin :
<?php /* Plugin Name: toto ([...] : là, il y a tout un en-tête type à insérer) */ if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!'); // nécessaire global $conf; // et autres si besoin define('TOTO_PATH' , PHPWG_PLUGINS_PATH . basename(dirname(__FILE__)) . '/'); // si besoin aussi, pas forcé // c'est surtout là que c'est important class toto // Sets the administration panel of the plugin { function plugin_admin_menu($menu) { array_push($menu, array( 'NAME' => 'Toto', 'URL' => get_admin_plugin_menu_link(dirname(__FILE__).'/admin/toto_admin.php') ) ); return $menu; } } // End class $obj = new toto(); //---------------------------------- /** Là, les fonctions "cœur" du plugin : add_event_handler('init', 'fonction1'); function fonction1() { ... } */ // Là aussi, a priori, c'est important... add_event_handler('get_admin_plugin_menu_links', array(&$obj, 'plugin_admin_menu') ); set_plugin_data($plugin['id'], $obj); ?>
_ avec le code ci-dessus, on a déclaré à Piwigo qu'il existe une page ./piwigo.plugin/toto/admin/toto_admin.php qui se poursuivra par un toto_admin.tpl (vraisemblablement, mais on peut l'appeler autrement), pour laquelle il faut insérer un lien dans la liste des pages d'administration des plugins.
_ afin d'écrire "Hello World" dans cette page d'admin :
toto_admin.php :
<?php // +-----------------------------------------------------------------------+ // ([...] là encore, entête type // +-----------------------------------------------------------------------+ // *************************************** // ** Plugin Administration panel setup ** // *************************************** if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!'); /* ****************************************************** */ /* Plugin template initialisation for admin panel display */ /* ****************************************************** */ global $template, $conf, $lang; // en fonction des besoins $template->clear_assign('TOTOINFO'); $me = get_plugin_data($plugin_id); // Setup plugin Language load_language('plugin.lang', TOTO_PATH); // là, quand même, qques instructions pour gérer son plugin... // et enfin : $template->set_filenames( array('toto_admin_content' => dirname(__FILE__).'/toto_admin.tpl') ); $template->assign_var_from_handle( 'ADMIN_CONTENT', 'toto_admin_content'); ?>
toto_admin.tpl :
<div class="infos" style="text-align:left;padding-left:45px;font-size:14px;font-weight:bold;">{$EVNTCATSINFO|@translate}</div> <!-- on remarque que, là, on est passé en HTML --> <!-- les accolades sont les parties Smarty, qui sont interprétées par le parseur Smarty --> <h2> {'Title'|@translate} </h2> {'Howto'|@translate}
./piwigo/plugins/toto/language/fr_FR/plugin.lang.php :
<?php $lang['Title'] = 'Essai Toto'; $lang['Howto'] = 'Hello, World'; ?>
Je suis désolé, le feu d'artifice devant commencer, je suis obligé d'y emmener les enfants : je ne peux pas tester tout ça... mais normalement je ne dois pas être loin de,la vérité.
Eventuellement, faudra que le recopier dans le wiki une fois validé.
Je voulais inclure des liens vers des posts de Pierrick (plg) indiquant les entêtes à inclure dans les plugins, je viendrai modifier le post quand je pourrai les rechercher.
Hors ligne
LucMorizur a écrit:
Mais j'ai bien peur que la seule réponse à cette demande soit : "bravo ! on attendait que quelqu'un s'y mette ! Bon courage !"
;-)
Bravo pour ce petit tuto qui pourrais presque être mis tel que dans la doc.
L'usage d'une classe pour créer un plugin est facultative. Certain (moi entre autres) s'en servent systématiquement, d'autres non. C'est en fonction de chacun.
Hors ligne
Merci, je viens juste de fignoler 3 petits fichiers fonctionelles mais où il manque peut être quelques notions ...
Ces 3 fichiers affichent uniquement un lien vers la page d'administration du plugin qui affiche juste un 'Hello World', à vous de voir ce que le plugin doit faire :D
Structure du plugin niveau des fichiers et l'arborescence :
plugin
plugin/pluginperso
plugin/pluginperso/main.inc.php
plugin/pluginperso/admin/admin_plugin.php
plugin/pluginperso/admin/admin_plugin.tpl
Biensur, on nom les fichiers un peu comme on veut exepté main.inc.php
main.inc.php
<?php /* Plugin Name: Plugin Personnel Version: 1.0 Description: Plugin Personnel Plugin URI: http://yannco.org Author: YannCo Author URI: */ define('P_DIR' , basename(dirname(__FILE__))); define('P_PATH' , PHPWG_PLUGINS_PATH . P_DIR . '/'); global $template, $conf; function admin_menu($menu) { //On défini le nom du lien a affiché pour afficher la page de gestion de son plugin 'Personnel' et le chemin du fichier qui va gérer les fonctions de votre plugin 'admin/admin_plugin.php' array_push($menu, array('NAME' => 'Personnel', 'URL' => get_admin_plugin_menu_link(P_PATH . 'admin/admin_plugin.php'))); return $menu; } // On execute la function 'admin_menu' add_event_handler('get_admin_plugin_menu_links', 'admin_menu'); ?>
admin/admin_plugin.php
<?php $template->set_filename('plugin_admin_content', dirname(__FILE__) . '/admin_plugin.tpl'); $template->assign_var_from_handle('ADMIN_CONTENT', 'plugin_admin_content'); ?>
admin/admin_plugin.tpl
<div class="titrePage"> <h2>Plugin Perso</h2> </div> <p>Hello World</p>
Résultat en pièces jointes
Dernière modification par YannCo (2009-07-15 00:50:51)
Hors ligne
C'est pas à jour mais peut être une base pour comprendre le fonctionnement des plugins : http://fr.piwigo.org/doc/doku.php?id=fr … _un_plugin mais c'est sur que la meilleur façon d'apprendre est de regarder les plugins existant et au besoin demander sur le forum.
Dernière modification par flipflip (2009-07-16 13:23:19)
Hors ligne
flipflip a écrit:
C'est pas à jour mais peut être une base pour comprendre le fonctionnement des plugins : http://fr.piwigo.org/doc/doku.php?id=fr … _un_plugin mais c'est sur que la meilleur façon d'apprendre est de regarder les plugins existant et au besoin demander sur le forum.
Je la connaissais, cette page :-/ ... je vois pas pourquoi je l'ai pas citée, au lieu d'essayer d'en faire une moi-même...
Désolé.
Une question peut-être idiote, mais j'ai pas trouvé la réponse sur des sites qui expliquent le HTML :
dans les formulaire, l'attribut "action" reçoit souvent comme valeur une variable qui n'est définie nulle part, par exemple :
<form method="post" action="{TESTPLUGIN_F_ACTION}" class="general">
dans la page citée (et écrite) par flipflip.
On voit donc dans le code HTML finalement généré, lorsque le script est exécuté :
<form method="post" action="" class="general">
(Je me suis dit que TESTPLUGIN_F_ACTION était peut-être définie "automatiquement" par un autre script de Piwigo de "gestion des plugins", mais il se trouve qu'on voit bien action="" lorsqu'on regarde la source du script exécuté. Et j'ai remarqué ça avec plusieurs plugins.)
Quelle est censée être l'attitude du navigateur dans ce cas, puisque "action" sert normalement à définir vers quelle page continuer après la validation du formulaire ?
Merci :-) !
Hors ligne
Quant action est nul, il renvoi sur la page du formulaire, {TESTPLUGIN_F_ACTION} est une variable à définir dans ton plugin, par contre ça je ne sais pas trop comment on le gère !
Je ne suis pas du tout habitué à ce type de script, php et tpl, perso j'ai toujours travaillé qu'avec des pages php ... il serait temps que j'évolu :D
Je n'arrive pas à passer mes variables vers mes templates .... faut que je cherche encore mais si quelqu'un a un exemple simple et rapide ... je suis preneur ;)
Hors ligne
YannCo a écrit:
Quant action est nul, il renvoi sur la page du formulaire
J'en étais sûr !
Merci !
Je n'arrive pas à passer mes variables vers mes templates .... faut que je cherche encore mais si quelqu'un a un exemple simple et rapide ... je suis preneur ;)
Dans le fichier PHP :
$toto='Hello, world'; $template->assign('A_Ecrire',$toto); // à commenter, pour voir
Dans le fichier .tpl :
{if isset($A_Ecrire)} {$A_Ecrire} {else} Ben j'ai rien à dire... {/if}
affichera la valeur de $toto si si la ligne marquée "à commenter pour voir" n'est pas commentée ; sinon affichera "Ben j'ai rien à dire...".
Normalement...
Hors ligne
Merci, c'est tout bête, j'aurais pu trouver quant même ..... bon, ben avec ça je vais pouvoir commencer à faire des tests plus concrets ;)
Hors ligne
LucMorizur a écrit:
YannCo a écrit:
Quant action est nul, il renvoi sur la page du formulaire
J'en étais sûr !
Merci !Je n'arrive pas à passer mes variables vers mes templates .... faut que je cherche encore mais si quelqu'un a un exemple simple et rapide ... je suis preneur ;)
Dans le fichier PHP :
Code:
$toto='Hello, world'; $template->assign('A_Ecrire',$toto); // à commenter, pour voirDans le fichier .tpl :
Code:
{if isset($A_Ecrire)} {$A_Ecrire} {else} Ben j'ai rien à dire... {/if}affichera la valeur de $toto si si la ligne marquée "à commenter pour voir" n'est pas commentée ; sinon affichera "Ben j'ai rien à dire...".
Normalement...
Je suis très *** car ... ça ne marche pas :(
j'ai tout le temps "Ben je n'ai rien à dire" ......
<?php $template->set_filename('plugin_admin_content', dirname(__FILE__) . '/admin_plugin.tpl'); $template->assign_var_from_handle('ADMIN_CONTENT', 'plugin_admin_content'); $toto='Hello, world'; // à commenter, pour voir $template->assign('A_Ecrire',$toto); // à commenter, pour voir ?>
<div class="titrePage"> <h2>Plugin Perso</h2> </div> {if isset($A_Ecrire)} {$A_Ecrire} {else} Ben j'ai rien à dire... {/if}
Si j'enlève le assign_car_from ... y a plus rien ! par contre je ne sais pas à quoi elle sert et comment elle fonctionne !
Hors ligne