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