這是我的控制器,我使用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返回當前用戶消息的查詢。 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中有)和cer的下拉菜單剔除行爲(刪除,標記爲垃圾郵件等),並根據所選擇的操作將其應用於檢查的郵件。
這有點複雜,我不確定是否應該修改MessageType formbuilder並添加更多未映射的字段,還是應該創建一個新的?我爲每封郵件添加了一個複選框,但我認爲它不正確。我如何通過操作將它們與下拉菜單連接起來?
嗯,你是對的。 Post值確實存在於Request對象中,忘記了這一點。我有點想讓這個更具可重用性,因爲我會在更多的表上添加複選框,並且必須像這樣添加它們,並且解析請求對象而不是Form對象會有點麻煩。 –
我同意它並非都很好地封裝了這個表單,而是以我的Symfony表單體驗,它通常比嘗試更快地獲得Symfony表單,並且獲得Symfony表單來達到你想要的效果! 我確信一個表格專家會出現並提供一個解決方案,但足以說它可能會在FormType類和控制器中傳播更多的代碼 - 至少上面的解決方案很簡單,我會爭辯說如果你想讓代碼集中,很容易在服務層方法中打包。 –