2

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

コントローラーが非常に冗長であるように感じますが、フォームヘルパーを使用してビューでフォーム入力を生成することを計画している場合、フォームを表すために必要な情報を整理する方法の代替案は考えられません。 。これは物事を行うための正しい方法ですか、それともより良いアプローチがありますか?

4

2 に答える 2

2

Codeigniterがこれらすべてのヘルパーを提供しているからといって、それらを使用する必要があるわけではありません。

必要なのはform_open()、これによりCRSFトークンが追加されるためです(使用されている場合)。

生のHTMLははるかにクリーンであり、PHPがマークアップをレンダリングするのを待つよりもはるかに速いと思います。

編集: 追加したいのですが、そのクリーンな理由は、出力を制御できるためですが、CIは特定の仕様に準拠している可能性があります。

あなたの質問には問題はありません。

これはばかげている

$options = array();
$options[''] = 'State / Province / Region';
于 2012-03-06T00:41:35.467 に答える
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);

...オプションをコントローラーまたはビューに移動した場合。

これは、フォームデータをどこで定義するのか、可能な限りドライに保つために私がいつも遭遇する問題です。「MVC」の「V」の力を忘れてしまうこともあると思います。代わりに、ビュー内のすべてのビューロジックを定義できます。

のようなものはid、ビューでのみ必要であり、有用ですtabindexplaceholderフォーム検証ルールやデータチェック/準備などは、コントローラー/モデルレイヤーに属します。

フォームヘルパー関数は便利ですが、生の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属性を変更するのはばかげています。

于 2012-03-06T00:44:48.633 に答える