[Symfony] Erreur afficher article d'une catégorie
Salut j'essaie d'afficher les articles d'une catégorie quand on click sur une catégorie.
Mon erreur est :
Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'Doctrine_Collection::getArticle' was given in C:\development\sfprojects\blog\lib\vendor\symfony\lib\view\escaper\sfOutputEscaperObjectDecorator.class.php on line 64****Warning: Invalid argument supplied for foreach() in C:\development\sfprojects\blog\apps\frontend\modules\category\templates\showSuccess.php on line 1
Pourtant il me semble bien avoir appliquer le tutoriel tout en le modifiant à ma guise pour mon blog.
Alors j'ai ceci dans le action.class.php de mo module category
public function executeShow(sfWebRequest $request) { $this->category = $this->getRoute()->getObject(); }
Dans mon template
Et dans mon BlogCategory.class.php
Voilà je ne comprend pas pourqu'oi cette erreur.
Merci de ton aide et désolé si ton forum se transforme en chat à cause de moi -_-.
Réponses apportées à cette discussion
Vérifie le type de $category en faisant un var_dump() dessus. Apparemment ta variable $category est en fait une collection d'objets Category et non un objet Category en lui même.
Ok j'avais déjà fais un var_dump par curiosité mais j'avais rien compris.
Cependant la première ligne est :
object(Doctrine_Collection)#74 (9) {
Donc comment je fais pour que sa marche stp!
Tu as bien un objet Doctrine_Collection... Peux-tu me donner la définition de ta route vers la page ainsi que le code qui te permet de récupérer ta catégorie stp ?
Ok le route c'est
category: url: /category/:slug class: sfDoctrineRoute param: { module: category, action: show } options: { model: BlogCategory, type: object }
et pour récuperer la catégorie
class BlogCategoryTable extends Doctrine_Table{ public function getCategory() { $q = $this->createQuery('c'); return $q->execute(); } }
Mais la ce code sert à sélectionner toutes les catégories -_-.
Merci de ton aide !
Ok j'ai compri, j'ai renommé cette fonction en getAllCategory.
Maintenant je dois faire une fonction getCategory , mais dans le where je met quoi stp !
Déjà commence par renommer ta fonction par getAllCategories(), ce qui a plus de sens au pluriel dans la mesure où tu vas récupérer une collection d'objets.
Ensuite, remplace la définition de ta route par celle-ci :
category: url: /category/:slug param: { module: category, action: show }
Puis dans ta classe BlogCategoryTable, tu ajoutes cette méthode :
public function getCategoryBySlug($slug){ return $this->createQuery('c') ->where('c.slug = ?', $slug) ->fetchOne();}
Enfin dans ta méthode executeShow() de ton module category, tu fais :
public function executeShow(sfWebRequest $request){ $this->category = Doctrine::getTable('BlogCategory')->getCategoryBySlug($request->getParameter('slug')); $this->forward404Unless($this->category);}
Ca devrait ensuite marcher.
++
Tu me croiras pas, mais j'ai toujours une erreur.
La première ligne du var_dump est maintenant
object(Doctrine_Query)#63 (35) {
Sinon j'ai enlevé le fetchOne.
Je vois pas quoi faire, l'erreur est :
Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, 'Doctrine_Query::getArticle' was given in C:\development\sfprojects\blog\lib\vendor\symfony\lib\view\escaper\sfOutputEscaperObjectDecorator.class.php on line 64 Warning: Invalid argument supplied for foreach() in C:\development\sfprojects\blog\apps\frontend\modules\category\templates\showSuccess.php on line 1
Merci :)
Pourquoi enlèves-tu le fetchOne() ?
Car le fetchOne c'est pour transformer en tableau mais moi je l'utilise en tant qu'objet.
Et avec le fetchOne sa faisait une erreur fatal en plus.
Remplace fetchOne() par findOne()
Fatal error: Call to undefined method Doctrine_Query::findOne() in C:\development\sfprojects\blog\lib\model\doctrine\BlogCategoryTable.class.php on line 16
C'est en forgeant qu'on devient forgeron... :p
Tu peux encore faire plus simple en fait. Supprime la méthode getCategoryBySlug() et dans ton actions.class.php, tu fais ça :
public function executeShow(sfWebRequest $request){ $this->category = Doctrine::getTable('BlogCategory')->findOneBySlug($request->getParameter('slug')); $this->forward404Unless($this->category);}
++
Hum sa marche c'est cool!
Mais crois pas que tu vas te reposé je vais m'attaqué à la pagination bientôt sa va être un massacre lol :p.
Mais en faite en ayant pratiqué un peu symfony les deux avantages que je vois ce sont :
les tests (une application professionnelle ne peut se passer de cela)
la génération automatique du quaternaire (show/edit/delete/add).
Merci, mais cependant j'ai trouvé un défaut .
Dans la doc il n'y a pas un super moteur de recherche comme sur le site de php ou tu tapes le nom d'une fonction et il t'affiche comment elle marche. Là on est obligé de chercher à la main et j'ai toujours pas compris comment fonctionner la doc.
Pour Doctrine, la vraie documentation se trouve ici : http://www.doctrine-project.org/documentation/manual/1_0/en/one-page
Le menu de droite est suffisant explicite pour comprendre où aller chercher rapidement de l'information. Et puis à coups de CTRL + F, on trouve vite ce que l'on veut.
Tu peux aussi regarder la doc technique de l'API pour prendre connaissance des méthodes disponibles dans chaque classe.
Enfin pour la pagination, tu as tout dans le tutoriel Jobeet ainsi que dans la documentation de Doctrine ;)
Oui je sais je me sert de jobeet pour faire mon blog en paralèlle .
Mais un truc intéressant à faire serait de chronométrer en combien d'heure ou minute on peut faire un blog avec un petit bckoffice avec symfony ^^.
En une demi journée ça peut être plié pour un truc de base avec catégories, articles et commentaires.