Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
bonsoir / bonjour
apres avoir strictement suivi le tutoriel
ftp://ftp-developpez.com/g-rossolini/tu … -yogui.pdf
je me suis lancer dans la modification de site final produit par le tutoriel
j'en arrive a quelques problèmes que je n'arrive pas a résoudre:
=> je créer une table catégorie
=> j'ajoute une champ Id_cat à Album (évidement) ce qui donne
Categorie(id, Nom_Cat)
Album(id,artist,title,Id_cat)
l'idée serai (dans un premier temps) produire un affichage des champs suivants
artist title Nom_Cat
je pense faire une jointure
dans l'état actuel des choses cela ressemble à peu prés à cela dans mon .phtml
foreach($this->Album as $album) : echo $this->escape($Album->Artite); echo $this->escape($Album->title); foreach($this->Categorie as $categorie) : if($categorie->id==$Album->Id_Cat) { echo $this->escape($categorie->Nom_Cat); } endforeach endforeach
extrait de code de mon indexcontrolleur
$album = new Album(); $this->view->Album = $album->fetchAll(); $categorie = new Categorie(); $this->view->Categorie = $categorie->fetchAll();
je ne trouve pas cela très performant
et cela risque de devenir ingérable
j'ai essayer des choses de ce genre ci
$select = $db->query('SELECT champ FROM table'); $rows = $select->fetchAll();
en vain car dans le tutoriel de référence le seul $db et défini dans zf-tutorial/index.php
visiblement il y a quelque chose que je n'ai pas saisi si quelqu'un pouvait m'éclaircir cela
merci d'avance
Hors ligne
Bonsoir,
Si tu souhaites tester ta méthode, il faut que tu récupères ton objet instancé dans ton bootstrap.
Il y a 2 solutions. Soit tu utilises le mot clef global dans ta methode.
Soit, la solution recommandée, dans ton bootstrap, tu ajoutes après avoir instancé $db
Zend_Registry::set('database', $db);
Et tu récupères dans tes classes via :
$db = Zend_Registry::get('database');
+, Damien
Hors ligne
Bonjour,
J'ai exactement le même type de problème !
Dans mon contrôleur :
$client = new Client(); $requete = $client->getDefaultAdapter()->select()->from('Client')->query(); $requete->fetchAll();
Dans ma vue :
<?php foreach($this->clients as $client) : echo $this->escape($client->RaisonSociale); endforeach; ?>
Quelqu'un a-t-il une idée ?
Merci !!
J-Zender.
Hors ligne
Bonjour J-Zender,
As-tu essayé de faire directement (si ta classe étend Zend_DB_Table) ?
$client->fetchAll();
+, Damien
Hors ligne
Oui Damien, avec $client->fetchAll(), cela fonctionne. Mais mon but est ensuite de faire des $db->select()->join(), et donc de récupérer le résultat d'un $db->query()->fetchAll() dans ma vue.
$client->fetchAll(), je n'y arrive qu'avec une seule table, pas pour les jointures entre plusieurs tables.
En utilisant $client->fetchAll(), je récupère une variable $this->clients dans ma vue, et l'affichage des résultats se fait avec un foreach($this->clients as $client). Mais ça ne fonctionne plus dès que je n'utilise pas $client->fetchAll().
Une idée ?
Hors ligne
Est-ce que le programme te renvoi une erreur ?
Je viens d'éplucher à nouveau la documentation et il me semble que la méthode soit correcte.
As-tu essayé de décomposer la commande pour voir si à un endroit quelque chose bloque le système ?
Hors ligne
Oui, j'obtiens cette erreur :
Notice: Trying to get property of non-object in C:\wamp\phenix\www\test\application\views\scripts\index\index.phtml on line 4
La méthode est pourtant conseillée dans la doc.
Je suis parti de ce célèbre tutoriel, avec un projet fonctionnel :
ftp://ftp-developpez.com/g-rossolini/tu … -yogui.pdf
Je l'ai simplifié de la façon suivante :
/index.php (tu remarqueras que j'ai sauvé l'adapter dans le registre)
<?php error_reporting(E_ALL|E_STRICT); date_default_timezone_set('Europe/Paris'); set_include_path('.' . PATH_SEPARATOR . './library' . PATH_SEPARATOR . './application/models/' . PATH_SEPARATOR . get_include_path()); include "Zend/Loader.php"; Zend_Loader::loadClass('Zend_Controller_Front'); Zend_Loader::loadClass('Zend_Config_Ini'); Zend_Loader::loadClass('Zend_Registry'); Zend_Loader::loadClass('Zend_Db'); Zend_Loader::loadClass('Zend_Db_Table'); // load configuration $config = new Zend_Config_Ini('./application/config.ini', 'general'); $registry = Zend_Registry::getInstance(); $registry->set('config', $config); // setup database $db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray()); Zend_Db_Table::setDefaultAdapter($db); $registry->set('adapter', $db); // setup controller $frontController = Zend_Controller_Front::getInstance(); $frontController->throwExceptions(true); $frontController->setControllerDirectory('./application/controllers'); // run! $frontController->dispatch();
/application/controllers/IndexController.php (l'adapter est récupéré)
<?php class IndexController extends Zend_Controller_Action { function init() { $this->view->baseUrl = $this->_request->getBaseUrl(); Zend_Loader::loadClass('Client'); } function indexAction() { $this->view->title = "Tous les clients"; /*$client = new Client(); $this->view->clients = $client->fetchAll();*/ $db = Zend_Registry::get('adapter'); //$db = Client::getDefaultAdapter(); //$select = $db->query('SELECT * FROM Client'); $this->view->clients = $db->query('SELECT * FROM Client')->fetchAll(); } }
/application/models/Client.php (modèle correspondant à la table)
<?php class Client extends Zend_Db_Table_Abstract { protected $_name = 'Client'; protected $_primary = 'NumClient'; }
/application/views/index/index.phtml (la vue)
<h1><?php echo $this->escape($this->title); ?></h1> <?php foreach($this->clients as $client) : echo $this->escape($client->RaisonSociale);?> <br> <?php endforeach; ?>
Arriver à utiliser l'adapter $db pour faire des requêtes sur des tables, c'est l'enjeu !
A la place de la sauvegarde de l'adapter dans le registre, j'ai lu quelque part que je pouvais faire :
$client->getAdapter()
et qu'il y avait aussi une fonction
getDefaultAdapter()
pour Zend_Db_Table (d'où le
Zend_Db_Table::setDefaultAdapter($db);
dans index.php). Problème : ça ne semble pas fonctionner ...
HELLLP PLEAAASE !!!
Hors ligne
Essaye en ajoutant ca :
$this->getAdapter()->setFetchMode(Zend_Db::FETCH_OBJ);
Alors je sasi pas trop ou tu va sle mettre ton code j'ai pas tout suivi.
tu dois le faire avant d'effectuer ta requete, normalement ca devrait marcher.
Sinon au lieu de :
echo $this->escape($client->RaisonSociale);?>
Tu dosi mettre :
echo $this->escape($client["RaisonSociale"];?>
C'est là que ca bloque.
Dernière modification par alien7 (01-08-2007 15:51:19)
Hors ligne
Je pense peut-être avoir trouvé ta solution, si c'est comme décrit ci-dessous.
Dans mes classes : fetchAll me retourne toujours un tableau php. L'erreur vient peut-être de là.
A la ligne 4 de ton index.phtml il y a :
echo $this->escape($client->RaisonSociale);
As-tu essayé de remplacer par :
echo $this->escape($client['RaisonSociale']);
Si ce n'est pas cela essaye de placer à la place de ton foreach et regarder le type de données :
<pre> print_r($this->clients);
Hors ligne
Lis mon post plus haut Ysaak j'ai update
Hors ligne
Effectivement, ça fonctionne !!!
$db->setFetchMode(Zend_Db::FETCH_OBJ);
Tu saurais m'expliquer pourquoi ? Les résultats n'étaient pas sous forme de tableau ?
Merci beaucoup en tout cas !!
Hors ligne
Alien7, j'ai été grillé lors de la rédaction de mon message ^^
jzender :
Si en effet, mais tu cherchais à récupérer les informations comme avec un objet. La méthode que alien7 t'a donné dit à l'adapter de te renvoyer les informations sous forme d'objet et non de tableau.
+
Hors ligne
Effectivement,
echo $this->escape($client['RaisonSociale']);
fonctionne lorsque je retire :
$db->setFetchMode(Zend_Db::FETCH_OBJ);
Merci beaucoup !!
Hors ligne
Merci à tous , je n'ai pas eut le temps auparavant de tester à l'heure actuelle , si je fait un var_dump sa à l'air de marcher :-)
Hors ligne