Bonsoir à tous.
Je suis à nouveau en train de m'arracher les cheveux pour résoudre un problème sur le code d'un plugin (Register_FluxBB pour ne pas le citer). Le code en question fonctionne parfaitement dans sa version pour PWG 1.7.x. Mais là, pour Piwigo 2.x, il y a eu des changements que je n'arrive pas à cerner.
Le contexte : Je souhaite affecter des actions (fonctions) supplémentaires au moment de la mise à jour du profil d'un utilisateur (profile.php).
Le problème : Lorsque je valide la mise à jour d'un profil, même sans rien avoir changé dedans, j'ai un message d'insulte php m'indiquant qu'un index n'est pas défini. Alors que cet index passait bien tel quel sous 1.7.x. Et çà me met le bazar dans le reste de mon code. Ci-dessous le message d'insulte :
[29-Apr-2009 21:57:11] PHP Notice: Undefined variable: userdata in E:\www\test\phpwebgallery\plugins\Register_FluxBB\main.inc.php on line 128
[29-Apr-2009 21:57:11] PHP Notice: Undefined variable: userdata in E:\www\test\phpwebgallery\plugins\Register_FluxBB\main.inc.php on line 166
[29-Apr-2009 21:57:11] PHP Notice: Undefined variable: userdata in E:\www\test\phpwebgallery\plugins\Register_FluxBB\main.inc.php on line line 170
Et voici le code en cause :
add_event_handler('init', 'Register_FluxBB_InitPage'); function Register_FluxBB_InitPage() { global $conf; include_once( PHPWG_ROOT_PATH.'include/common.inc.php' ); include_once (Register_FluxBB_PATH.'include/functions_Register_FluxBB.inc.php'); /* user update */ if (script_basename() == 'profile') { if (isset($_POST['validate'])) { $errors = array(); $int_pattern = '/^\d+$/'; if (empty($_POST['nb_image_line']) or (!preg_match($int_pattern, $_POST['nb_image_line']))) { $errors[] = l10n('nb_image_line_error'); } if (empty($_POST['nb_line_page']) or (!preg_match($int_pattern, $_POST['nb_line_page']))) { $errors[] = l10n('nb_line_page_error'); } if ($_POST['maxwidth'] != '' and (!preg_match($int_pattern, $_POST['maxwidth']) or $_POST['maxwidth'] < 50)) { $errors[] = l10n('maxwidth_error'); } if ($_POST['maxheight'] and (!preg_match($int_pattern, $_POST['maxheight']) or $_POST['maxheight'] < 50)) { $errors[] = l10n('maxheight_error'); } // periods must be integer values, they represents number of days if (!preg_match($int_pattern, $_POST['recent_period']) or $_POST['recent_period'] <= 0) { $errors[] = l10n('periods_error') ; } if (isset($_POST['mail_address'])) { $mail_error = validate_mail_address($userdata['id'],$_POST['mail_address']); if (!empty($mail_error)) { $errors[] = $mail_error; } } if (!empty($_POST['use_new_pwd'])) { // password must be the same as its confirmation if ($_POST['use_new_pwd'] != $_POST['passwordConf']) { $errors[] = l10n('New password confirmation does not correspond'); } if ( !defined('IN_ADMIN') ) {// changing password requires old password $query = ' SELECT '.$conf['user_fields']['password'].' AS password FROM '.USERS_TABLE.' WHERE '.$conf['user_fields']['id'].' = \''.$userdata['id'].'\' ;'; list($current_password) = mysql_fetch_row(pwg_query($query)); if ($conf['pass_convert']($_POST['password']) != $current_password) { $errors[] = l10n('Current password is wrong'); } } } if (count($errors) == 0) { include_once (Register_FluxBB_PATH.'include/functions_Register_FluxBB.inc.php'); $query = ' SELECT '.$conf['user_fields']['username'].' AS username FROM '.USERS_TABLE.' WHERE '.$conf['user_fields']['id'].' = \''.$userdata['id'].'\' ;'; list($username) = mysql_fetch_row(pwg_query($query)); FluxBB_Updateuser($userdata['id'], $username, $conf['pass_convert']($_POST['use_new_pwd']), $_POST['mail_address']); } } } }
Un oeil averti comprendra que "$userdata['id']" est sensé être l'ID de l'utilisateur qui modifie son profil. En fait, je n'ai rien inventé mais inspiré de ce qui est fait dans profile.php. Mais faut croire que j'ai une poutre dans l'oeil pour ne pas voir ce qui cloche...
Merci d'avance à ceux qui voudront bien m'aider à arranger cela. Cà me permettra de corriger un gros problème sur le plugin actuel.
Dernière modification par Eric (2009-04-30 21:25:47)
Hors ligne
Question con: tu l'initialise où ton userdata ? C'est une globale ? Il ne manque pas sa déclaration ?
Hors ligne
Criss a écrit:
Question con: tu l'initialise où ton userdata ? C'est une globale ? Il ne manque pas sa déclaration ?
J'y ai pensé... Je me suis basé sur le code de profile.php et je n'y ai pas trouvé l'endroit où la variable est initialisée. J'en ai conclu qu'elle l'était alors au travers des fonctions globales. Logiquement, elle devrait être initialisée au même titre que les autres variables du code (tels que, au hasard, $current_password, $_POST['use_new_pwd'], etc...). Mais ce n'est pas le cas...
J'ai encore du chemin à faire en php :(
Dernière modification par Eric (2009-04-29 22:16:17)
Hors ligne
Je ne sais pas justement, je cherche des pistes...
Hors ligne
Je sais :)
Et je t'en remercie !
Hors ligne
Essaye de remplacer :
global $conf; include_once( PHPWG_ROOT_PATH.'include/common.inc.php' ); include_once (Register_FluxBB_PATH.'include/functions_Register_FluxBB.inc.php');
par
include_once( PHPWG_ROOT_PATH.'include/common.inc.php' ); include_once (Register_FluxBB_PATH.'include/functions_Register_FluxBB.inc.php'); global $conf, $userdata ;
Hors ligne
Sinon tu peux, dans ton code d'origine, remplacer
include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
par
include(PHPWG_ROOT_PATH.'include/common.inc.php' );
J'ai eu un soucis dans mon plugin à cause du include_once, réglé comme ça (pas beau mais comme c'est pour la partie admin...)
Hors ligne
Y a du changement mais c'est pas encore çà. En appliquant ta modif, j'initialise effectivement la variable $userdata mais elle ne retourne pas les valeurs attendues et çà fait planter la requête :
[29-Apr-2009 22:30:12] PHP Warning: [mysql error 1064] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3
SELECT id_user_FluxBB as FluxBB_id
FROM phpwebgallery_Register_FluxBB_id
WHERE id_user_pwg =
; in E:\www\test\phpwebgallery\include\functions.inc.php on line 918
[29-Apr-2009 22:30:12] PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in E:\www\test\phpwebgallery\plugins\Register_FluxBB\include\functions_Register_FluxBB.inc.php on line 211
Elle est issue du code d'une autre partie du script appelée par FluxBB_Updateuser($userdata['id'], $username, $conf['pass_convert']($_POST['use_new_pwd']), $_POST['mail_address']);
Je commence à avoir les yeux qui font des 8. Je crois que je vais faire une pause pour ce soir et reprendre demain soir (en plus c'est le week-end !).
Merci encore, Criss, pour tes pistes. Si tu as d'autres idées, n'hésites pas ;-)
Hors ligne
Jouons à Mastermind alors. :D
global $conf, $userdata ; include_once( PHPWG_ROOT_PATH.'include/common.inc.php' ); include_once (Register_FluxBB_PATH.'include/functions_Register_FluxBB.inc.php');
?
Hors ligne
Criss a écrit:
Sinon tu peux, dans ton code d'origine, remplacer
include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
par
include(PHPWG_ROOT_PATH.'include/common.inc.php' );
Avec çà, j'ai carrément :
Fatal error: Cannot redeclare sanitize_mysql_kv() (previously declared in E:\www\test\phpwebgallery\include\common.inc.php:39)
:(
Hors ligne
Criss a écrit:
Code:
global $conf, $userdata ; include_once( PHPWG_ROOT_PATH.'include/common.inc.php' ); include_once (Register_FluxBB_PATH.'include/functions_Register_FluxBB.inc.php');
Je l'ai tenté aussi et pas mieux...
Hors ligne
Bon bah je vois pas mieux. En gros elle est déclarée mais vide. Faudrait voir qui / où elle est remplie...
Hors ligne
Là est toute la question... Mais demain sera un nouveau jour ! Dodo, boulot et je reprends ce *@$£ de code.
Hors ligne
Première chose, pourquoi un include sur le fichier include/common.inc.php???
Ta fonction se lance sur le trigger 'init' situé dans ce meme fichier!
L'include_once ne sert donc à rien...
Ensuite, comme l'a dit repie38, il faut faire un global $user, et utiliser $user['id'], $user['name'], etc...
Hors ligne