为数据库项目列表添加复选框和操作
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 输入,或添加一系列表单按钮等...
这是我的控制器,我正在使用 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 输入,或添加一系列表单按钮等...