1

3 つのモデルをマージして 4 つ目のモデルを作成しようとしています。があり、model1それらを にマージしたいと考えています。また、それらすべてのコントローラーも作成しました。アクションを呼び出すと、ビューをレンダリングするビューをレンダリングします。このビュー内では、とからデータを取得する もレンダリングしたいと考えています。ただし、これは機能しません。これら 3 つの異なるビューを互いに組み合わせるにはどうすればよいでしょうか?model2model3modelMastermodelMaster/createmodelMaster/createmodelMaster/_form_formmodel1/_formmodel2/_formCHtml::dropDownList()model3

4

3 に答える 3

1

複数のフォームを 1 つのマスター フォームにネストする場合は、それに応じてフォーム テンプレートを調整する必要があります。すべてのmodelMaster/create, model1/_form, model2/_form-views は、新しいCActiveForm(したがっていくつかの<form>タグ) を作成してレンダリングします。

html でフォーム要素をネストすることはできないため (html はデータを渡すアクションをどのように認識すべきか)、次のようにしてこれを回避する必要があります。

  1. ネストしたいフォームの入力を新しいビューに抽出します。たとえば、次のmodel1/_formInputsようになります

    ...
    <?php echo $form->labelEx($model,'name'); ?>
    <?php echo $form->textField($model,'name');
    <?php echo $form->error($model,'name');
    ...
    
  2. model1/createおよび他のビューを変更し、そこで作成されたフォームへの参照を取得し$this->beginWidgetます。変数に戻り値を割り当てます$form(まだ行っていない場合)。

    <?php $form = $this->beginWidget('CActiveForm', array(
        'id'=>'foo',
    )); ?>
    

    以前の入力フィールドを

    <?php $this->renderPartial('model1/_formInputs', array('form' => $form); ?>
    

    たとえば、古いmodel1/createビューは期待どおりに機能するはずです

  3. マルチモデルフォームを機能させるには、作成されたフォームへの参照を取得し、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(); ?>
    
于 2012-06-28T07:41:49.820 に答える
1

_form ビューからのフォーム生成をスキップして一意のモデル名を使用しようとする場合は、次のマニュアルを使用できると思います:より多くのモデルを持つ単一のフォーム したがって、フォーム定義の生成は常に親ビューと _form の入力のみを処理します

ビューで単一モデルを使用し、CFormModel を拡張してフォーム モデルを作成し、このモデルとラップされたサブモデル間のデータ バインディングを処理するもう 1 つの方法

于 2012-06-26T23:29:15.227 に答える
0

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 の代わりにそれを確認する必要があります)。それ以外の場合は、スクリプトを続行します。この場合は、保存機能に移動します。

于 2012-12-26T03:22:32.593 に答える