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;