Bonjour,

Alors voilà je me tire les cheveux : je comprend pas ce que ce passe.
Mon bundle me sert à ajouter des article à un blog. Jusque la tout marchait bien et depuis peu impossible : J'ai un setter qui part en vrille ... Il ne me reconnait plus la variable $Author des que je clique sur enregistrer !

Voici mon controller :

(Dans le premier vardump il m'affiche bien ma variable, dans le second, il m'affiche null !)

    public function addAction(Request $request)
    {
        $listImages = $this->getDoctrine()
          ->getManager()
          ->getRepository('AMImageManagerBundle:Image')
          ->getImagesActivites(); 

        $article = new Article();
        var_dump($article);
        $form = $this->get('form.factory')->create(ArticleType::class, $article);

        if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
          var_dump($article);
          $em = $this->getDoctrine()->getManager();
          $em->persist($article);
          $em->flush();

          $request->getSession()->getFlashBag()->add('notice', 'Article bien enregistré.');

          return $this->redirectToRoute('AM_Blog_view', array('id' => $article->getId()));
        }

        return $this->render('AMBlogBundle:Article:add.html.twig', array(
          'form' => $form->createView(),
          'listImages' => $listImages,
        ));
    }

Mon entité ou je persist par default ma variable :

namespace AM\BlogBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Article
 *
 * @ORM\Table(name="article")
 * @ORM\Entity(repositoryClass="AM\BlogBundle\Repository\ArticleRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class Article
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="title", type="string", length=255)
     * @Assert\Length(min=10, minMessage="Le titre doit comporter 10 caractères minimum")
     */
    private $title;

    /**
     * @var string
     *
     * @ORM\Column(name="author", type="string", length=255)
     * @Assert\NotBlank()
     */
    private $author;

    /**
     * @var string
     *
     * @ORM\Column(name="content", type="text")
     * @Assert\NotBlank()
     */
    private $content;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="date", type="datetime")
     * @Assert\DateTime()
     */
    private $date;

    public function __construct()
    {
        $this->date = new \Datetime();
        $this->author = 'MOI';
    }

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set title
     *
     * @param string $title
     *
     * @return Article
     */
    public function setTitle($title)
    {
        $this->title = $title;

        return $this;
    }

    /**
     * Get title
     *
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * Set author
     *
     * @param string $author
     *
     * @return Article
     */
    public function setAuthor($author)
    {
        $this->author = $author;

        return $this;
    }

    /**
     * Get author
     *
     * @return string
     */
    public function getAuthor()
    {
        return $this->author;
    }

 // ...
 }

J'ai même essayé dans mon form :

    ->add('author',    TextType::class,
          array('label' => 'Auteur',
               'data' => 'Re Moi'))

Dans ma vue je vois bien "Re Moi" mais des que je clique sur Enregistrer, l'input se vide et me dit de le remplir ...
Quelqu'un peut m'aider ? Merci d'avance.

4 réponses


Salut,

essaye de mettre $form->handleRequest($request); avant ton if.

et de mettre en 2ème condition dans ton if $form->isValid()

Si cela ne fait rien, est-il possible de voir ton ArticleType?

Tu as toujours la possibilité de faire un var_dump($form->getData()) pour voir ce qui sort de ton formulaire

Bonjour,

J'ai essay écela ne change rien du tout ...

Voici mon ArticleType entier :

<?php

namespace AM\BlogBundle\Form;

use AM\BlogBundle\Repository\CategoryRepository;
use AM\ImageManagerBundle\Repository\ImageRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;

class ArticleType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $pattern = 'Activites';

    $builder
    ->add('date',      DateType::class)
    ->add('title',     TextType::class, 
          array('label' => 'Titre'))
    ->add('image',     EntityType::class, 
          array(
            'class'        => 'AMImageManagerBundle:Image',
            'choice_label' => 'alt',
            'expanded' => true,
            'multiple' => false,
            'query_builder' => function(ImageRepository $repository) use($pattern){
                return $repository->getLikeQueryBuilder($pattern);
            }))
    ->add('content',   TextareaType::class, 
          array (
            'label' => 'Contenu',
            'attr' => array(
                'class' => 'tinymce',
                'data-theme' => 'advanced',
            )))
    ->add('author',    TextType::class,
          array('label' => 'Auteur',
               'data' => 'Re Moi'))

    ->add('categories', EntityType::class, 
          array(
            'class'        => 'AMBlogBundle:Category',
            'choice_label' => 'name',
            'multiple'     => true,
            'expanded' => true,
            'query_builder' => function(CategoryRepository $repository) use($pattern){
                return $repository->getLikeQueryBuilder($pattern);
              }))

    ->add('state',     ChoiceType::class, 
          array(
            'choices'  => array(
                'Enregistrée' => 'Enregistree',
                'Publiée' => 'Publiee'),
            'label' => 'Etat', 
            'expanded' => true,
            'multiple' => false))

    ->add('distance',  TextType::class)
    ->add('city',      TextType::class, 
          array('label' => 'Ville'))
    ->add('save',      SubmitType::class, 
          array('label' => 'Enregistrer'))
    ;
}

/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AM\BlogBundle\Entity\Article'
    ));
}
}

que dit le var_dump($form->getData()) au début de ton if ?

Juste avant le If il dit cela :

object(AM\BlogBundle\Entity\Article)[425]
  private 'id' => null
  private 'title' => null
  private 'author' => string 'MOI' (length=3)
  private 'content' => null
  private 'date' => 
    object(DateTime)[424]
      public 'date' => string '2016-11-01 08:27:25' (length=19)
      public 'timezone_type' => int 3
      public 'timezone' => string 'Europe/Paris' (length=12)
  private 'state' => null

dans mon if : (J'ai du enlever le NotBlank() sinon on ne rentre meme pas dedans)

object(AM\BlogBundle\Entity\Article)[425]
  private 'id' => null
  private 'title' => string 'Mon titre de 10 caracteres' (length=26)
  private 'author' => null
  private 'content' => string '<div class="clearfix">&nbsp;</div>
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Incidunt quibusdam corporis ipsa adipisci inventore itaque. Repudiandae doloremque eaque expedita ab praesentium ducimus minima dicta molestiae! Quis, consequatur alias rerum temporibus!</div>
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Incidunt quibusdam corporis ipsa adipisci inventore itaque. Repudi'... (length=674)
  private 'date' => 
    object(DateTime)[916]
      public 'date' => string '2016-11-01 00:00:00' (length=19)
      public 'timezone_type' => int 3
      public 'timezone' => string 'Europe/Paris' (length=12)
  private 'state' => string 'Enregistree' (length=11)