Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous,
Je débute avec le Zend Framework. Je suis à la base un développeur .NET et je m'initie à l'open source.
J'ai commencé un nouveau projet et je rencontre mon premier soucis avec les bases de données.
J'ai pas mal lu et relus la documentation du Framework. J'ai bien compris la notion de Zend_Db_Table_Abstract et Zend_Db_Table_Row. L'un retournant une collection d'enregistrement, l'autre un enregistrement de cette collection.
Mon soucis est dans la gestion des relations N-N. Pour faire simple je vais prendre un exemple. J'ai dans ma base de données 3 tables :
- Une table utilisateur
class User extends Zend_Db_Table_Abstract { /** * The default table name */ protected $_name = 'user'; }
- Une table groupe
class Group extends Zend_Db_Table_Abstract { /** * The default table name */ protected $_name = 'group'; }
- Une table usergroup
Cette table fait le lien selon la règle "un utilisateur appartient à 1 ou N groupes et un groupe contient 1 ou N utilisateurs"
class UserGroup extends Zend_Db_Table_Abstract { protected $_name = 'usergroup'; protected $_dependentTables = array('Group','User'); protected $_referenceMap = array( 'groupes' => array( 'columns' => array('pro_id'),// la colonne de UserGroup est grp_id 'refTableClass' => 'Group', // la classe des Groupes est 'Group' 'refColumns' => 'pro_id' // la clé primaire de Groupes est grp_id ), 'users' => array( 'columns' => array('usr_id'), 'refTableClass' => 'User', 'refColumns' => 'usr_id' )); }
Voici un petit schéma de la structure de ces tables
En fait j'ai l'habitude en .NET que lorsque je récupére un objet Utilisateur, j'ai dans ses membres une propriété groups qui est une collection de groupes dont l'utilisateur fait partie.
J'aimerai reproduire ce même comportement avec Zend mais je n'y arrive pas.
Par exemple pour les utilisateurs j'ai créer une classe qui hérite de Zend_Db_Table_Row
class UserRow extends Zend_Db_Table_Row_Abstract{ // ...personnalisations }
et j'ai ajouter dans ma classe User
protected $_rowClass = 'UserRow';
Tout marche impécable tant que je ne sors pas des traditionnel méthode CRUD de SQL sur une table, j'arrive aussi à récupérer les enregistrements associer avec les méthodes findManyToManyRowset et autres. Mais ce que j'aimerai c'est avoir quelque chose du style :
$monUser = new User(); $monUser = fetchRow('usr_id=1'); $sesGroupes = $monUser->groups; //ICI ca me retournerai ses groupes
Vous allez dire OK je peux récupérer ses groupes avec findManyToManyRowset mais je veux aussi que lorsque je fait un $monUser->save(); Ca m'enregistre aussi les groupes que j'aurai ajouter ou mis à jour dans la propriété groupes.
J'ai une interface qui permet de créer un utilisateur dans un BO et de lui associer des groupes, mais tant que je n'ai pas valider, mon objet est uniquement construit en mémoire.
C'est à ce niveau que je bloque en fait, pour étendre la classe ROW. Pour le moment j'ai créer une classe User sans hériter de ROW que je gére indépendamment.
Voilà j'espère m'être fait comprendre par ces longues explications. Bref j'ai l'impression que je m'embrouille plus qu'autre chose. Je suis sur c'est un truc très simple ou alors peut-être n'est ce pas prévu ?
Si quelqu'un pouvait m'éclairer sur la gestion des relations N-N.
Cordialement,
Hors ligne
On peut pas faire quelque chose en étendant Zend_Db_Table_Row car il y a la méthode magique __call() dedans ?
Hors ligne
///////////////// struct db /////////////////
membre (id_membre, nom )
content (id_content, id_membre)
/////////////////models ////////////////////
class content extends Zend_Db_Table
{
protected $_name = 'content';
protected $_primary = 'id_content';
protected $_dependentTables = array('categorie', 'membre');
protected $_referenceMap = array(
'categorie' => array(
'columns' => array('id_categorie'),// la colonne de UserGroup est grp_id
'refTableClass' => 'categorie', // la classe des Groupes est 'Group'
'refColumns' => 'id_categorie' // la clé primaire de Groupes est grp_id
),
'membre' => array(
'columns' => array('id_membre'),
'refTableClass' => 'membre',
'refColumns' => 'id_membre'
));
public function getContentIntro()
{
$db = $this->getAdapter();
$where = $db->quoteInto("front = ?", "O");
/* ->join('membre', 'membre.id_membre=contenu.id_membre');*/
$order = "id_content";
return $this->fetchAll($where, $order);
}
}
class membre extends Zend_Db_Table
{
protected $_name = 'membre';
protected $_primary = 'id_membre';
public function getMembreById($id_membre)
{
return $this->fetchAll('id_membre='.$id_membre);
}
public function getAllMembre()
{
return $this->fetchAll();
}
}
////////////////////// controllers /////////
function indexAction()
{
$contenus = new contenu();
$this->view->contenu = $contenus->getContentIntro();
}
////////////////////// views /////////
<?php foreach ($this->contenu as $contenus): ?>
<?php echo $contenus->id_membre; ?>
<?php echo $contenus->nom; ?>
<?PHP endforeach; ?>
////////////////// ERROR /////////////////:
il me donne cette error ???????????????!!!
Fatal error: Uncaught exception 'Zend_Db_Table_Row_Exception' with message 'Specified column "nom" is not in the row' in C:\wamp\www\ZendBlog\library\Zend\Db\Table\Row\Abstract.php:182 Stack trace: #0 C:\wamp\www\ZendBlog\application\views\scripts\index\index.phtml(17): Zend_Db_Table_Row_Abstract->__get('nom') #1 C:\wamp\www\ZendBlog\library\Zend\View.php(107): include('C:\wamp\www\Zen...') #2 C:\wamp\www\ZendBlog\library\Zend\View\Abstract.php(787): Zend_View->_run('.\application\v...') #3 C:\wamp\www\ZendBlog\library\Zend\Controller\Action\Helper\ViewRenderer.php(921): Zend_View_Abstract->render('index/index.pht...') #4 C:\wamp\www\ZendBlog\library\Zend\Controller\Action\Helper\ViewRenderer.php(942): Zend_Controller_Action_Helper_ViewRenderer->renderScript('index/index.pht...', NULL) #5 C:\wamp\www\ZendBlog\library\Zend\Controller\Action\Helper\ViewRenderer.php(981): Zend_Controller_Action_Helper_ViewRenderer->render() #6 C:\wamp\www\ZendBlog\library\Zend\Controller\Action\HelperBroker.php(171): Zend_Controller_Action_H in C:\wamp\www\ZendBlog\library\Zend\Db\Table\Row\Abstract.php on line 182
Hors ligne
Hello,
public function getContentIntro() { $db = $this->getAdapter(); $where = $db->quoteInto("front = ?", "O"); /* ->join('membre', 'membre.id_membre=contenu.id_membre');*/ $order = "id_content"; return $this->fetchAll($where, $order); }
$this->fetchAll implique que tu requêtes sur la table dans laquelle tu es, que si c'est la seule table, dès ton join elle n'est plus prise en compte.
A l'arrache, je dirais :
public function getContentIntro() { $select = $this->select() ->from($this) // <- pour prendre la table content ->join('membre', 'membre.id_membre=contenu.id_membre') ->where('"front = ?", "O") ->order('id_content'); return $this->getAdapter()->fetchAll($select); }
A+
Dernière modification par mikaelkael (04-10-2008 13:12:30)
Hors ligne
en peut utiliser ->join('membre', 'membre.id_membre=contenu.id_membre'); sans déclarer les referenceMap et les depandaces ,
Hors ligne
Hello,
Si c'est bien une question, la réponse est oui
Les $_dependentTables ET $_referenceMap sont utilisées seulement si ton SGDB ne te permet pas de faire l'intégrité référentielle (pour faire les opérations en cascade).
La $_referenceMap peut être utilisée seule pour faire des requêtes de mise en relation automatique (voir la doc).
A+
Hors ligne
j aimrai avoir vos remarques sur la structure et le code de ce petit blog que j réalisé avec zend
voici le lien de téléchargement http://www.portail-rabat.com/ZendBlog.rar
voici un demo http://www.hichamsassa.c.la/
Merci
Dernière modification par hicham (19-11-2008 01:51:25)
Hors ligne
hicham a écrit:
j aimrai avoir vos remarques sur ce petit blog que j réalisé avec zend
voici le lien de téléchargement http://www.portail-rabat.com/ZendBlog.rar
voici un demo http://www.hichamsassa.c.la/
Merci
Le look est classique mais sympa.
En revanche, les liens ne fonctionnent pas...
Hors ligne
en local les ça marche bien, mais quand j l remonté au serveur il ma donné ce probléme
Hors ligne
Bravo pour ton blog hicham . Il est très classique et donc simple à consulter.
Merci aussi de nous en faire partager les sources que j’ai parcourus rapidement (pardon d’avance donc pour les erreurs probables qui vont suivre dans les commentaires) qui sont riches d’enseignement car ils sont d’une grande simplicité et lisibilité d’écriture que ce soient le controleur, les modeles, les formulaires et les vues.
Qqs petites remarques un peu puristes peut-être :
-pourquoi ne pas utiliser les view helper partial et partialloop plutôt que render et foreach ,
-à mon avis ce serait mieux aussi que les formulaires soient regroupés sous un répertoire « forms » sous le répertoire models.
Concernant les liens qui ne marchent pas je me demande si la partie url relative qui provient (si j'ai bien compris) de colonnes de tables est bien alimentée et si tu utilises bien, dans ce cas précis des liens, le helper baseurl.
A+
Hors ligne
Excuse moi hicham mais faute de temps j’ai été beaucoup trop vite ce matin dans mon appréciation de ton Appli et je m’aperçois en y revenant à nouveau depuis qqs minutes qu’en fait de lien perdu il y a me semble-t-il un problème assez sérieux au niveau de la conception « vue contrôleur » qui ne prend pas bien en compte les spécificités de zf à cet égard.
A tous tes liens relatifs à des contenus variables devraient correspondre une action d’un contrôleur cad au final à un script associé à ce couple vue contrôleur. Ce n’est pas du tout le cas si on regarde par exemple les liens que tu construit dans « application\views\scripts\index\categories.phtml » .
Il y a peut-être des connaissances à revoir concernant le ViewRenderer.
D’autre part en supposant que ces liens déclenchent effectivement une action il serait naturel d’afficher le contenu spécifique à cette action en l'insérant dans un layout fixe via le mécanisme du Zend_Layout .
Encore une chose l’usage veut qu’à chaque table corresponde un contrôleur.
Voilà j’aurais du regarder un peu mieux ce matin et ne pas trop me laisser enthousiasmer par la présentation qui est bonne.
Bon courage et A+ .
Hors ligne
Pages: 1