我正在尝试合并 3 个模型以创建第四个模型。我有model1
,model2
并且model3
我想将它们合并到modelMaster
. 我还为所有这些创建了控制器。当我调用modelMaster/create
操作时,我会渲染渲染modelMaster/create
视图的modelMaster/_form
视图。在这个_form
视图中,我还想渲染和model1/_form
,它从. 但是,这不起作用。如何将这三种不同的观点结合在一起?model2/_form
CHtml::dropDownList()
model3
3 回答
如果您尝试跳过从 _form 视图生成的表单并使用唯一的模型名称,我认为您可以使用本手册:具有更多模型的单一表单 因此表单定义的生成始终处理父视图,而 _form 仅处理输入
在视图中使用单个模型的另一种方式,通过扩展 CFormModel 创建表单模型,并处理此模型与包装子模型之间的数据绑定
如果要将多个表单嵌套到一个主表单中,则必须相应地调整表单模板。你所有的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
-view 应该按预期工作要让您的多模型表单工作,您只需获取对在其中创建的表单的引用
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(); ?>
使用 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 ),否则让脚本继续,在这种情况下它将进入保存功能。