2012-05-31 138 views
0

這聽起來很容易,但對我來說,這是令人困惑的。我一直在編寫一個表單來編輯已經存在的數據庫條目。其中一些字段是根據連接表中的記錄創建和填充的。Zend表格刪除按鈕

這聽起來有點粗略,所以我會試着說明它。我有一個名爲Content的內容表和一個名爲Files的表,其中包含文件名和位置。我根據提供的內容id獲取文件名,然後表單創建字段,然後用文件名填充這些字段。

public function setFiles($files) { 
    $i = 0; 
    foreach ($files as $file) { 
     $i++; 
     $fieldname = "encloseditemname{$i}"; 
     $this->addElement('text', $fieldname, array('required'  => true, 
                 'label'   => 'Enclosed item name (test)', 
                 'value'   => $file['file_url'], 
     )); 
    } 
} 

這工作得很好,但現在我想添加一個按鈕,允許我刪除其中一個文件。所以我想應該做的是在控制器中創建一個fileDeleteAction(),然後讓按鈕重定向到該動作,讓它刪除數據庫中的條目,然後使用表單渲染視圖。

使動作呈現不同的視圖,然後它是標準視圖,而不是問題。編寫代碼來刪除數據庫中的條目,也不是問題。使用addElements方法作爲工廠創建一個重定向到刪除操作的按鈕...巨大的問題。這是我得到了多少。

$this->addElement('button', "deleteencloseditem{$i}", array(???)); 

如何獲得此按鈕可重定向到刪除操作沒有它干擾,在這是用來提交表單,並呼籲在我的控制器editAction我的窗體底部提交按鈕。

我已經研究了使用一點javascript來檢測哪個按鈕被按下,但我不在家中的JavaScript還沒有找到如何找出哪個按鈕被按下,因爲按鈕的名稱和id是依賴在setFiles函數上,因此可以在deleteencloseditem1deleteencloseditem5000之間變化,具體取決於它推入表單的文件名數量。

我該如何做到這一點?任何提示或建議非常感謝:)

回答

1

HTML <form>只能提供一個action屬性,表單在提交時路由到該屬性。但是,有解決方法可以解決這個問題,包括客戶端和服務器端。

服務器端

  1. 讓所有的按鈕,只需提交表單的action
  2. 在這次行動中,確定哪個按鈕被點擊通過檢查post((由$this->setAction(...)在窗體的代碼中設置)或get)變量
  3. 根據點擊的按鈕重定向到正確的動作

客戶端

使用按鈕的click事件,以確定哪個按鈕被點擊。我假設按鈕的ID告訴你一些關於你正在刪除的文件的信息。假設你給全部刪除按鈕的class="delete",你可以做使用jQuery如下:

$('input.delete').click(function(){ 
    // remove 'deleteencloseditem' from the button's ID 
    // to only keep the file number 
    var myFileID = $(this).attr('id').replace('deleteencloseditem', ''); 
    window.location.href = 'myLocation?fileID=' + myFileID; 
}); 
+0

您的客戶端版本是可悲的不工作。它似乎無法找到最大的按鈕被按下。 '$(「input.delete」)。點擊(函數(){ '正在加速按鈕與要刪除的類型,無需提交按鈕我不能設置按鈕屬性類型的我自己的擴展版本,它會無論是「按鈕」正如我在置頂的帖子創建一個按鈕元素,或提交如果我會決定創建一個提交按鈕元素。 目前正在嘗試在服務器端解決方案。 –

+0

我已經得到了服務器端版本的工作,如你的建議,我有行動弄清楚至極按鈕被按下,並根據該有它轉發到正確的行動,至極然後刪除條目,然後重定向到以前的操作頁面。 我會承認,起初我後再次轉發刪除條目只會在一個無限循環中結束,只會被第二次刪除同一條記錄時發生DB錯誤而中斷,幸運的是' s改爲使用重定向。 –

+0

很高興你有服務器端版本的工作。至於客戶端方法:你當然可以把'$('input.delete')'改成標識你的刪除按鈕的東西。如果您的刪除按鈕全部爲'

0

只需使用路由。表單路由意味着將action指向相應的路由。您在表單操作中的路徑將導致ZF中的路由使用關聯的控制器和操作。

+0

我已經研究過這個解決方案,可悲的是,它對我造成了另一個問題。雖然它確實按預期工作,但它確實造成了一個問題。它適用於表單上的所有提交按鈕,其中包括我實際上只想提交表單的那個按鈕。 所以它會工作,如果我能找到如何檢查至極這些按鈕被按下,然後決定至極追隨。 我的問題找我知道我還沒有提到這個按鈕,所以我會編輯:) –

+0

@比約恩坦率地說,我不喜歡這樣的解決方案,但無論如何在實施控制器和動作這是唯一的解決方案方面。我更喜歡單個控制器/操作並評估與POST一起提交的參數。根據表單我將直接調用模型或使用'_forward()'。請注意,操作也鏈接到視圖。 –

0

解決這一問題將是隻使用一個鏈接,刪除操作,然後樣式它作爲一個按鈕的最簡單方法。

或者您可以使用一種形式兩個按鈕,你就必須以不同的方式和測試標籤他們爲POST標籤名稱。

if ($this->getRequest()->getPost('submit') == 'Label') 
+0

這是行不通的,'$ this-> getRequest() - > getPost()'將返回一個包含post變量的數組,並且沒有變量叫'submit'。因此,它不完全是一個驚喜,'$這個 - > Request()方法 - >的getPost(「提交」)'返回任何內容,因此無法進行比較,以''label'' –

+0

你有一些被傳遞,你可以測試反對。通常,它將是type = submit的輸入元素,通常name = submit = submit或delete或者Label或...此元素將通過請求對象以name =>值的形式傳遞。 – RockyFord