2012-06-26 1 views
1

Я пытаюсь объединить 3 модели для создания четвертого. У меня есть model1, model2 и model3, и я хочу объединить их в modelMaster. Я также создал контроллеры для всех. Когда я звоню modelMaster/create, я просматриваю вид modelMaster/create, который отображает вид modelMaster/_form. В этом обзоре _form я также хочу отобразить model1/_form, model2/_form и CHtml::dropDownList(), который берет данные от model3. Однако это не работает. Как я могу объединить эти три разных взгляда друг с другом?Несколько видов _form на одном представлении создания [Yii]

+1

Что происходит, когда вы это делаете? Вы сказали, что это не сработает, но что происходит? Сбой сценария, нет выхода и т. Д.? –

+0

Это элементы 'формы' элементов! так что, если я нажму на главную кнопку отправки, он ничего не сделает! – acidghost

+0

хорошо, вам нужно показать код, который у вас есть сейчас, в вашей форме. а также указать, какое точное поведение вы хотите, то есть как вы хотите, чтобы формы вели себя, если вы не хотите вложенности. пожалуйста, будьте немного более ясны по вашему вопросу. –

ответ

1

Если вы попытаетесь пропустить форму сгенерирования из представлений _form и использовать уникальные имена моделей, я думаю, вы можете использовать это руководство: single form with more models Таким образом, генерация определения формы обрабатывает всегда родительский вид, а только _form - только входы

другой способ использовать одну модель в представлениях, создать форму модели путем расширения CFormModel и обрабатывать данные, связывающие между этой моделью и обернутых подмоделях

1

Если вы хотите, чтобы гнездиться несколько форм в один мастер форме вы необходимо соответствующим образом скорректировать шаблоны форм. Все ваши modelMaster/create, model1/_form, model2/_form -views создают и визуализируют новый CActiveForm (и таким образом несколько тегов <form>).

Поскольку вы не можете вкладывать элементы формы в HTML (как следует HTML знать, какое действие передать данные), вы должны избежать этого, выполнив следующие действия:

  1. Extract входы формы вы хотите вписаться в новое представление, например 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 и использовать его для 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(); ?> 
    
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> 2), в противном случае пусть скрипт продолжить, в этом случае он перейдет к функции сохранения.