0
votes

I would like a user to be able to leave a review(comment) about a user on it public profile.

Once I refresh the public profile page I have this error:

An exception has been thrown during the rendering of a template ("Controller "FLY\BookingsBundle\Controller\PostController::commentAction()" requires that you provide a value for the "$entity" argument (because there is no default value or because there is a non optional argument after this one).") in ApplicationSonataUserBundle:Profile:UserShow.html.twig at line 108.

The url of the public profile look like this :

http://127.0.0.1/symfony/web/app_dev.php/user/show/john/26

Routing.yml

userShow:
     pattern:  /user/show/{entity}/{slug}
     defaults: { _controller: FLYBookingsBundle:Post:userShow }


comment:
    pattern:  /user/show/{entity}/{slug}
    defaults: { _controller: FLYBookingsBundle:Post:comment }
    requirements:
        _method:  POST

PostController.php

public function userShowAction($entity)
{

    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('ApplicationSonataUserBundle:User')->findBy(array('username' => $entity));

    $user = $em->getRepository('ApplicationSonataUserBundle:Avatar')->findBy(array('user' => $entity));

    return $this->render('ApplicationSonataUserBundle:Profile:UserShow.html.twig', array('user' => $user,'entity' => $entity));
}

.

public function commentAction(Request $request,$entity)
{
    $em = $this->getDoctrine()->getManager();
    $user = $this->container->get('security.token_storage')->getToken()->getUser();
    $comment = new Comment();
    $entity = $em->getRepository('ApplicationSonataUserBundle:User')->findBy(array('username' => $entity));
    $form = $this->createForm( new CommentType(),$comment);
    dump($form);
    if ($this->get('request')->getMethod() == 'POST') {
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $comment->setCreatedAt(new \DateTime());
            $comment->setApproved(true);

            $comment->setRecipient();

            $comment->setAuthor($this->container->get('security.token_storage')->getToken()->getUser());
            $em->persist($comment);
            $em->flush();
            $this->get('session')->getFlashBag()->add(
                'success',
                'Your comment was succesfully added'
            );
        }
        return $this->redirect($this->generateUrl('userShow', array(
            'entity' => $entity,
            //'slug' => $slug,
        )));

    }

    return $this->render('ApplicationSonataUserBundle:Profile:commentForm.html.twig', array( 'entity' => $entity,'user' => $user,'comment' => $comment,
        'form' => $form->createView()));
}

UserShow.html.twig

{% for entity in entity %}

     <div class="row">                       
         <div class="col-sm-9">  

     {{ render(controller('FLYBookingsBundle:Post:comment')) }}

          </div>
      </div>
{% endfor %}

CommentForm.html.twig

            <form action="{{ path('comment', {'entity': entity, 'slug':entity.user.id}) }}" method="POST">
        {{ form_start(form) }}
        {{ form_errors(form) }}
                    <div class="form-group">
                        <label>Review Text</label>
                        {{ form_widget(form.body, { 'attr': {'class': 'form-control','style': 'width: 100%', } }) }}
                        {{ form_errors(form.body) }}
                    </div>
                <button style="float: right;font-size: 14px; height: 40px; width: 180px;" type="submit">Leave a Review</button>
        {{ form_rest(form) }}
    </form>

ADD:

public function userShowAction(Request $request,$entity,$slug)
{

    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('ApplicationSonataUserBundle:User')->findBy(array('username' => $entity));
    $useravatar = $em->getRepository('ApplicationSonataUserBundle:Avatar')->findBy(array('user' => $entity));
    $recipient = $em->getRepository('ApplicationSonataUserBundle:User')->findOneBy(array('id' => $slug));
    $comment = new Comment();
    $user = new User();
    $form = $this->createForm( new CommentType(),$comment);
    if ($this->get('request')->getMethod() == 'POST') {
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $comment->setCreatedAt(new \DateTime());
            $comment->setApproved(true);
            $comment->setRecipient($recipient);
            dump($entity);
            $comment->setAuthor($this->container->get('security.token_storage')->getToken()->getUser());
            $em->persist($comment);
            $em->flush();
            $this->get('session')->getFlashBag()->add(
                'success',
                'Your comment was succesfully added'
            );
        }

        return $this->redirect($this->generateUrl('userShow', array(
            'entity' => $comment->getRecipient(),
            'slug' =>  $slug
        )));


    }

    return $this->render('ApplicationSonataUserBundle:Profile:UserShow.html.twig', array('useravatar' => $useravatar,'user' => $user,'entity' => $entity,'form' => $form->createView()));
}

.

Comment.php

<?php

namespace Application\Sonata\UserBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\HasLifecycleCallbacks
 * @ORM\Entity
 * @ORM\Entity(repositoryClass="Application\Sonata\UserBundle\Entity\UserRepository")
 * @ORM\Table(name="comment")
 *
 */

class Comment
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @var User
     * @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="commentrecipient")
     * @ORM\JoinColumn(onDelete="CASCADE")
     *
     */
    protected $recipient;

    /**
     * @var User
     * @ORM\ManyToOne(targetEntity="Application\Sonata\UserBundle\Entity\User", inversedBy="comment")
     */
    protected $author;

    /**
     * @ORM\Column(name="approved",type="boolean", nullable=true)
     */
    protected $approved;

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

    /**
     * @ORM\Column(name="createdAt", type="datetime", nullable=false)
     */
    protected $createdAt;
    /**
     * @ORM\Column(name="updatedAt", type="datetime", nullable=false)
     */
    protected $updatedAt;

    public function __toString()
    {
        return (string) $this->getRecipient();
    }

    public function __construct()
    {
        $this->setCreatedAt(new \DateTime());
        $this->setUpdatedAt(new \DateTime());
        $this->setApproved(true);

    }
}

User.php

/**
 * @ORM\OneToMany(targetEntity="Application\Sonata\UserBundle\Entity\Comment", mappedBy="recipient", cascade={"persist"})
 * @ORM\JoinColumn(nullable=true)
 */
protected $commentrecipient;
1

1 Answers

1
votes

FLYBookingsBundle:Post:comment require parameter.

Change {{ render(controller('FLYBookingsBundle:Post:comment')) }} to

{{ render(controller('FLYBookingsBundle:Post:comment', {'entity' : entity )) }}

in UserShow.html.twig