1

Don't know, if it is a typical problem, but can't figure how to realise it. 3 tables: Application. It's relations:

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. Relations:

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. Relations:

return array(
    'company'=>array(self::BELONGS_TO, 'AppCompany', 'company_id'),
    );

So, one user adds info about his company (company_name, date_of_registration etc), and than add some goods/services that this company produces. How to COLLECT, UPDATE AND VIEW all this information in one form? Is it possible?

How do I see this: User addes some info and meets the field: "Goods and services and their percentage" and two fields - "GOODS AND SERVICES" and "PERCENTAGE" and ADD MORE button and he has 6 goods that he wants to add. So, he clicks on ADD MORE button and each time the new fields below appear. But the goods limit is 5, so the button becomes inactive after 5 fields have info.

And after SUBMIT button, all this info records to its table. It can be taken from table on UPDATE button and can be viewd in one CDetailView.

Please, how it can be implemented at least in general terms. Thank you

UPDATE Ok, some work is done (don't know if it right, but...):

I used this extension: http://www.yiiframework.com/extension/esaverelatedbehavior/

Now I have:

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;
}

In my _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>

and subform in goods/_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);
?>

Everything works, but I cant understand how to make a batch CREATE for children (goodsservices) model. Now it only shows me children in UPDATE form (I've made some records straight into DB) with DELETE button near each. But how to implement CREATE? So, one empty row should be visible and I could ADD other rows on click "Add row"?

Decd
  • 65
  • 8

1 Answers1

1

It is possible. Using javascript you should create additional items in view, in controller action you are getting $_POST with all data, fill and validate all models in one transaction. In update action view you are showing related models with php foreach.

There is an example of code that can be useful for you. See comments also.

Alex
  • 8,055
  • 7
  • 39
  • 61
  • Such a large and detailed example. Perfect. Thank you again! Could I plz kindly ask you to look at this question tomorrow. I will try to implement that example and would appreciate if you could answer some passing questions (I'll update, if I have questions, ofc :) Thank you again – Decd Apr 19 '14 at 18:04