"Je peut ajouter des users par fixtures mais il m'est impossible d'en ajouter à partir de la liste des users apres CRUD.
Merci d'avance.
J'ai vraiment besoin de votre aide."

Ce que je veux

Je souhaite ajouter ou modifier un user dans l'interface utilisateur.J

Ce que j'obtiens

An exception has been thrown during the rendering of a template ("Notice: Array to string conversion"). :(moi qui voulait ajouter ou modifier un user dans l'interface utilisateur

10 réponses


gillesr
Réponse acceptée

J'ai fais un petit peu de ménage dans l'affichage pour qu'on voit ton code correctement.
question subsidiaire : sur quelle route obtiens tu le message d'erreur ?

Bonjour,

il va nous falloir plus de détails pour t'aider. Avec quoi fait tu ton CRUD ?
Tu as une exception qui est envoyée donc il faut partir du message d'erreur, montre nous le code de la partie de ton template qui pose problème et celui du controleur qui lui envoie les données.

Salut gillesr,
voici le code:
UserController:"
/**

  • @Route("/new", name="user_new", methods={"GET","POST"})
    */
    public function new(Request $request): Response
    {
    $user = new User();
    $form = $this->createForm(UserType::class, $user);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();
    
        return $this->redirectToRoute('user_index', [], Response::HTTP_SEE_OTHER);
    }
    
    return $this->renderForm('user/new.html.twig', [
        'user' => $user,
        'form' => $form,
    ]);

    }

    /**

  • @Route("/{id}", name="user_show", methods={"GET"})
    */
    public function show(User $user): Response
    {
    return $this->render('user/show.html.twig', [
    'user' => $user,
    ]);
    }

    /**

  • @Route("/{id}/edit", name="user_edit", methods={"GET","POST"})
    */
    public function edit(Request $request, User $user): Response
    {
    $form = $this->createForm(UserType::class, $user);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $this->getDoctrine()->getManager()->flush();
    
        return $this->redirectToRoute('user_index', [], Response::HTTP_SEE_OTHER);
    }
    
    return $this->renderForm('user/edit.html.twig', [
        'user' => $user,
        'form' => $form,
    ]);

    }
    "

new.twig:
"
{% extends 'base.html.twig' %}

{% block title %}New User{% endblock %}

{% block body %}
<h1>Create new User</h1>

{{ include('user/_form.html.twig') }}

<a href="{{ path('user_index') }}">back to list</a>

{% endblock %}

"
edit.twig:

"
{% extends 'base.html.twig' %}

{% block title %}Edit User{% endblock %}

{% block body %}
<h1>Edit User</h1>

{{ include('user/_form.html.twig', {'button_label': 'Update'}) }}

<a href="{{ path('user_index') }}">back to list</a>

{{ include('user/_delete_form.html.twig') }}

{% endblock %}
"

form:
"
{{ form_start(form) }}
{{ form_widget(form) }}
<button class="btn">{{ button_label|default('Save') }}</button>
{{ form_end(form) }}

"

<?php

namespace App\Form;

use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email')
->add('roles')
->add('password')
;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => User::class,
    ]);
}

}

UserController :


   /**

    @Route("/new", name="user_new", methods={"GET","POST"})
    */
    public function new(Request $request): Response
    {
    $user = new User();
    $form = $this->createForm(UserType::class, $user);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();

        return $this->redirectToRoute('user_index', [], Response::HTTP_SEE_OTHER);
    }

    return $this->renderForm('user/new.html.twig', [
        'user' => $user,
        'form' => $form,
    ]);

    }

    /**

    @Route("/{id}", name="user_show", methods={"GET"})
    */
    public function show(User $user): Response
    {
        return $this->render('user/show.html.twig', [
            'user' => $user,
        ]);
    }

    /**
    @Route("/{id}/edit", name="user_edit", methods={"GET","POST"})
    */
    public function edit(Request $request, User $user): Response
    {
        $form = $this->createForm(UserType::class, $user);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $this->getDoctrine()->getManager()->flush();

            return $this->redirectToRoute('user_index', [], Response::HTTP_SEE_OTHER);
        }

        return $this->renderForm('user/edit.html.twig', [
            'user' => $user,
            'form' => $form,
        ]);

    }

new.twig:


{% extends 'base.html.twig' %}

    {% block title %}New User{% endblock %}

    {% block body %}
        <h1>Create new User</h1>

            {{ include('user/_form.html.twig') }}

        <a href="{{ path('user_index') }}">back to list</a>

    {% endblock %}

edit.twig:


{% extends 'base.html.twig' %}

    {% block title %}Edit User{% endblock %}

    {% block body %}
        <h1>Edit User</h1>

        {{ include('user/_form.html.twig', {'button_label': 'Update'}) }}

        <a href="{{ path('user_index') }}">back to list</a>

        {{ include('user/_delete_form.html.twig') }}

    {% endblock %}

form:


{{ form_start(form) }}
    {{ form_widget(form) }}
    <button class="btn">{{ button_label|default('Save') }}</button>
{{ form_end(form) }}

<?php

namespace App\Form;

use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email')
            ->add('roles')
            ->add('password');
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
        ]);
    }

}

par erreur j'ai marqué comme résolu mais tel n'est pas le cas.
Pour ta question c'est dans user/new quand je veux ajouter un nouveau utilisateur ou l'éditer j'obtiens cette erreur:
"An exception has been thrown during the rendering of a template ("Notice: Array to string conversion") "

Essaie de remplacer :


return $this->renderForm('user/new.html.twig', [
    'user' => $user,
    'form' => $form,
]);

par

return $this->render('user/new.html.twig', [
    'user' => $user,
    'form' => $form,
]);

Merci gillesr mais ça ne règle toujours pas mon problème.
Mais quand j'enlève " {{ include('user/_form.html.twig') }} " dans le new.twig pas d'erreur mais rien ne s'affiche à par le h1.
Donc je pense c'est dans _form.html.twig

Bonjour,
essaie ça :


return $this->renderForm('user/new.html.twig', [
        'user' => $user,
        'form' => $form->createView(),
    ]);

J'ai eu exactement le même problème, et pour être honnête, je ne sais toujours pas comment le résoudre. C'est très étrange pour moi, car j'ai même pu installer un système ajax récemment, bien que je n'aie jamais rien fait de tel auparavant, et maintenant je n'arrive pas à trouver un bug dans le code, bien que je travaille dessus depuis longtemps.

Salut,
C'est parce que "roles" est un array dans ton entité User. Essaye avec :

$builder
           ->add('roles', ChoiceType::class, [
                'choices' => [
                    'ROLE_ADMIN' => 'ROLE_ADMIN',
                    'ROLE_USER' => 'ROLE_USER',
                ],
            ]);