【问题标题】:Multiple _form views on a single create view [Yii]单个创建视图上的多个 _form 视图 [Yii]
【发布时间】:2012-06-26 16:35:07
【问题描述】:

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

【问题讨论】:

  • 当你这样做时会发生什么?你说它不起作用,但会发生什么?脚本是否崩溃、没有输出等?
  • 它嵌套了form 元素!所以如果我点击主提交按钮它什么也不做!
  • 那么您必须在表单中显示您现在拥有的代码。并告诉你想要什么确切的行为,即如果你不想嵌套,你希望表单如何表现。请对你的问题更清楚一点。

标签: php forms templates yii yii-chtml


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果您想将多个表单嵌套到一个主表单中,您必须相应地调整表单模板。您所有的modelMaster/createmodel1/_formmodel2/_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. 通过将$this-&gt;beginWidget 的返回值分配给变量$form(如果尚未完成)来更改model1/create 和其他视图并获取对在那里创建的表单的引用:

      <?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(); ?>
      

    【讨论】:

      【解决方案3】:

      使用 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),否则让脚本继续,在此如果它会转到保存功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多