为数据库项目列表添加复选框和操作

Add checkboxes and actions for a list of database items

这是我的控制器,我正在使用 KNPpaginator 获取当前用户的消息并将它们传递到树枝视图。

 $messages = $this->getDoctrine()->getRepository('PrivateMessageBundle:Message');
    // $messageList = $messages->findBy(array('receiver' => $this->getUser()));

    $mymsg = $messages->findMyMessages($this->getUser());

    $paginator = $this->get('knp_paginator');
    $pagination = $paginator->paginate(
        $mymsg,
        $request->query->get('page', 1)/*page number*/,
        10/*limit per page*/,
        array('defaultSortFieldName' => 'a.sentAt', 'defaultSortDirection' => 'desc')
    );


    return $this->render(
        '@PrivateMessage/inbox.html.twig',
        array(
            'messageList' => $pagination
        )
    );

findMyMessages returns 查询当前用户的消息。 KNPpaginator 必须正常工作。我不知道为什么它不适用于数组,它只适用于我的查询。

public function findMyMessages($user)
{


    $qb = $this->createQueryBuilder('a')
        ->select('a')
        ->where('a.receiver = :user')
        ->andWhere('a.isSpam = false')
       // ->andWhere('a.replyof is NULL')
        ->Join('a.sender', 'r')
        ->setParameters(
            array('user' => $user)
        );


    return $qb->getQuery();
}

这是我的消息实体,它表示两个用户之间的消息可能具有的内容:标题、内容、发件人、收件人、日期等。

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

    /**
     * @var string
     * @Assert\NotBlank(message="private_message.title.blank")
     * @ORM\Column(name="title", type="string", length=50)
     */
    protected $title;

    /**
     * @Assert\NotBlank(message="private_message.receiver.blank")
     * @ORM\ManyToOne(targetEntity="MedAppBundle\Entity\User")
     * @ORM\JoinColumn(referencedColumnName="id")
     */
    protected $receiver;
    /**
     * @ORM\ManyToOne(targetEntity="MedAppBundle\Entity\User")
     * @ORM\JoinColumn(referencedColumnName="id")
     */
    protected $sender;

    /**
     * @var string
     * @Assert\NotBlank(message="private_message.content.blank")
     * @ORM\Column(name="content", type="string")
     */
    protected $content;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="sentAt", type="datetime")
     */
    protected $sentAt;


    /**
     * @var boolean
     *
     * @ORM\Column(name="isSpam", type="boolean")
     */
    protected $isSpam = false;


    /**
     * @var \DateTime
     *
     * @ORM\Column(name="seenAt", type="datetime",nullable=true)
     */
    protected $seenAt = null;

    /**
     * @ORM\ManyToOne(targetEntity="PrivateMessageBundle\Entity\Message")
     * @ORM\JoinColumn(referencedColumnName="id",nullable=true)
     */
    protected $replyof;

    /**
     * @ORM\OneToMany(targetEntity="PrivateMessageBundle\Entity\Message", mappedBy="replyof")
     **/
    private $replies;

    public function __construct() {
        $this->replies = new ArrayCollection();
    }

在我看来,我有一个更复杂的显示,但为了演示,我将其简化了一点:

  {% for message in messageList %}

      {{ message.title|e }}
      {{ message.sender|e }}
      {{ message.content }}

      <div class="message-action">
          <a class="" href="{{ path('private_message_mark',{'msg': message.id}) }}">Spam </a> |
          <a class="" href="{{ path('private_message_new',{'msg': message.id}) }}">Reply </a>
          <input type="checkbox" id="message{{ message.id }}" class="checkbox"
                                   name="_message{{ message.id }}"/>
      </div>

  {% endfor %}

现在,我要做的是为每封邮件显示一个复选框(就像 Gmail 一样),以及一个包含特定操作(删除、标记为垃圾邮件等)并取决于操作的下拉列表选择将其应用于选中的消息。

这有点复杂,我不确定是否应该修改我的 MessageType 表单生成器并添加更多未映射的字段,或者我应该创建一个新字段吗?我为每条消息添加了一个复选框,但我认为它不合适。我怎样才能将它们与带有操作的下拉菜单联系起来?

看来你快完成了,你正在为复选框设置 ID 和名称,我要做的是将复选框的值设置为 ID,然后简单地将名称设置为你喜欢的任何名称(它不会被 symfony 形式处理)。

例如

<input type="checkbox" value="{{ message.id }}" class="checkbox"
                               id="kbIdList_{{ message.id }}" name="kbIdList[]"/>

(将输入 ID 设置为 kbIdList_{{ message.id }} 意味着如果需要,您可以通过 javascript 轻松引用给定行 ID 的复选框)

您必须从处理表单 post 的控制器操作中的 Request 对象中获取这些信息。注意 post 由于某些原因,值通常可以在 $request->request 对象中。

例如

$checkedList = $request->request->get("kbIdList");

一切顺利,$checkedList 应该包含一组 ID 供您处理。要知道该做什么,请添加带有操作列表的 select 输入,或添加一系列表单按钮等...