CodeIgniter: структура контроллера для форм с множеством входов - PullRequest
2 голосов
/ 06 марта 2012

Я занимаюсь разработкой сайта с использованием CodeIgniter и пытаюсь придерживаться парадигмы "Fat Model / Skinny 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'
        );

$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();
?>

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

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

То, что Codeigniter предоставляет все эти помощники, не означает, что вы должны их использовать!

Все, что вам нужно, это form_open(), потому что это добавляет токен CRSF (если используется).

Необработанный HTML намного чище, и я подозреваю, что это намного быстрее, чем ожидание PHP для рендеринга разметки.

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

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

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

$options = array();
$options[''] = 'State / Province / Region';
1 голос
/ 06 марта 2012

Существует небольшая логика, которую можно перенести на контроллер или даже на уровень модели:

$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 просто глупо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...