1

我正在尝试合并 3 个模型以创建第四个模型。我有model1model2并且model3我想将它们合并到modelMaster. 我还为所有这些创建了控制器。当我调用modelMaster/create操作时,我会渲染渲染modelMaster/create视图的modelMaster/_form视图。在这个_form视图中,我还想渲染和model1/_form,它从. 但是,这不起作用。如何将这三种不同的观点结合在一起?model2/_formCHtml::dropDownList()model3

4

3 回答 3

1

如果您尝试跳过从 _form 视图生成的表单并使用唯一的模型名称,我认为您可以使用本手册:具有更多模型的单一表单 因此表单定义的生成始终处理父视图,而 _form 仅处理输入

在视图中使用单个模型的另一种方式,通过扩展 CFormModel 创建表单模型,并处理此模型与包装子模型之间的数据绑定

于 2012-06-26T23:29:15.227 回答
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-view 应该按预期工作

  3. 要让您的多模型表单工作,您只需获取对在其中创建的表单的引用modelMaster/create并使用它来呈现*/_formInputs您需要的所有内容。还请记住将输入模型包含在 renderPartial 调用中。所以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 回答
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 回答