ドロップダウンが yii で変更されたときに、次のようにいくつかのフォーム要素をレンダリングします。
$form->dropdownListRow($model, 'type', array('item1','item2','etc') ,
array('ajax'=>array(
'type'=>'POST',
'url'=>CController::createUrl('ProfileFieldRule/showAttributes'),
'update'=>'#showAttributes',
))
));
ProfileFieldRule/showAttributes は CHtml を使用してフォーム要素をレンダリングします。これが最初の問題につながります。opentag などを使用して、フォームで行われた作業を繰り返す必要があります。
echo CHtml::openTag('div', array('class' => 'control-group '));
echo CHtml::activeLabel($attr, $name, array('class' => 'control-label'));
etc
2 つ目の問題は、変更イベントがない場合 (フォームがエラーで送信された場合など)、動的コンテンツが読み込まれないことです。
私は現在モデルを渡し、それがnullかどうかをチェックしています。それ以外の場合は、ProfileFieldRule / showAttributesと同じレンダリングを行っています。
<div id="showAttributes">
<?php if (isset($attr)) {
//do the same rendering as in showAttributes
$vars = get_class_vars(get_class($attr));
foreach ($vars as $name => $value) {
//etc...
?>
</div>
上記のコードの onload、onchange を呼び出すだけで、$form にアクセスできれば 理想的です。
私は何でも受け入れるので、上記のように動的コンテンツを表示および永続化するための最良の (または適切な) ソリューションは何ですか?
アドバイスをよろしくお願いします。
編集
ここに何が起こっているかの画像がありますhttp://imgur.com/cZjRZ 注、レンダリングされた要素は ajax 検証を示していません (赤/緑で強調表示されています)。
私が検討した別の解決策は、showAttributes を取り除き、フォームに 2 つのモデルを渡し続け、変更時に create アクションを再度呼び出すことです。ただし、フォーム全体が再描画されるため、ドロップダウンが変更されると、以前の ajax 検証が取り除かれます。