Je suis un débutant depuis peu avec Symfony 2, je suis actuellement étudiant et je fais mon projet de stage avec Symfony 2.3.42 et je suis le tutoriel du Site du zéro pour d'abord me familiariser avec Symfony 2 et étudier les cas similaires possibles avant de m'attaquer à mon projet de stage.
Je rencontre un problème au niveau de la modification d'une entité article en utulisant les formulaires, Symfony m'envoie cette erreur:
The form's view data is expected to be an instance of class Sdz\BlogBundle\Entity\Article, but is a(n) array. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms a(n) array to an instance of Sdz\BlogBundle\Entity\Article.
if (null !== $dataClass && !$viewData instanceof $dataClass) {
throw new LogicException(
'The form\'s view data is expected to be an instance of class '.
$dataClass.', but is '.$actualType.'. You can avoid this error '.
'by setting the "data_class" option to null or by adding a view '.
Voici mon voirAction: (j'ai mis en commentaire les instructions pour l'enregistrement car pour le moment je veux juste que le formulaire affiche les informations sur l'article $art instancié pour aprés pouvoir les modifier)
public function voirAction()
{
$art = $this->getDoctrine()
->getRepository('Sdz\BlogBundle\Entity\Article')
->findByTitre("lalao");
//Modification
$form = $this->createForm(new ArticleType, $art);
/**
$request = $this->get('request');
if ($request->getMethod() == 'POST')
{
// On fait le lien Requête <-> Formulaire
// A partir de maintenant, la variable $article contient les valeurs entrées dans le formulaire par le visiteur
$form->bind($request);
if ($form->isValid())
{
$em->persist($art);
$em->flush();
return $this->redirect($this->generateUrl('sdzblog_accueil', array('nom' =>'manda')));
}
}
**/
return $this->render('SdzBlogBundle:Blog:voir.html.twig', array('article'=>$art,
'form'=>$form->createView(),
));
}
NB: En plus si je fais $cont=$art->getContenu(); dans ce voirAction apres avoir recuperer le repository, j'ai cette erreur:
FatalErrorException: Error: Call to a member function getContenu() on a non-object in E:\project\PHP\wamp\www\Symfony\src\Sdz\BlogBundle\Controller\BlogController.php line 38
Même si les setter et getter de l'attribut Contenu existent bel et bien dans Article.php, il en est de même avec les autres attributs si je fais ça j'ai toujours cette erreur
Voici mon voir.html.twig:
{% extends "SdzBlogBundle::layout.html.twig" %}
{% block title %} Voir - {{ parent() }} {% endblock %}
{% block sdzblog_body %}
<h2>Liste des PC et Composants de: VOIR</h2>
{% for artcl in article %}
<p>Date: {{artcl.date|date("d/m/Y")}} </p></br>
<p>Titre: {{artcl.titre}} </p></br>
<p>Auteur: {{artcl.auteur}} </p></br>
<p>Contenu: {{artcl.contenu}} </p></br>
<p>Dernière date d'édition: {{artcl.dateEdition|date("d/m/Y")}} </p></br>
{% if artcl.image is not null %}
<img src="{{ artcl.image.url }}" alt="{{ artcl.image.alt }}" />
{% endif %}
<h2>Modifier cet article</h2>
{% include "SdzBlogBundle:Blog:formulaire.html.twig" %}
{%endfor%}
{% endblock %}
L'articleType:
<?php
namespace Sdz\BlogBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class ArticleType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('date','date')
->add('titre','text')
->add('auteur','textarea')
->add('contenu','text')
//->add('image', new ImageType())
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Sdz\BlogBundle\Entity\Article'
));
}
/**
* @return string
*/
public function getName()
{
return 'sdz_blogbundle_article';
}
}
Whouki Salut Oui car je veux la possibité de modifier directement chaque article dans la page voir, aidez moi s'il vous plait j'ai déja beau cherché partout mais j'ai pas encore trouvé la solution
Oui c'est un peu ça, un update. Mais J'ai enfin trouvé au fait ce findBytitre ne renvoie pas une instance d'objet dans mon cas, j'ai essayé avec le find($id) tout simplement et c'est dans ce cas que je peux faire $cont=$art->getContenu(); et aussi $form = $this->createForm(new ArticleType, $art); sans avoir l'erreur que j'ai cité la. Je suis assez étonné quand même que le findBytitre ne retourne pas une instance d'objet article alors que dans le tutoriel j'ai cru comprendre que c'était le cas, en tout cas merci bien Whouki
Oke merci, j'ai résolu mon problème :) J'avais mal compris au fait c'était mon erreur, le getResult() dans le repository retourne un tableau contenant des résultats sous forme d'objets, mais non pas directement un objet, donc il faut parcourir avec un foreach pour avoir accès aux attributs Tandis que le find($id) tout simplement retourne directement une instance d'objet. C'est ça?? Corrige moi stp si jamais je me trompe
C'était pour ça que ça marchait avec le find($id) tout simplement; et q'il y avait les erreurs avec mon findByTitre() qui utilisait la méthode getResult(). Il fallait le foreach dans le controlleur oft. Merci bien de m'avoir donné la puce à l'oreil avec ton var_dump() la
A la prochaine
- Edité par Ilo nomena 20 janvier 2017 à 13:32:28
Ruskov
Problème avec le formulaire de Symfony 2
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.