Yii. Форма заявки Добавление информации о компании-пользователе + НЕСКОЛЬКО товаров в одной форме
Не знаю, если это типичная проблема, но не могу понять, как ее реализовать. 3 таблицы: Приложение. Это отношения:
return array(
'company_info' => array(self::HAS_ONE, 'AppCompany', 'applicant_id'),
'region'=>array(
self::HAS_ONE,'AppRegion',array('company_region_id'=>'id'),
'through'=>'company_info'
),
'sector'=>array(
self::HAS_ONE,'AppSector',array('company_sector_id'=>'id'),
'through'=>'company_info'
),
);
AppCompany. Связи:
return array(
'application' => array(self::BELONGS_TO, 'Application', 'applicant_id'),
'region' => array(self::BELONGS_TO, 'AppRegion', 'company_region_id'),
'sector' => array(self::BELONGS_TO, 'AppSector', 'company_sector_id'),
'goodsservices' => array(self::HAS_MANY, 'AppGoodsServices', 'company_id')
);
App.GoodsServices. Связи:
return array(
'company'=>array(self::BELONGS_TO, 'AppCompany', 'company_id'),
);
Таким образом, один пользователь добавляет информацию о своей компании (company_name, date_of_registration и т. Д.), А затем добавляет некоторые товары / услуги, которые производит эта компания. Как собрать, обновить и просмотреть всю эту информацию в одном виде? Является ли это возможным?
Как я вижу это: Пользователь добавляет некоторую информацию и встречает поле: "Товары и услуги и их процент" и два поля - "ТОВАРЫ И УСЛУГИ" и "ПРОЦЕНТ" и кнопку "ДОБАВИТЬ БОЛЬШЕ", и у него есть 6 товаров, которые он хочет добавить, Таким образом, он нажимает кнопку ДОБАВИТЬ БОЛЬШЕ, и каждый раз появляются новые поля ниже. Но товарный лимит равен 5, поэтому кнопка становится неактивной после того, как в 5 полях есть информация.
А после кнопки SUBMIT вся эта информация записывается в ее таблицу. Его можно взять из таблицы на кнопке UPDATE и просмотреть в одном CDetailView.
Пожалуйста, как это можно реализовать хотя бы в общих чертах. Спасибо
ОБНОВЛЕНИЕ Хорошо, некоторая работа сделана (не знаю, правильно ли это, но...):
Я использовал это расширение: http://www.yiiframework.com/extension/esaverelatedbehavior/
Теперь у меня есть:
public function actionCreate()
{
$model=new Application;
// Uncomment the following line if AJAX validation is needed
$this->performAjaxValidation($model);
if(isset($_POST['Application']))
{
$model->attributes=$_POST['Application'];
if(isset($_POST['AppGoodsServices']))
{
$model->goodsservices = $_POST['AppGoodsServices'];
}
if ($model->saveWithRelated('goodsservices'))
{
$this->redirect(array('view', 'id' => $model->id));
} else {$model->addError('goodsservices', 'Error occured while saving goods/services.'); }
}
$this->render('create',array(
'model'=>$model,
));
}
public function actionUpdate($id)
{
$model=$this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Application']))
{
$model->attributes=$_POST['Application'];
if(isset($_POST['AppGoodsServices']))
{
$model->goodsservices = $_POST['AppGoodsServices'];
}
if ($model->saveWithRelated('goodsservices'))
{
$this->redirect(array('view', 'id' => $model->id));
} else {$model->addError('goodsservices', 'Error occured while saving goods/services.'); }
}
$this->render('update',array(
'model'=>$model,
));
}
public function loadModel($id)
{
$model=Application::model()->findByPk($id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}
В моем _form.php
<div id="goodsservices">
<?php
$index = 0;
foreach ($model->goodsservices as $id => $goods):
$this->renderPartial('goods/_form', array(
'model' => $goods,
'index' => $id,
));
$index++;
endforeach;
?>
</div>
и подчиненная форма в товаре /_form:
<div style="margin-bottom: 20px; width:100%; clear:left;" class="crow">
<div class="row" style="float: left;">
<?php echo CHtml::activeLabelEx($model, '['.$index.']goods_and_services'); ?>
<?php echo CHtml::activeTextField($model, '['.$index.']goods_and_services', array('size' => 30, 'maxlength' => 150)); ?>
<?php echo CHtml::error($model, '['.$index .']goods_and_services'); ?>
</div>
<div class="row" style="float: left;">
<?php echo CHtml::activeLabelEx($model, '['.$index .']percentage'); ?>
<?php echo CHtml::activeTextField($model, '['.$index.']percentage', array('size' => 5)); ?>
<?php echo CHtml::error($model, '['.$index.']percentage'); ?>
</div>
<div class="row" style="float: left;">
<?php echo CHtml::link('Delete', '#', array('onclick' => 'deleteGoods(this, '.$index.'); return false;'));
?>
</div>
</div>
<div style="clear: both;"></div>
<?php
Yii::app()->clientScript->registerScript('deleteGoods', "
function deleteGoods(elm, index)
{
element=$(elm).parent().parent();
/* animate div */
$(element).animate(
{
opacity: 0.25,
left: '+=50',
height: 'toggle'
}, 500,
function() {
/* remove div */
$(element).remove();
});
}", CClientScript::POS_END);
?>
Все работает, но я не могу понять, как сделать серию CREATE для детей (goodsservices) модель. Теперь он показывает только детей в форме ОБНОВЛЕНИЯ (я сделал несколько записей прямо в БД) с кнопкой УДАЛИТЬ рядом с каждым. Но как реализовать CREATE? Итак, одна пустая строка должна быть видна, и я мог бы добавить другие строки при нажатии "Добавить строку"?
1 ответ
Это возможно. Используя javascript, вы должны создавать дополнительные элементы в поле зрения, в действии контроллера вы получаете $_POST со всеми данными, заполняете и проверяете все модели в одной транзакции. В режиме обновления действий вы показываете связанные модели с php foreach.
Существует пример кода, который может быть полезен для вас. Смотрите также комментарии.