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.

Существует пример кода, который может быть полезен для вас. Смотрите также комментарии.

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