0

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;
0

1 Answer 1

1

FLYBookingsBundle:Post:comment require parameter.

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

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

in UserShow.html.twig

Sign up to request clarification or add additional context in comments.

7 Comments

@Ryan Vincent . @Adashbob . This morning I have managed to make it work. What I did is to not anymore render my form like this {{ render(controller('FLYBookingsBundle:Post:comment')) }}. I have decided to insert my form directly in the method userShowAction. I'm having another issue, how can I get the user Id of the recipient ? My url look like this : http://127.0.0.1/symfony/web/app_dev.php/user/show/john/26 as you can see here the recipient_id is 26.
what relationship exist betewen User, Comment and Recipiend ? if user is the authenticated user, you can get it by : $this->container->get('security.token_storage')->getToken()->getUser() like have you doing.
A User can't leave a comment if is not logged in , so I can get the author like this: $comment->setAuthor($this->container->get('security.token_storage')->getToken()->getUser()); But I would like to get the recipient_id. In my question on top I have added my table comment and User so you can see the relationship between the two table.
how call you Post:userShow in your view ?
Are you add link in you view to get userShowAction ? in fact if url app_dev.php/user/show/john/26 corresponds to pattern: /user/show/{entity}/{slug} then you can get recipiend_id by adding $slug in parameter of userShowAction and after retrieve recipient by $recipient = $em->getRepository('ApplicationSonataUserBundle:User')->find($slug));
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.