0

CActiveForm::dropdownList()いろいろなところに使っています。開発をスピードアップするために、関連するすべての作業をカプセル化するウィジェットを作成したいと考えています。正しく表示されるものがありますが、の検証機能が失われますCActiveForm

ドロップダウンを直接作成する方法は次のとおりです。$activeModelは、 が使用するモデル ( CActiveRecord)を参照しCActiveFormます。$allItemsドロップダウンに入力するために使用されるCActiveRecord配列です。このコードは完全に機能します。

<div class="row">
    <?php echo $form->labelEx($activeModel, 'keyId'); ?>:
    <?php
    $data = array();
    foreach ($allItems as $Item) {
        $data[$Item->keyId] = CHtml::encode($Item->keyName);
    }
    $options = array(
        'prompt' => 'Select an item',
        'options' => array($activeModel->keyId => array('selected' => true)),
    );
    echo $form->dropDownList($activeModel, 'keyId', $data, $options);
    ?>
    <?php echo $form->error($activeModel, 'keyId'); ?>
</div>

理論的には、ウィジェットが に含まれる方法は次のCActiveFormとおりです。

<div class="row">
    <?php echo $form->labelEx($activeModel, 'keyId'); ?>
    <?php $this->widget('path.to.CustomDropdown', array(
        'form' => $form,
        'items' => $allItems,
        'model' => $activeModel,
        'prompt' => 'Select an item',
        'selected' => true,
    )); ?>
    <?php echo $form->error($activeModel, 'keyId'); ?>
</div>

ウィジェット自体は次のようになります。

<?php
/**
 * Echoes a populated <select> element
 */
class CustomDropdown extends CWidget {
    public $form;
    public $items = array();
    public $model;
    public $prompt;
    public $selected = false;

    /**
     * @var CActiveForm $form
     * @var CActiveRecord[] $items
     * @var CActiveRecord $model
     * @var string $prompt
     * @var bool $selected (optional)
     */
    public function run() {
        $data = array();
        foreach ($this->items as $Item) {
            $data[$Item->{$Item->tableSchema->primaryKey}] = CHtml::encode($Item->getName());
        }

        $options = array(
            'prompt' => CHtml::encode($this->prompt),
            'options' => (
                $this->selected ? array($this->model->{$Item->tableSchema->primaryKey} => array('selected' => true)) : array()
            ),
        );

        echo $this->form->dropDownList($this->model, $this->model->tableSchema->primaryKey, $data, $options);
    }
}
?>

これはすべてCActiveForm機能しますが、ドロップダウンの検証機能が失われます。具体的には、ウィジェット$formは CActiveForm の検証配列にマップされないため、送信エラーがユーザーに表示されることはありません。

CActiveFormこのタイプのウィジェットを完全に統合して、機能が失われないようにするにはどうすればよいですか? 助けてくれてありがとう。

4

1 に答える 1