Я пытаюсь объединить 3 модели для создания четвертого. У меня есть model1
, model2
и model3
, и я хочу объединить их в modelMaster
. Я также создал контроллеры для всех. Когда я звоню modelMaster/create
, я просматриваю вид modelMaster/create
, который отображает вид modelMaster/_form
. В этом обзоре _form
я также хочу отобразить model1/_form
, model2/_form
и CHtml::dropDownList()
, который берет данные от model3
. Однако это не работает. Как я могу объединить эти три разных взгляда друг с другом?Несколько видов _form на одном представлении создания [Yii]
ответ
Если вы попытаетесь пропустить форму сгенерирования из представлений _form и использовать уникальные имена моделей, я думаю, вы можете использовать это руководство: single form with more models Таким образом, генерация определения формы обрабатывает всегда родительский вид, а только _form - только входы
другой способ использовать одну модель в представлениях, создать форму модели путем расширения CFormModel и обрабатывать данные, связывающие между этой моделью и обернутых подмоделях
Если вы хотите, чтобы гнездиться несколько форм в один мастер форме вы необходимо соответствующим образом скорректировать шаблоны форм. Все ваши modelMaster/create
, model1/_form
, model2/_form
-views создают и визуализируют новый CActiveForm
(и таким образом несколько тегов <form>
).
Поскольку вы не можете вкладывать элементы формы в HTML (как следует HTML знать, какое действие передать данные), вы должны избежать этого, выполнив следующие действия:
Extract входы формы вы хотите вписаться в новое представление, например
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
-view должен работать, как ожидалосьЧтобы получить мульти-модельную форму работы вам просто нужно, чтобы получить ссылку на форму, созданной в
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(); ?>
Отправить с помощью 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), в противном случае пусть скрипт продолжить, в этом случае он перейдет к функции сохранения.
Что происходит, когда вы это делаете? Вы сказали, что это не сработает, но что происходит? Сбой сценария, нет выхода и т. Д.? –
Это элементы 'формы' элементов! так что, если я нажму на главную кнопку отправки, он ничего не сделает! – acidghost
хорошо, вам нужно показать код, который у вас есть сейчас, в вашей форме. а также указать, какое точное поведение вы хотите, то есть как вы хотите, чтобы формы вели себя, если вы не хотите вложенности. пожалуйста, будьте немного более ясны по вашему вопросу. –