Bonsoir à tous.
Je reviens à nouveau pour une demande de coup de main en rapport au développement de plugins. Ca fait plusieurs jours que je m'arrache les cheveux là-dessus sans trouver de solution.
Par le passé (versions pré-Piwigo), il était possible d'insérer du code complémentaire sur une partie "core" de la galerie qui ne proposait pas de trigger. Pour cela, j'utilisais une condition "script_basename() == [le nom du fichier php ciblé]". Mais je viens de me rendre compte ce cela ne fonctionne plus depuis Piwigo; en tous cas pour mon plugin.
J'ai alors recherché parmi tous les plugins actuellement disponibles pour la version actuelle de Piwigo s'il y en a qui utilisent script_basename() pour m'en inspirer. Et, bien entendu, j'en ai trouvé dont [extension by rub] Dynamic Recent Period. Mais malgré mes essais répétitifs, je n'arrive pas à faire fonctionner mon script à base de script_basename()...
Voila comment je vois la chose pour modifier / ajouter / supprimer un comportement dans la page "profile" d'un visiteur inscrit :
1- Dans mon main.inc.php, j'ai ceci :
if (script_basename() == 'profile') { include_once(dirname(__FILE__).'/profile.inc.php'); }
2- Dans le fichier profile.inc.php, le code devant être exécuté en plus du code déjà présent dans profile.php, avec un retour sur erreurs (ici, pour l'exemple, un contrôle de dureté de mot de passe):
if (!defined('PHPWG_ROOT_PATH')) { die('Hacking attempt!'); } load_language('plugin.lang', NBC_UserAdvManager_PATH); add_event_handler('init', 'UserAdvManager_Profile_Init'); function UserAdvManager_Profile_Init() { global $conf, $user, $errors ; $errors = array(); $conf_nbc_UserAdvManager = isset($conf['nbc_UserAdvManager']) ? explode(";" , $conf['nbc_UserAdvManager']) : array(); if (isset($_POST['validate'])) { if (isset($conf_nbc_UserAdvManager[14]) and $conf_nbc_UserAdvManager[14] == 'true' and !empty($conf_nbc_UserAdvManager[15])) { $PasswordCheck = testpassword($_POST['use_new_pwd']); if ($PasswordCheck < $conf_nbc_UserAdvManager[15]) { $message = get_l10n_args('reg_err_login4_%s', $PasswordCheck); $errors[] = l10n_args($message).$conf_nbc_UserAdvManager[15]; } } } }
Mais çà ne fonctionne pas... Le fichier profile.inc.php est bien interprété lorsqu'on va dans profile.php (testé en faisant volontairement une faute dans le nom de fichier = erreur php). Mais le contrôle de mot de passe n'a aucun effet sur les actions du visiteurs qui modifierait sont mot de passe par le biais de son profil.
Ce n'est pas le code de contrôle de mot de passe qui pose soucis puisqu'en le remplaçant par un simple affichage d'un message, rien ne se passe.
Alors, je me dis que je suis (encore !) à côté de la plaque et qu'il y a quelque chose, surement flagrant, qui refuse de s'imprimer dans mes neurones. Utiliser les triggers présents dans profile.php ? Il y en a 4 : loc_begin_profile, loc_end_profile, save_profile_from_post et load_profile_in_template. J'ai essayé les 3 premiers (le 4ème étant dédié au template, ne convient pas) sans plus de succès.
Une idée sur la manière de procéder ?
Hors ligne
Ca devrait pourtant fonctionner...
Dans le main.inc.php, en faisant:
if (script_basename() == 'profile')
{
add_event_handler('init', 'UserAdvManager_Profile_Init');
function UserAdvManager_Profile_Init()
{
echo 'test';
}
}
On a bien "test" qui s'affiche...
Par contre, utilise plutot le trigger loc_begin_profile.
Dernière modification par P@t (2009-10-25 22:27:13)
Hors ligne
Salut P@t et merci pour la réponse rapide !
Effectivement, en faisant comme tu le démontres, on a bien test qui s'affiche. Mais, sur le même exemple, si je fais ceci (en tenant compte que les variables de $conf et autres sont bien positionnées) :
if (script_basename() == 'profile') { add_event_handler('loc_begin_profile', 'UserAdvManager_Profile_Init'); function UserAdvManager_Profile_Init() { //echo 'test'; global $conf, $user, $errors ; $errors = array(); $conf_nbc_UserAdvManager = isset($conf['nbc_UserAdvManager']) ? explode(";" , $conf['nbc_UserAdvManager']) : array(); if (isset($_POST['validate'])) { if (isset($conf_nbc_UserAdvManager[14]) and $conf_nbc_UserAdvManager[14] == 'true' and !empty($conf_nbc_UserAdvManager[15])) { $PasswordCheck = testpassword($_POST['use_new_pwd']); if ($PasswordCheck < $conf_nbc_UserAdvManager[15]) { $message = get_l10n_args('reg_err_login4_%s', $PasswordCheck); $errors[] = l10n_args($message).$conf_nbc_UserAdvManager[15]; } } } } }
Le script n'est pas pris en compte. Normalement, si on met un mot de passe trop faible, il devrait y avoir le message d'erreur "l10n_args($message).$conf_nbc_UserAdvManager[15]". Là, rien... Et le $_POST['use_new_pwd'] que je renseigne est largement en dessous du critère.
A noter que la fonction testpassword() fonctionne bien pour register.php et n'est, a priori, pas en cause. De toute façon, pour lever le doute, j'ai aussi essayé avec un appel à un autre code qui fonctionne dans d'autres condition mais toujours pas pour profile.php.
Hors ligne
A priori, c'est normal, la variable $errors est initialisée après les triggers init et loc_begin_profile (dans la fonction save_profile_from_post)
Il va falloir feinter!
Genre un truc comme ca:
if (script_basename() == 'profile')
{
add_event_handler('loc_begin_profile', 'UserAdvManager_Profile_Init');
function UserAdvManager_Profile_Init()
{
global $conf, $user, $template;
$conf_nbc_UserAdvManager = isset($conf['nbc_UserAdvManager']) ? explode(";" , $conf['nbc_UserAdvManager']) : array();
if (isset($_POST['validate']))
{
if (isset($conf_nbc_UserAdvManager[14]) and $conf_nbc_UserAdvManager[14] == 'true' and !empty($conf_nbc_UserAdvManager[15]))
{
$PasswordCheck = testpassword($_POST['use_new_pwd']);
if ($PasswordCheck < $conf_nbc_UserAdvManager[15])
{
$message = get_l10n_args('reg_err_login4_%s', $PasswordCheck);
$template->append('errors', l10n_args($message).$conf_nbc_UserAdvManager[15]);
unset($_POST['validate']);
}
}
}
}
}
Hors ligne
Je savais bien qu'il y avait une feinte ^^
Cà fonctionne impeccable comme cela. Astucieux, la feinte... J'aurais encore appris quelque chose aujourd'hui ;-)
Merci P@t ! T'es un chef !
Hors ligne