Несколько представлений _form в одном представлении создания [Yii]

Я пытаюсь объединить 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-просмотры создать и сделать новый 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. изменить 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 и использовать его для рендеринга части всего */_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), в противном случае пусть скрипт продолжится, в этом случае он будет перейти к функции сохранения.

Другие вопросы по тегам