0

記事の管理を含め、ブログ用の作業用バンドルを正常に作成しましたが、コメントが残っています。ユーザーと匿名ユーザーでコメントを分けたい。ユーザーがログインしている場合、作成者のフィールドは表示されず、キャプチャも表示されません。この問題は、フォームビルダー (ユーザーが完全に認証されている場合) と TWIG テンプレートで解決できると思います。しかし、それは良い解決策ですか?もっと簡単な方法はありませんか?だから私Comment.phpはこのフォームを持っています:

<?php

namespace Acme\BlogBundle\Entity;

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

/**
 * @ORM\Entity
 * @ORM\Table(name="comments") 
 */
class Comment
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;              

    /**
     * @ORM\Column(type="string", length=200)    
     * @Assert\NotBlank(
     *      message = "Name cannot be blank"      
     * )    
     * @Assert\Length(
     *      min = "3",
     *      minMessage = "Name is too short"         
     * )     
     */     
    private $author;

    /**
     * @ORM\ManyToOne(targetEntity="\Acme\UserBundle\Entity\User")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")       
     */
    private $user_id;

    /**
     * @ORM\Column(type="string", length=200)
     * @Assert\NotBlank(
     *      message = "E-mail cannot be blank"      
     * )    
     * @Assert\Length(
     *      min = "3",
     *      minMessage = "E-mail is too short"         
     * )
     */
    private $email;              

    /**
     * @ORM\Column(type="text")
     * @Assert\NotBlank(
     *      message = "Message cannot be blank"
     * )     
     * @Assert\Length(
     *      min = "3",
     *      minMessage = "Message is too short"         
     * )     
     */
    private $content;

    /**
     * @ORM\ManyToOne(targetEntity="Article", inversedBy="comments")
     * @ORM\JoinColumn(referencedColumnName="id")
     */
    private $article;              

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

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

        return $this;
    }

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

    /**
     * Set email
     *
     * @param string $email
     * @return Comment
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

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

    /**
     * Set content
     *
     * @param string $content
     * @return Comment
     */
    public function setContent($content)
    {
        $this->content = $content;

        return $this;
    }

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

    /**
     * Set article
     *
     * @param \Acme\BlogBundle\Entity\Article $article
     * @return Comment
     */
    public function setArticle(\Acme\BlogBundle\Entity\Article $article = null)
    {
        $this->article = $article;

        return $this;
    }

    /**
     * Get article
     *
     * @return \Acme\BlogBundle\Entity\Article 
     */
    public function getArticle()
    {
        return $this->article;
    }

    /**
     * Set user_id
     *
     * @param \Acme\UserBundle\Entity\User $userId
     * @return Comment
     */
    public function setUserId(\Acme\UserBundle\Entity\User $userId = null)
    {
        $this->user_id = $userId;

        return $this;
    }

    /**
     * Get user_id
     *
     * @return \Acme\UserBundle\Entity\User 
     */
    public function getUserId()
    {
        return $this->user_id;
    }

これが私の最初の問題であり、次にコメント (むしろ作成者名) の表示に関する 2 つ目の問題でした。$commentsController のプロパティに新しい値を作成する方法がわかりません(プロパティuser_id が NULL でない場合は、この ID を持つこのユーザーに関するUser オブジェクト情報をロードし、それが NULLの場合はプロパティを使用しauthorます。はユーザーによるコメントで、作成者名には下線が引かれます. また、それは私のコントローラーで機能しますか、それとも TWIG テンプレートで実行できますか?

要するに私の質問:

  • ログに記録されたユーザーとログに記録されていないユーザーでビルドされた「コメントを書く」フォームを表示する最良の方法はどれですか(ifフォームビルダーとTWIGテンプレートで使用するのが最も効果的です)
  • 匿名/登録ユーザーによるコメントの区切り方と、登録ユーザーによるコメントの場合、名前に下線が引かれます
4

2 に答える 2

0

そこで、@Dawid Sajdak の回答を使用して、それを自分のコードに入れようとしました。まず、Comment.php検証グループを追加したエンティティを編集しました。

<?php

namespace Acme\BlogBundle\Entity;

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

/**
 * @ORM\Entity(repositoryClass="Acme\BlogBundle\Entity\CommentRepository")
 * @ORM\Table(name="comments") 
 */
class Comment
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;              

    /**
     * @ORM\Column(type="string", length=200, nullable=true)    
     * @Assert\NotBlank(
     *      message = "Name cannot be blank",
     *      groups = {"not_logged"}           
     * )    
     * @Assert\Length(
     *      min = "3",
     *      minMessage = "Name is too short",
     *      groups = {"not_logged"}              
     * )     
     */     
    private $author;

    /**
     * @ORM\ManyToOne(targetEntity="\Acme\UserBundle\Entity\User")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")       
     */
    private $user_id;

    /**
     * @ORM\Column(type="string", length=200, nullable=true)
     * @Assert\NotBlank(
     *      message = "E-mail cannot be blank",
     *      groups = {"not_logged"}           
     * )    
     * @Assert\Email(
     *      message = "E-mail is not valid",
     *      groups = {"not_logged"}     
     * )     
     */
    private $email;

    /**
     * @ORM\Column(type="datetime")   
     */
    protected $published;              

    /**
     * @ORM\Column(type="text")
     * @Assert\NotBlank(
     *      message = "Message cannot be blank"
     * )     
     * @Assert\Length(
     *      min = "3",
     *      minMessage = "Message is too short"         
     * )     
     */
    private $content;

    /**
     * @ORM\ManyToOne(targetEntity="Article", inversedBy="comments")
     * @ORM\JoinColumn(referencedColumnName="id")
     */
    private $article;              

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

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

        return $this;
    }

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

    /**
     * Set email
     *
     * @param string $email
     * @return Comment
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }

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

    /**
     * Set content
     *
     * @param string $content
     * @return Comment
     */
    public function setContent($content)
    {
        $this->content = $content;

        return $this;
    }

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

    /**
     * Set article
     *
     * @param \Acme\BlogBundle\Entity\Article $article
     * @return Comment
     */
    public function setArticle(\Acme\BlogBundle\Entity\Article $article = null)
    {
        $this->article = $article;

        return $this;
    }

    /**
     * Get article
     *
     * @return \Acme\BlogBundle\Entity\Article 
     */
    public function getArticle()
    {
        return $this->article;
    }

    /**
     * Set user_id
     *
     * @param \Acme\UserBundle\Entity\User $userId
     * @return Comment
     */
    public function setUserId(\Acme\UserBundle\Entity\User $userId = null)
    {
        $this->user_id = $userId;

        return $this;
    }

    /**
     * Get user_id
     *
     * @return \Acme\UserBundle\Entity\User 
     */
    public function getUserId()
    {
        return $this->user_id;
    }

    /**
     * Set published
     *
     * @param \DateTime $published
     * @return Comment
     */
    public function setPublished($published)
    {
        $this->published = $published;

        return $this;
    }

    /**
     * Get published
     *
     * @return \DateTime 
     */
    public function getPublished()
    {
        return $this->published;
    }
}

検証グループを使用したのは、それらがないと、管理者である場合、名前と電子メール フィールドが表示されず、フォームを送信した後にエラー メッセージが表示されるためです: 「名前を空白にすることはできません」 ...

したがって、次のステップは新しいを作成することでしたCommentType.php:

<?php

namespace Acme\BlogBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CommentType extends AbstractType
{
    private $user;

    public function __construct($user) {
        $this->user = $user;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\BlogBundle\Entity\Comment',
            'csrf_protection' => true,
        ));
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        if(is_null($this->user)) {
            $builder->add('author', 'text', array('label' => 'Author', 'validation_groups' => array('not_logged')))
                    ->add('email', 'text', array('label' => 'E-mail (will not show)', 'validation_groups' => array('not_logged')));
        }        
            $builder->add('content', 'textarea', array('label' => 'Text',))
                    ->add('save', 'submit', array('label' => 'Submit'));
    }

    public function getName()
    {
        return 'comment';
    }
}

次にDefaultController.php、ユーザーがログインしているかどうかにかかわらず、いくつかの論理的な質問を追加しました。

public function showAction($slug, Request $request)
{
    $em = $this->getDoctrine()->getManager();
    $article = $em->getRepository('AcmeBlogBundle:Article')->findOneBySlug($slug);

    if(!$article)
    {
        throw $this->createNotFoundException('This article does not exists');
    }

    $user = null;
    if(true === $this->get('security.context')->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
        $user = $this->getUser();  // get $user object
    }

    $comment = new Comment();
    $comment->setArticle($article);

    $form = $this->createForm(new CommentType($user), $comment);
    $form->handleRequest($request);

    if($form->isValid())
    {
        $comment->setPublished(new \DateTime('now')); // don't forget to set publish date

        if($user) {
            $comment->setUserId($user); // set User_id
        }

        $em = $this->getDoctrine()->getManager();
        $em->persist($comment);
        try {
            $em->flush();
        } catch (\PDOException $e) {
            // sth
        }
        $this->get('session')->getFlashBag()->add(
            'success',
            'Your comment was succesfully added'
        );
        return $this->redirect($this->generateUrl('default_blog_show', array('slug' => $slug)).'#comments'); // redirect  
    }

    return $this->render('AcmeBlogBundle:Default:show.html.twig', array('article' => $article, 'form' => $form->createView()));
}

show.html.twig次に、コメントと新しいコメントのフォームを表示する準備をする必要があります。

{% for comment in article.comments %}
  <div style="border: 1px solid black; margin: 10px 0; padding: 5px;">
      <div style="border-bottom: 1px solid black;">
          {% if app.user %}{% if comment.userId is null %}{{ comment.email }}{% else %}{{ comment.userId.email }}{% endif %}{% endif %}<p>Written by: {% if comment.userId is null %}{{ comment.author }}{% else %}<strong>{{ comment.userId.username }}</strong>{% endif %} at {{ comment.published|date('d.n.Y H:i:s') }}</p>
      </div>
      <p>{{ comment.content }}</p>
  </div>
{% else %}
<h2>No comments, be first!</h2>
{% endfor %}
<hr />
<fieldset style="padding: 10px; margin: 10px; border: 1px solid black;">
    <legend style="background-color: skyblue; padding: 5px;">New comment</legend>
{{ form(form) }}
</fieldset>

そして、それは完了です。最後に、公開日の ASC でコメントを並べ替える場合は、$commentsプロパティの注釈をArticle.phpエンティティに追加する必要があります。

/**
 * @ORM\OneToMany(targetEntity="Comment", mappedBy="article")
 * @ORM\OrderBy({"published" = "ASC"})     
 */
private $comments;  
于 2013-10-31T14:23:41.257 に答える
0

フォームの作成にはFormBuilderを使用してください。

$userのような新しい引数をCommentType コンストラクターに追加します

private $user;

public function __construct($user) {
    $this->user = $user;
}

public function buildForm(FormBuilderInterface $builder, array $options) {
    if(!is_null($this->user)) {
        $builder->add(); ...
    }
}

あなたのコントローラーで:

$user = null;
$securityContext = $this->container->get('security.context');
if( $securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED') ){
    // authenticated REMEMBERED, FULLY will imply REMEMBERED (NON anonymous)
    $user = $this->user();
}

$form = $this->createForm(new CommentType($user), $comment);

2 番目の質問:

user_id が null でないかどうか、null でない場合 -> undeline の場合、null の場合 -> undeline でない場合のみを確認する必要があります。

于 2013-10-17T15:09:19.490 に答える