2012-08-10 4 views
0

J'écris une fonction pour remplir une session avec les détails de l'utilisateur à partir de la base de données. Je dois exclure le mot de passe et les colonnes de sel afin que la session globale ne soit pas remplie avec eux.Zend exclut les colonnes sans Zend Auth

Cela peut se faire facilement à la connexion en utilisant:

$zendAuth->getResultRowObject(null, array("password", "salt")); 

Cependant, je besoin d'effectuer cette ailleurs sans l'utilisation de zendAuth $.

je les suivantes:

$usersTable = new Application_Model_DbTable_Users(); 

$zendSession = new Zend_Session_Namespace(); 

$zendSession->userData = $usersTable->fetchRow(
    $usersTable->select() 
    ->from("users", array('id', 'first_name', 'last_name', 'email', 'status')) 
    ->where("id = ?", $userInsertQuery)->setIntegrityCheck(false)); 

je devais régler la IntegrityCheck false que je recevais des erreurs de ne pas être en mesure de se joindre à une instruction select.

Il doit y avoir un moyen plus simple d'obtenir certains noms de colonnes de la db en utilisant $ usersTable

Répondre

0

Normalement, vous ajoutez juste une méthode dans votre modèle DbTable ou classe mappeur pour aller chercher ces données pour vous. Pour votre question actuelle essayez ceci:

$usersTable = new Application_Model_DbTable_Users(); 

$zendSession = new Zend_Session_Namespace(); 
$select = $usersTable->select(); 
$select->from($usersTable,array('id', 'first_name', 'last_name', 'email', 'status')) 
     ->where("id = ?", $userInsertQuery); 
$zendSession->userData = $usersTable->fetchRow($select); 

Zend_Db_Select semble penser que vous essayez d'accéder à plusieurs tables parce que vous avez utilisé deux méthodes différentes (le passage d'un objet comme tablename et une chaîne comme tablename) pour accéder à la même table dans la même requête.

Une méthode dans votre DbTable pourrait ressembler à:

public function getUserData($id) 
    { 
     $select = $this->select(); 
     $select->from($this, array('id', 'first_name', 'last_name', 'email', 'status')); 
     $select->where('id = ?', $id); 

     $result = $this->fetchRow($select); 
     return $result; 
    } 

Puis, en vous contrôleur:

$usersTable = new Application_Model_DbTable_Users(); 
$user = $usersTable->getUserData($userInsertQuery); 
$zendSession->userData = $user; 

après tout cela, vous pouvez simplement stocker les informations que vous voulez à l'aide du Zend_Auth_Storage_Session un peu comme :

if ($result->isValid()) { 
    //store the username, first and last names of the user 
     $auth = Zend_Auth::getInstance(); 
     $storage = $auth->getStorage(); 
     $storage->write($authAdapter->getResultRowObject(array(
          'username', 'first_name', 'last_name' 
     ))); 
     //or to save all except 
     $storage->write($authAdapter->getResultRowObject(null, array('password', 'salt')); 
    } 

Puis plus tard, vous pouvez rappeler cette information en appelant :

$auth = Zend_Auth::getInstance(); 
     $storage = $auth->getStorage(); 
     $strorage->read(); 

ou vous pouvez accéder aux mêmes informations directement à partir Zend_Session_Namespace en utilisant l'espace de noms Zend_Auth:

$session = new Zend_Session_Namespace('Zend_Auth'); 
$member = $session->storage; //'storage' is the default. However the namespace and key can be changed.