2010-01-26 131 views
2

我有幾個關於CI應用程序設計的問題。Codeigniter應用程序設計

問:當創建一個新窗體並使用CI的form_helper時,我在控制器中創建數組並將其傳遞給view/form_input()方法。我應該在控制器,視圖還是單獨的文件中執行此操作?在我的控制器中,我爲我的表單創建一個方法,即new_user(),並在我的view/form_open()中指定一個不同的方法來處理動作(即add() ,編輯(),刪除()..等)&該方法處理驗證。這是我推崇的方式;然而,如果驗證失敗,我很難傳遞數據。有什麼建議麼?

問:我有一個或兩個實例,當我執行表單驗證時,我需要驗證兩個$ _POST變量。一個例子是,在驗證時,我需要查詢數據庫以確定輸入的業務是否已經存在(基於業務名稱和郵政編碼),然後重定向回視圖並保留後變量。到目前爲止,我還沒有找到一種方法來創建自定義回調函數,因爲您只能傳入一個參數。我已經能夠實現這個工作的唯一方法是驗證通過,然後執行數據庫檢查,如果業務存在,我將$ _post放入session/flashdata中,並使用重定向重新加載視圖。定義form_input屬性的數組調用set_value,因爲它是爲數組中的每個記錄提取flashdata的地方。

$data['name'] = array(
    'name'  => 'name', 
    'id'  => 'name', 
    'value' => set_value('name', $this->session->flashdata('name')), 
    'maxlength' => '200', 
    'size'  => '79', 
    'class' => 'text' 

我意識到這真的歸結爲偏好;不過,我真的很想了解我可以預期的缺陷以及其他人如何設計他們的應用程序。我已經下載了示例應用程序,並且我搜索了大量搜索內容,但我還沒有找到太多的討論。任何建議,非常感謝。

謝謝!

回答

4

我會使用CI

  1. 我創建控制器一樣苗條儘可能分享我的做法。控制器主要作業只能通過URI_GET_POST獲取參數。然後控制器將所需的參數傳遞給模型,並得到結果。之後,視圖文件將被加載,視圖所需的所有變量將被傳遞。
  2. 在模型中處理與數據庫,電子郵件發送等相關的所有過程邏輯。模型將獲取參數,執行查詢,如果需要則處理查詢結果,然後返回數組,結果集,布爾值或整數。獲取返回值的控制器直接通過它來查看,而無需重新處理它。
  3. 在視圖中,它將處理變量以顯示它。將有循環顯示數據列表,從數組中獲取列字段,然後將其顯示爲表單默認值等。視圖和模型通常是以成對方式開發的,因爲視圖中所有需要的字段必須由模型中的查詢提供。

Controller中唯一的'胖'處理是form_validation。我在你的其他問題中回答了它,我如何編寫form_validation規則以及如何使用它。

下面是我上面你的問題的答案:

Q.當使用CI的form_helper創建一個新表單和你的 時,我在控制器中創建 數組,並將 傳遞給view/form_input()方法。 我應該在 控制器,視圖或單獨的 文件中執行此操作嗎?

我很少使用form_helper。這是因爲我的大部分觀點來自同事設計師或客戶提供的HTML文件。我只使用form_dropdown,因爲它允許我將選項作爲數組傳遞,而不是做foreach。對於其他表單元素,我只使用模板文件中提供的表單元素。

Q.以我控制器,I創建一個方法 用於我的形式即new_user()和 我的視圖/ form_open()我在我的控制器指定 不同的方法來處理 動作(即,add(), edit(),delete()..等)&該方法 處理驗證。這是我所推崇的方式 ;然而,如果驗證失敗,我的 難以傳遞數據 。任何 建議?

當我創建我的應用程序時,我通常在控制器中只有2個主要方法。 admin用於顯示列表和句柄刪除,並且form用於顯示和處理添加和編輯。讓我舉一個產品模塊的例子。

我將有產品控制器使用這些方法:

class Product extends MY_Controller { 

    function index() 
    { 
    //for front page, display list of product 
    } 

    function detail() 
    { 
    //for front page, display single product detail 
    //product id is passed as 3rd URI segment 
    $id = intval($this->uri->rsegment(3)); 
    } 

    function admin() 
    { 
    //for admin, display product list 
    //receive id in _POST then do delete 
    //after delete, do redirect to self, best practise 
    } 

    function form() 
    { 
    //for admin, handle add and edit 
    $id = intval($this->uri->rsegment(3)); 
    //if id given and product detail data can be loaded, then it in 'edit' mode 
    //else it in 'add' mode 
    //after validation success, and insert/update success, redirect to product/admin 
    } 

} 

使用這種方法,我可以避免重複代碼,可以保持所有的代碼始終是最新的。幾乎所有添加&的編輯都有相同的視圖和表單字段。如果添加&編輯表單不同(例如編輯用戶,不允許更改用戶名),通過將$mode變量設置爲addedit,我可以放置簡單的if並顯示正確的表單,驗證規則並調用相應的模型方法。

問:我有一個實例或兩個,當 我執行表單驗證,我需要 驗證對兩名$ _ POST變量。 一個例子是,在驗證我 需要查詢數據庫 確定進入商務 已經存在(基於滅商 姓名和郵政編碼),然後重定向回 的觀點,堅持崗位 變量。到目前爲止,我還沒有能夠 找到一種方法來創建自定義 回調函數來執行此操作,因爲 只能傳入一個參數。 ,我已經能夠 得到這個工作的唯一方法是,如果驗證 傳球,然後我執行數據庫 檢查,如果商家出現我把 的$ _ POST會話/ flashdata和 使用重定向加載再次查看。 定義form_input 屬性的數組調用set_value,該值爲 ,其中它爲數組中的每個 記錄提取flashdata。

您可以create your own validation rules。要傳遞多個參數,您可以打開文件system/libraries/Form_validation.php,然後查看function matches($str, $field)代碼。您的回叫可以有多個參數,並且function matches($str, $field)代碼將告訴您如何讀取和使用第二個參數。

我希望這會幫助你學習和使用CI。等待你的偉大的Web應用程序;)

0

Q.當創建一個新的窗體和你使用CI的form_helper時,我在控制器中創建數組並將其傳遞給view/form_input()方法。我應該在控制器,視圖還是單獨的文件中執行此操作?

A. Form_Helper應該始終在「查看」中使用。在我的控制器中,我爲我的表單創建一個方法,即new_user(),並在我的view/form_open()中指定一個不同的方法來處理動作(即add() ,編輯(),刪除()..等)&該方法處理驗證。這是我推崇的方式;然而,如果驗證失敗,我很難傳遞數據。有什麼建議麼?

答:我的方法是在save()方法中直接添加/編輯()到save()中,如果兩者都使用其他方法。

問:我有一個或兩個實例,當我執行表單驗證時,我需要驗證兩個$ _POST變量。一個例子是,在驗證時,我需要查詢數據庫以確定輸入的業務是否已經存在(基於業務名稱和郵政編碼),然後重定向回視圖並保留後變量。到目前爲止,我還沒有找到一種方法來創建自定義回調函數,因爲您只能傳入一個參數。我已經能夠實現這個工作的唯一方法是驗證通過,然後執行數據庫檢查,如果業務存在,我將$ _post放入session/flashdata中,並使用重定向重新加載視圖。定義form_input屬性的數組調用set_value,因爲它是爲數組中的每個記錄提取flashdata的地方。

A.我建議你使用$ this-> input-> post instant使用$ _POST,因爲如果你啓用它,CI將幫助你過濾XSS。 PHP不支持is_POST像.NET,我要做的就是用一個文本框作爲參考

if(isset($_POST('txt_Name'))) 
{ 

} 
**or** 
if($this->input->post('txt_Name')) 
{ 

} 

希望我的回答能幫助你。

+0

if($ this-> input-> post('field)!== FALSE)是一樣的東西。 – 2010-01-26 11:47:55