0

PHPフォームでチェックボックスとラジオボタンを作成する簡単な方法を試しました。唯一のことは、Codeigniter MVC フレームワークを使用していることです。

以下は、共通モデルまたは任意のヘルパー ファイルに挿入できる関数定義です。

function createOptions($fieldName, $labelsArray=array(), $selectedOption, $fieldType,$valuesArray = array()) {
        $returnString = '';
        if(count($valuesArray)!=count($labelsArray))
            $valuesArray=$lebelsArray;
        if ($fieldType === 'checkbox') {
            for ($i=0;$i<count($labelsArray);$i++) {
                $returnString.='&nbsp&nbsp&nbsp<input type="checkbox" name=' . $fieldName.' value='.$valuesArray[$i].' id='.$valuesArray[$i];
                if(in_array($valuesArray[$i], $selectedOption)){
                        $returnString.=' checked="checked" ';
                }
                $returnString.=' />&nbsp&nbsp<label>'.$labelsArray[$i].'</label>';
            }
        }
        if ($fieldType === 'radio') {
            for ($i=0;$i<count($labelsArray);$i++) {
                $returnString.='&nbsp&nbsp<input type="radio" name=' . $fieldName.' value='.$valuesArray[$i].' id='.$valuesArray[$i];
                if($valuesArray[$i]== $selectedOption)
                        $returnString.=' checked="checked" ';
                $returnString.=' /><label>'.$labelsArray[$i].'</label>';
            }
        }
        return $returnString;
    }

そして、ビューファイルでこの関数を次のように呼び出す必要があります。

<?php
echo $this->common_model->createOptions('userHobbies[]', $hobbyOptions, $userHobbies, 'checkbox'); ?> 

最初のパラメーターは、チェックボックス フィールドまたはラジオ フィールドの名前で、両方の場合のすべてのオプションで常に同じになります。2 番目はラベル配列、3 番目は選択されたオプションで、フォームのロード中にそれらのオプションがチェックされていることを示します。4 番目は、'checkbox' または 'radio' などの文字列になるフィールドのタイプです。5 番目は値の配列で、存在する場合、ラベルの値と同じ順序でラベルの値が含まれます。存在しない場合、ラベル配列は値配列として扱われます。このコードでさらに最適化が可能かどうか知りたいですか?

4

1 に答える 1

1

なんとかここまでたどり着きました。

$selectedOption文字列または配列のいずれかになりますが、ラジオ ボックスの場合は自動的に 1 サイズにカットされます。

どちらの入力タイプでもコードの重複があったため、それらを組み合わせて少し調整しました。

あなたへの私の質問は、html 要素の作成をこれほど難しく抽象化する必要があるかということです。

また、私が注意すべきことは、あなたが複数のコーディング標準に加入していることです (中括弧を使用する場合と使用しない場合の間で跳ね返る 1 つのライナー if ステートメントなど)。どちらを使用しても技術的には問題ありませんが、どちらか一方を使用するようにしてください。

function createOptions($fieldName, $labelsArray=array(), $selectedOption, $fieldType, $valuesArray = array()) {
    $returnString = '';
    $selectedOption = (array) $selectedOption;

    if(count($valuesArray) != count($labelsArray))
        $valuesArray = $labelsArray;

    if ($fieldType === 'radio')
        $selectedOption = array_slice($selectedOption, 0, 1);

    for ($i=0; $i < count($labelsArray); $i++)
    {
        $returnString .= sprintf('&nbsp; &nbsp;<input type="%s" name="%s" value="%s" id="%s"',
            $fieldType, $fieldName, $valuesArray[$i], $valuesArray[$i]);

        if(in_array($valuesArray[$i], $selectedOption))
                $returnString .= ' checked="checked" ';

        $returnString .= ' />&nbsp&nbsp<label>'.$labelsArray[$i].'</label>';
    }

    return $returnString;
}
于 2012-12-05T05:25:37.593 に答える