单个创建视图上的多个_form视图[Yii]

时间:2012-06-26 16:35:08

标签: php forms templates yii yii-chtml

我正在尝试合并3个模型以创建第四个模型。我有model1model2model3,我想将它们合并到modelMaster。我还为所有人创建了控制器。当我调用modelMaster/create操作时,我会呈现呈现modelMaster/create视图的modelMaster/_form视图。在此_form视图中,我还想呈现model1/_formmodel2/_formCHtml::dropDownList(),它们从model3获取数据。但是,这不起作用。如何将这三种不同的视图相互组合?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

如果要将多个表单嵌套到一个主表单中,则必须相应地调整表单模板。您的所有modelMaster/createmodel1/_formmodel2/_form视图都会创建并呈现新的CActiveForm(以及多个<form>标记)。

由于你不能在html中嵌套form元素(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(); ?>
    

答案 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),否则让脚本继续,在这种情况下,它将转到保存功能。