2

我正在開發一個使用CodeIgniter的網站,我試圖堅持「胖模型/ Skinny控制器」範例,但當涉及到包含表單的頁面時遇到一些問題一些輸入。下面的代碼是我使用的定義地址字段我控制器(在那裏我定義表單輸入及其屬性)的CodeIgniter:控制器結構的表單有很多輸入

部分輸入什麼:

$this->data['address1'] = array(
      'name' => 'address1', 
      'id' => 'address1', 
      'type' => 'text', 
      'class' => 'field text addr', 
      'tabindex' => '10', 
      'value' => $this->form_validation->set_value('address1'), 
      'placeholder' => 'Street Address' 
     ); 

$this->data['address2'] = array(
      'name' => 'address2', 
      'id' => 'address2', 
      'type' => 'text', 
      'class' => 'field text addr', 
      'tabindex' => '11', 
      'value' => $this->form_validation->set_value('address2'), 
      'placeholder' => 'Address Line 2', 
     ); 

$this->data['city'] = array(
      'name' => 'city', 
      'id' => 'city', 
      'type' => 'text', 
      'class' => 'field text addr', 
      'tabindex' => '12', 
      'value' => $this->form_validation->set_value('city'), 
      'placeholder' => 'City' 
      ); 

$this->data['state'] = array(
      'name' => 'state', 
      'id' => 'state', 
      'class' => 'field addr', 
      'tabindex' => '13', 
      'value' => $this->form_validation->set_value('state'), 
      'label' => array('class' => 'desc') 
      ); 

$this->data['zip'] = array(
      'name' => 'zip', 
      'id' => 'zip', 
      'type' => 'text', 
      'class' => 'field text addr', 
      'tabindex' => '14', 
      'maxlength' => '20', 
      'value' => $this->form_validation->set_value('zip'), 
      'placeholder' => 'Zip/Postal Code' 
      ); 

$this->data['country'] = array(
      'name' => 'country', 
      'id' => 'country', 
      'class' => 'field addr', 
      'tabindex' => '15', 
      'value' => $this->form_validation->set_value('country') 
      ); 

我的視圖部分(減去所有的HTML來定位表單輸入):

<?php 
    echo form_open("address/add"); 
    echo form_input($address1); 
    echo form_input($address2); 
    echo form_input($city); 

    $options = array(); 
    $options[''] = 'State/Province/Region'; 
    foreach($province_options AS $prov) 
    { 
      $options[$prov->id] = $prov->province; 
    } 
    echo form_dropdown('state',$options,'',$state); 

    echo form_input($zip); 

    $options = array(); 
    $options[''] = 'Country'; 
    foreach($country_options AS $cnt) 
    { 
      $options[$cnt->id] = $cnt->country; 
    } 
    echo form_dropdown('country',$options,'',$country); 
    echo form_submit('submit', 'Submit & Continue'); 
    echo form_close(); 
?> 

我覺得我的控制器是過於冗長,但我想不出什麼樣的替代將是如何組織必要的信息,來表示我的如果我正計劃使用Form Helper來生成for在我看來m輸入。這是做事的正確方法,還是有更好的方法?

回答

1

有可以移動到控制器,甚至模型層邏輯的一點點:

$options = array(); 
$options[''] = 'Country'; 
foreach($country_options AS $cnt) 
{ 
     $options[$cnt->id] = $cnt->country; 
} 
echo form_dropdown('country',$options,'',$country); 

很可能是這樣的:

echo form_dropdown('country', $countries, '', $country); 

...如果您將選項移動到控制器或查看。

這是一個問題,我一直試圖儘量保持DRY的東西,在哪裏定義表單數據?我想有時候我們會忘記「MVC」中「V」的力量。您可以可以來定義視圖中的所有視圖邏輯。

id,tabindexplaceholder之類的東西只在視圖中是必要和有用的。諸如表單驗證規則和數據檢查/準備等屬於Controller/Model層。

表單助手函數很有用,但有時原始HTML更好。例如:

// Controller 
$this->data['address1'] = array(
      'name' => 'address1', 
      'id' => 'address1', 
      'type' => 'text', 
      'class' => 'field text addr', 
      'tabindex' => '10', 
      'value' => $this->form_validation->set_value('address1'), 
      'placeholder' => 'Street Address' 
     ); 
// View 
echo form_input($address1); 

或者乾脆:

<input name="address1" id="address1" tabindex="10" type="text" placeholder="Street Address" value="<?php echo set_value('address1'); ?>" class="field text addr"> 

我去年寫了一堆的應用,我在模型中定義的所有這些東西,現在我後悔了,因爲我一直在回去對它們進行維護,並且模型或控制器中的所有查看邏輯都被遮蔽了。編輯控制器或模型以更改class屬性是愚蠢的。

2

僅僅因爲Codeigniter提供所有這些幫手並不意味着您必須使用它們!

所有你需要的是form_open(),因爲這增加了CRSF標記(如果使用的話)。

原始HTML更清潔,我懷疑比等待PHP呈現標記要快得多。

編輯:我想補充一點,其更清潔的原因是因爲您可以控制輸出,因爲CI可能符合某些規範。

我在您的問題中看不到問題。

這僅僅是愚蠢的

$options = array(); 
$options[''] = 'State/Province/Region'; 
+0

+1對於原始HTML(我剛剛在30分鐘前發佈了一個類似的答案,直到晚餐打斷了我),但我沒有看到你發佈的代碼塊的「愚蠢」。你可以解釋嗎? – 2012-03-06 00:45:41

+0

@MadM爲了回答你的問題,我個人沒有在類型變量中看到點,然後用值填充它,這可能在類內是好的,但是這是一個方法內的tmp數組(順便說一下,感謝PHP6或5.4的發明者) ,這種做法可能是合理的,但爲了可讀性,我認爲它是錯誤的。 – Philip 2012-03-06 01:03:17

+1

那麼,沒有* second *'$ options = array();'第一個值會溢出(可能應該使用不同的var名稱)。我理解你的意思,但我仍然認爲這是一個好習慣,並且非常清楚發生了什麼事情以避免「意外」。 – 2012-03-06 01:06:18