3 つのモデルをマージして 4 つ目のモデルを作成しようとしています。があり、model1
それらを にマージしたいと考えています。また、それらすべてのコントローラーも作成しました。アクションを呼び出すと、ビューをレンダリングするビューをレンダリングします。このビュー内では、とからデータを取得する もレンダリングしたいと考えています。ただし、これは機能しません。これら 3 つの異なるビューを互いに組み合わせるにはどうすればよいでしょうか?model2
model3
modelMaster
modelMaster/create
modelMaster/create
modelMaster/_form
_form
model1/_form
model2/_form
CHtml::dropDownList()
model3
3 に答える
複数のフォームを 1 つのマスター フォームにネストする場合は、それに応じてフォーム テンプレートを調整する必要があります。すべてのmodelMaster/create
, model1/_form
, model2/_form
-views は、新しいCActiveForm
(したがっていくつかの<form>
タグ) を作成してレンダリングします。
html でフォーム要素をネストすることはできないため (html はデータを渡すアクションをどのように認識すべきか)、次のようにしてこれを回避する必要があります。
ネストしたいフォームの入力を新しいビューに抽出します。たとえば、次の
model1/_formInputs
ようになります... <?php echo $form->labelEx($model,'name'); ?> <?php echo $form->textField($model,'name'); <?php echo $form->error($model,'name'); ...
model1/create
および他のビューを変更し、そこで作成されたフォームへの参照を取得し$this->beginWidget
ます。変数に戻り値を割り当てます$form
(まだ行っていない場合)。<?php $form = $this->beginWidget('CActiveForm', array( 'id'=>'foo', )); ?>
以前の入力フィールドを
<?php $this->renderPartial('model1/_formInputs', array('form' => $form); ?>
たとえば、古い
model1/create
ビューは期待どおりに機能するはずですマルチモデルフォームを機能させるには、作成されたフォームへの参照を取得し、
modelMaster/create
それを使用して必要なすべてを renderPartial*/_formInputs
する必要があります。入力のモデルを renderPartial-call に含めることも忘れないでください。したがってmodelMaster/create
、次のようになります。<?php $form = $this->beginWidget('CActiveForm', array( 'id'=>'foo', )); ?> /* Master Inputs here */ // Rendering other models' inputs <?php $this->renderPartial('model1/_formInputs', array('form' => $form, 'model' => $model1); ?> <?php $this->renderPartial('model2/_formInputs', array('form' => $form, 'model' => $model2); ?> /* Render Form Buttons here */ <?php $this->endWidget(); ?>
_form ビューからのフォーム生成をスキップして一意のモデル名を使用しようとする場合は、次のマニュアルを使用できると思います:より多くのモデルを持つ単一のフォーム したがって、フォーム定義の生成は常に親ビューと _form の入力のみを処理します
ビューで単一モデルを使用し、CFormModel を拡張してフォーム モデルを作成し、このモデルとラップされたサブモデル間のデータ バインディングを処理するもう 1 つの方法
Ajax を使用して送信します。Yii では簡単に実行でき、コントローラーで物事を理解しやすくします。各コントローラーには保存があり、保存を確認するために json で応答します。すでに ajax 検証があります。
/**
* Performs the AJAX validation.
* @param CModel the model to be validated
*/
protected function performAjaxValidation($model)
{
if(isset($_POST['ajax']) && $_POST['ajax']==='employee-form')
{
$valid = CActiveForm::validate($model);
if(strlen($valid) > 2) {
echo $valid;
Yii::app()->end();
}
}
}
ご覧のとおり、エラーがある場合はエラーを返すように変更しました (validate は、有効な場合は [] を返します。おそらく strlen >2 の代わりにそれを確認する必要があります)。それ以外の場合は、スクリプトを続行します。この場合は、保存機能に移動します。