0

私のフォームでは、同じモデルの開始日と終了日を一度に更新します。簡略化された形式を参照してください。

<?php $form = ActiveForm::begin(); ?>
    <?php foreach($dates as $i=>$date): ?>
        <?= $form->field($date,"[$i]start"); ?>
        <?= $form->field($date,"[$i]end"); ?>
    <?php endforeach; ?>
</table>
<?= Html::submitButton('Save'); ?>
<?php ActiveForm::end(); ?>

終了日が開始日より後の場合、私が制御する必要があるモデルでは:

public function rules() {
    return [
        [['end'], 'compare', 'compareAttribute' =>  'start', 'operator' => '>', 'message' => '{attribute} have to be after {compareValue}.‌'],
    ];
}

Yii2: Validation in form with two instances of same modelで説明されているように、同様にセレクターを変更しようとしましたが、成功しませんでした。検証 JS で「compareAttribute」を「mymodel-start」から「mymodel- 0 -start」に変更する必要があると思います。

{yii.validation.compare(value, messages, {"operator":">","type":"string","compareAttribute":"mymodel-start","skipOnEmpty":1,"message":"End have to be after start.‌"});}

だから、私は次のようなものを探します:

$form->field($date,"[$i]end", [
    'selectors' => [
        'compareAttribute' => 'mymodel-'.$i.'-start'
    ]
])

解決

ソリューションはlucasの回答に基づいています。

モデルでは、formName() メソッドをオーバーライドするため、すべての日付に一意のフォーム名があります (既存の日付の ID と新しい日付の乱数に基づいています)。

use ReflectionClass;
...

public $randomNumber;

public function formName()
{
    $this->randomNumber = $this->randomNumber ? $this->randomNumber : rand();
    $number = $this->id ? $this->id : '0' . $this->randomNumber;
    $reflector = new ReflectionClass($this);
    return $reflector->getShortName() . '-' . $number;
}

フォームは次のようになります。

<?php $form = ActiveForm::begin(); ?>
    <?php foreach($dates as $date): ?>
        <?= $form->field($date,"start"); ?>
        <?= $form->field($date,"end"); ?>
    <?php endforeach; ?>
</table>
<?= Html::submitButton('Save'); ?>
<?php ActiveForm::end(); ?>
4

1 に答える 1

1

モデル クラスの formName() メソッドをオーバーライドして、一意にします。モデル クラスを変更したくない場合は、このコントローラー アクションを操作する目的でそのサブクラスを作成します。これを行うと、html ID および名前フィールドは自動的に一意になります。

于 2016-04-25T16:20:59.733 に答える