Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Yop,
J'vais avoir à bosser sur un site qui possèdent 2 parties:
- www.truc.com qui est le site "normal" réalisé avec ZF.
- forum.truc.com qui est le forum associé.
Il faut que les 2 utilisent la même base de comptes.
Je pense utiliser les comptes, et donc l'auth, de phpBB surtout car ça me semble vachement plus simple à mettre en place que l'inverse.
Avant de me lancer j'ai quelques questions.
1) On va commencer par là, quelqu'un a déjà tenter le coup?
Si oui, j'accepte volontiers du feedback et évidement du code .
2) J'ai une première idée de comment faire et j'aimerai bien l'avis de ceux qui connaissent bien Zend_Auth et/ou phpBB3.
phpBB3 fournit vachement d'API pour utiliser son code sur le reste du site, ce qui permet de gérer l'auth ressemble à:
define('IN_PHPBB', true); $phpbb_root_path = './forum/'; $phpEx = substr(strrchr(__FILE__, '.'), 1); include($phpbb_root_path . 'common.' . $phpEx); $user->session_begin();
Le but étant simplement de récupérer $user->data->user_id et $user->data->username pour mes applis sur le site.
Mon idée première est de ne pas utiliser d'adapter car l'auth se fera par le formulaire du forum qui est facilement déportable sur le site, c'est le moteur de phpBB3 qui s'occupera d'écrire les cookies/sessions qui vont bien.
Mais d'utiliser un Zend_Auth_Storage custom pour avoir la persistance de cette session phpBB sur le site.
Je suppose qu'il faut faire un truc genre:
<?php require_once 'Zend/Auth/Storage/Interface.php'; class MonStockage implements Zend_Auth_Storage_Interface { public $id; public $username; public function __construct() { // Ici je mets le code décris plus haut et si je trouve qqc, je remplis mes 2 variables d'instances } public function isEmpty() { // Je réponds oui si j'ai rien trouver } public function read() { // Ici je renvoie id et/ou username } public function write($contents) { //Logiquement rien ici } public function clear() { // Je sais pas trop ici } }
J'ai pas le temps de tester tout de suite mais ça me tourne dans le crâne donc j'avais besoin de poser l'idée quelque part, ce forum me semblait adapté .
A votre avis, est-ce que je pars sur la bonne piste?
Est-ce que quelqu'un a une autre idée?
Merci.
Hors ligne
Permet moi de relancer le sujet, je veux faire exactement la même chose.
As tu réussi ?
Pourrais tu montrer à quoi tu es arrivé?
Merci
Hors ligne
bonjour,
je fait remonter ce sujet, car j'essaie de creer une classe pour récupérer les identifiants d'un utilisateur en utilisant l'API de phpBB :
<?php class MyPhpBB { public $id; public $username; public function __construct() { define('IN_PHPBB', true); $phpbb_root_path = './forum/'; $phpEx = substr(strrchr(__FILE__, '.'), 1); include($phpbb_root_path . 'common.' . $phpEx); $user->session_begin(); } public function init() { } public function getid() { return $user->data['user_id']; } public function getusername() { return $user->data['username']; } public function is_registred() { if ($user->data['is_registered']) { return true; } else { return false; } } }
Mais j'obtient un erreur en faisant :
$phpbbuser = new MyPhpBB();
Erreur :
Fatal error: Call to a member function sql_query() on a non-object in ....\forum\includes\cache.php on line 51
qui correspond a cette ligne :
$config = $cached_config = array(); $sql = 'SELECT config_name, config_value, is_dynamic FROM ' . CONFIG_TABLE; $result = $db->sql_query($sql); => Ligne 51
j'ai pensé a un nomage double de $db et de $config, mais c'est pas ça.
je pense que c'est la première requete de phpbb, donc une incompatibilité avec Zend_Db_Table.
Si quelqu'un a réussi ou une idée car sinon je vais passer par des requettes perso.
merci d'avance,
Dernière modification par baboune (30-01-2009 16:05:48)
Hors ligne
bon j'ai trouvé, c'était un problème de déclaration de varaible :
1°) attention au nommage, $db et $config sont utilisées dans phpbb, variable global.
2°) dans les fonctions, ne pas oublier :
global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template;
pour aider, le début de ma classe :
class MyPhpBB { public function __construct() { global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template; define('IN_PHPBB', true); $phpbb_root_path = './forum/'; $phpEx = substr(strrchr(__FILE__, '.'), 1); include($phpbb_root_path . 'common.' . $phpEx); $user->session_begin(); } public function init() { } public function getid() { global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template; return $user->data['user_id']; } public function getusername() { global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template; if ($this->is_registred()) return $user->data['username']; } public function is_registred() { global $phpbb_root_path, $phpEx, $user, $db, $config, $cache, $template; if ($user->data['is_registered']) { return true; } else { return false; } } }
dans un controller par exemple :
$phpbbuser = new MyPhpBB(); $this->view->phpbb_user = $phpbbuser->getusername();
la vue :
echo $this->phpbb_user;
on affiche le nom de l'utilisateur si il est connecté.
Dernière modification par baboune (30-01-2009 17:07:39)
Hors ligne
donc maintenant, j'ai implémenter Zend_Auth_Adapter :
class MyAuthPhpBB implements Zend_Auth_Adapter_Interface { private $username; private $password; private $autologin; private $viewonline; private $admin = 0; public function __construct() { global $phpbb_root_path, $phpEx, $user, $auth, $db, $config, $cache, $template; define('IN_PHPBB', true); $phpbb_root_path = './forum/'; $phpEx = substr(strrchr(__FILE__, '.'), 1); include($phpbb_root_path . 'common.' . $phpEx); $user->session_begin(); $auth->acl($user->data); } public function setIdentity($name) { $this->username = $name; return $this; } public function setCredential($pass) { $this->password = $pass; return $this; } public function setAutologin($Autologin) { $this->autologin = $Autologin; return $this; } public function setViewonline($Viewonline) { $this->viewonline = $Viewonline; return $this; } public function authenticate() { global $phpbb_root_path, $phpEx, $user, $auth, $db, $config, $cache, $template; $result = $auth->login($this->username, $this->password, $this->autologin, $this->viewonline, $this->admin); $PhpBB_identity = new stdClass(); foreach ($user->data as $key => $val) { $PhpBB_identity->$key = $val; } $authResult = array( 'code' => Zend_Auth_Result::FAILURE, 'identity' => $PhpBB_identity, 'messages' => array() ); if ($result['status'] != LOGIN_SUCCESS) { $authResult['code'] = Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND; $authResult['messages'][] = 'Erreur d\'authentification'; } else { $authResult['code'] = Zend_Auth_Result::SUCCESS; $authResult['messages'][] = 'Authentification reussi'; } return new Zend_Auth_Result($authResult['code'],$authResult['identity'], $authResult['messages']); } }
ça marche bien ! sauf que j'ai un message d'erreur avec Zend_loader :
[phpBB Debug] PHP Notice: in file H:/xampp/htdocs/......../library/Zend/Loader.php on line 83: Zend_Loader::include_once(utf/normalizer.php) [function.Zend-Loader-include-once]: failed to open stream: No such file or directory [phpBB Debug] PHP Notice: in file H:/xampp/htdocs/........./library/Zend/Loader.php on line 83: Zend_Loader::include_once() [function.include]: Failed opening 'utf/normalizer.php' for inclusion (include_path='.;./library;./library/My/;./application/default/models/;./application/login/models/;./application/actualite/models/;./application/association/models/;./application/partenaires/models/;./application/liens/models/;./application/telechargements/models/;./application/equipes/models/;./application/contacts/models/;./application/photos/models/;.;H:/xampp/php/pear/')
et la je vois pas du tout, le fichier s'appelle en faite utf_normalizer.php, donc il cherche utf/normalizer.php.
Mais pourquoi zend_loader essai de l'inclure ?
Dernière modification par baboune (01-02-2009 15:47:02)
Hors ligne
bon j'ai trouver une parade, mais c'est du bricolage tout ça :
dans __construct()
je force tout simplement l'inclusion :
require('./forum/includes/utf/utf_normalizer.php');
et maintenant plus de message, si vous comprenez le pourquoi, ça m'interresse de comprendre.
Hors ligne
Hello,
C'est pas du bricolage. C'est simplement que tu as activé l'autoload et que ce fichier ne respecte pas la notation Zend. C'est le problème quand tu charges des fichiers d'une autre librairie dont les règles de nommage ne sont pas les mêmes que celles du ZF. Ceci n'arrive pas par exemple avec les librairies PEAR car elles ont les mêmes conventions que le ZF.
A+
Hors ligne
Bonjour.
Je suis également en train de développer un site qui s'appuie sur une authentification phpBB3, et j'ai également rencontré ce genre de problème : après avoir colmaté "à la va-vite" en incluant manuellement les fichiers du forum, je me retrouve assez souvent confronté à une exception
Object of class stdClass could not be converted to string/array
La première occurrence ayant eu lieu dans auth.php (je l'ai rafistolé en redéclarant un tableau dans le fichier même), la seconde dans db/dbal.php. Je soupçonne la source de ce problème d'être l'ordre d'inclusion des fichiers, mais, si c'est le cas, comment corriger cela ?
Merci de vos réponses.
Dernière modification par gordontesos (30-03-2009 17:08:52)
Hors ligne
bonjour,
il faudrait que tu détaille un peu plus ton code, mais si utilise la class MyAuthPhpBB
c'est peut être du a cette parti là :
$PhpBB_identity = new stdClass(); foreach ($user->data as $key => $val) { $PhpBB_identity->$key = $val; }
je converti le tableau de $user->data (par exemple : $user->data[username]) en objet pour être plus conforme avec zend ($this->auth->getIdentity()->username)
Hors ligne
En fait, le problème s'applique en ce moment sur la tentative d'écriture un post sur le forum (via un module de commentaires de news, qui s'appuie sur ce forum) :
L'inclusion des fichiers du phpBB est :
define('IN_PHPBB', true); $phpbb_root_path = '../forum/'; $phpEx = substr(strrchr(__FILE__, '.'), 1); include_once($phpbb_root_path . 'common.' . $phpEx); include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx); include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx); include_once($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx); include_once($phpbb_root_path . 'includes/message_parser.' . $phpEx);
Avec ces inclusions, je parviens à ne plus avoir d'erreurs du Zend_Loader. Cependant, j'ai toujours l'exception sur la stdClass, donc je ne pense pas que créer un adaptateur d'authentification au sein de ZF puisse corriger ce problème.
Hors ligne
Bonjour !
Je sais que je "déterre" le sujet, mais j'ai actuellement le même problème...
Quelqu'un pourrait-il donner une solution complète et explicite ?
Hors ligne
Bonjour,
J'ai réussi l'authentification avec la classe de baboune.
Tout fonctionne bien (après quelques modifs bien sur), malheureusement, il me manque une fonction :
comment créer une instance Zend_Auth si un cookie de phpbb existe (si $user->data est OK au démarrage du navigateur).
Car j'ai pas trouvé comment créer l'objet Zend_Auth sans passer par la méthode authenticate...
Voici l'action au moment ou le user se connecte :
$auth = Zend_Auth::getInstance(); $this->view->auth = $auth; global $user; if($auth->hasIdentity()) { // Mise à jour des données de l'authentification if (null != $user && $user->data['user_id'] != ANONYMOUS) { $currUser = $auth->getIdentity(); foreach ($user->data as $key => $val) { $currUser->$key = $val; } $auth->getStorage()->write($currUser); } } else { if (null != $user && $user->data['user_id'] != ANONYMOUS) { // restauration depuis la session // Comment récréer l'objet Zend_Auth ?? } }
Merci d'avance.
Hors ligne
Pages: 1