2

Я разрабатываю сайт с использованием CodeIgniter и стараюсь придерживаться парадигмы «Модель жира/Skinny Controller», но я сталкиваюсь с некоторыми проблемами, когда речь идет о страницах, содержащих формы с количество входов. Приведенный ниже код является то, что я использую, чтобы определить входы для адресных полей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(); 
?> 

Я чувствую, что мой контроллер чрезмерно многословный, но я не могу думать о том, что альтернатива была бы для того, как организовать информацию, необходимую для представления моего если я планирую использовать Помощник формы для создания м входов на мой взгляд. Правильно ли это, что делать, или есть лучший подход?

ответ

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, насколько возможно, где определить данные формы? Я думаю, что иногда мы забываем о силе «V» в «MVC». Вы можете указать вместо этого.

Такие вещи, как id, tabindex и placeholder, являются необходимыми и полезными для просмотра. Вещи, такие как правила проверки правильности и проверка данных/подготовка, относятся к уровню контроллера/модели.

Вспомогательные функции формы полезны, но иногда необработанный 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 (если используется).

Raw HTML намного чище, и я подозреваю гораздо быстрее, чем ждать рендеринга PHP.

Edit:Я хотел бы добавить, причина его чище, потому что у вас есть контроль над выходом, где, как CI может Ādere определенных спецификаций.

Я не вижу проблемы в вашем вопросе.

Это просто глупо

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

+1 для необработанного HTML (я только что опубликовал аналогичный ответ 30 минут назад, пока обед не прервал меня), но я не вижу, что «глупо» о блоке кода, который вы опубликовали. Вы можете объяснить? –

+0

@MadM Чтобы ответить на ваш вопрос, я лично не вижу смысла при типизации var, а затем заполняя его значениями, это может быть нормально внутри класса, однако это массив tmp внутри метода (BTW спасибо PHP6 или 5.4 whatevers) , подход может звучать, но для удобства чтения я думаю, что это неправильно. – Philip

+1

Ну, без * second * '$ options = array();' значения из первого будут просачиваться (возможно, должно использоваться другое имя var). Я понимаю ваш смысл, но я по-прежнему считаю, что это хорошая практика, и дает понять, что происходит, чтобы избежать «несчастных случаев». –

Смежные вопросы