2015-09-09 51 views
0

這是我的控制器,我使用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並添加更多未映射的字段,還是應該創建一個新的?我爲每封郵件添加了一個複選框,但我認爲它不正確。我如何通過操作將它們與下拉菜單連接起來?

回答

1

看來你已經快到了,你正在設置複選框的ID和名稱,我要做的是將複選框的值設置爲ID,並簡單地將名稱設置爲任何你喜歡的名稱(它將不會由symfony表格處理)。

例如

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

(輸入ID設置爲kbIdList _ {{message.id}}意味着你可以很容易地通過javascript參考複選框對於給定的行ID如果需要)

你不得不從處理表單發佈的控制器操作中的Request對象中獲取這些內容。由於某些原因,註釋後值通常可能在$ request-> request對象中。

例如

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

一切正常,$ checkedList應該包含一個ID數組供您處理。要知道該怎麼做,添加一個選擇輸入的操作列表,或添加一系列的表單按鈕等...

+0

嗯,你是對的。 Post值確實存在於Request對象中,忘記了這一點。我有點想讓這個更具可重用性,因爲我會在更多的表上添加複選框,並且必須像這樣添加它們,並且解析請求對象而不是Form對象會有點麻煩。 –

+0

我同意它並非都很好地封裝了這個表單,而是以我的Symfony表單體驗,它通常比嘗試更快地獲得Symfony表單,並且獲得Symfony表單來達到你想要的效果! 我確信一個表格專家會出現並提供一個解決方案,但足以說它可能會在FormType類和控制器中傳播更多的代碼 - 至少上面的解決方案很簡單,我會爭辯說如果你想讓代碼集中,很容易在服務層方法中打包。 –