我正在尝试合并3个模型以创建第四个模型。我有model1
,model2
和model3
,我想将它们合并到modelMaster
。我还为所有人创建了控制器。当我调用modelMaster/create
操作时,我会呈现呈现modelMaster/create
视图的modelMaster/_form
视图。在此_form
视图中,我还想呈现model1/_form
,model2/_form
和CHtml::dropDownList()
,它们从model3
获取数据。但是,这不起作用。如何将这三种不同的视图相互组合?
答案 0 :(得分:1)
如果您尝试从_form视图跳过表单生成并使用唯一的模型名称,我认为您可以使用本手册:single form with more models 因此,表单定义的生成始终处理父视图,而_form只处理输入
在视图中使用单个模型的另一种方法是,通过扩展CFormModel创建表单模型,并处理此模型与包装的子模型之间的数据绑定
答案 1 :(得分:1)
如果要将多个表单嵌套到一个主表单中,则必须相应地调整表单模板。您的所有modelMaster/create
,model1/_form
,model2/_form
视图都会创建并呈现新的CActiveForm
(以及多个<form>
标记)。
由于你不能在html中嵌套form元素(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(); ?>
答案 2 :(得分: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();
}
}
}
正如你所看到的,我已修改它以返回错误(如果有的话)(如果返回有效,则返回[],我应该检查而不是strlen&gt; 2),否则让脚本继续,在这种情况下,它将转到保存功能。