部分验证

Inside of my form is partial map which is responsible for generation of some data on the map. If the main form field (tile, description etc..) is not filled in, the generation is not working. I want the validation occurred not only at pressing the SAVE button on the main form, but when you click the GENERATE button which is included in the main form of partial map... How can I solve the problem?

Main form

<?php
$form = $this->beginWidget(
    'VMActiveForm',
    array(
        'type' => 'horizontal',
        'enableAjaxValidation'=>true,
        'enableClientValidation'=>true,
        'clientOptions'=>array(
            'validateOnSubmit'=>true,
            'validateOnChange'=>true),
        'id' => 'coupon-form',
        'htmlOptions' => array('enctype' => 'multipart/form-data'),
        'action' => $this->createUrl('campaigns/saveCoupon'),
    )
);
Yii::import('application.extensions.CJuiDateTimePicker.CJuiDateTimePicker');
?>

<?= $form->errorSummary($model); ?>

<?=
$form->textFieldRow(
    $model,
    'title',
    array(
        'class' => 'span3',
        'hint' => 'Fill in a short selling title - max 40 chars, <span id="CouponExt_title_chars_left">40</span> chars left.',
        'placeholder' => 'Please enter title of coupon...'
    )
);
?>
<script type="text/javascript">
    $(function() {
        $('#CouponExt_title').VMSymbolCounter({'maxCharsCount': 40, 'counter': $('#CouponExt_title_chars_left')});
    });
</script>

<?=
$form->textFieldRow(
    $model,
    'value',
    array(
        'class' => 'span3',
        'placeholder' => 'Please enter value of coupon...'
    )
);
?>

<?=
$form->textAreaRow(
    $model,
    'description',
    array(
        'rows' => 10,
        'class' => 'span3',
        'hint' => 'Short description of your offer. Fill in a short selling title - max 250 chars, <span id="CouponExt_description_chars_left">255</span> chars left.'
    )
);
?>

<script type="text/javascript">
    $(function() {
        $('#CouponExt_description').VMSymbolCounter({'maxCharsCount': 255, 'counter': $('#CouponExt_description_chars_left')});
    });
</script>

<? $categories = CHtml::listData($categories, 'id', 'title'); ?>
<?= $form->dropDownListRow($model, 'category_id', $categories); ?>

<? $campaigns = CHtml::listData($campaigns, 'id', 'name'); ?>
<?= $form->dropDownListRow($model, 'campaign_id', $campaigns); ?>

<?=
$form->textFieldRow(
    $model,
    'amount',
    array(
        'class' => 'span3',
        'placeholder' => 'Please enter number of coupons...',
        'disabled' => $model->amount > 0
    )
);
?>

<?=
$form->textFieldRow(
    $model,
    'end_value',
    array(
        'class' => 'span3',
        'placeholder' => 'Please enter number of coupons for end...',
    )
);
?>


<?= $form->fileFieldRow($model, 'avatar'); ?>
<div class="controls">
    <?=CHtml::image($model->avatar_filename, '');?>
</div>
<?=
$form->textFieldRow(
    $model,
    'url',
    array(
        'class' => 'span3',
        'placeholder' => 'http://www.yourshop.com',
        'hint' => 'Set an URL'
    )
);
?>
<?php
    $this->renderPartial("partials.map", array(
        'model' => $model,
        'count' => $count,
    ));
    $this->renderPartial("partials.progress", array(
        'model' => $model,
        'count' => $count,
    ));
?>

Map partial

<?php
/**
 * @var CouponExt $model
 */
if(($model->amount > $count) || (!$model->amount)) {
        if($model->isNewRecord) {
            echo CHtml::button('Set radius', array(
                'id' => 'set-radius',
                'class' => 'btn',
            ));
        }

        echo CHtml::ajaxSubmitButton(
            'Generate',
            CHtml::normalizeUrl(array('campaigns/saveCoupon')),
            array(
                'success' => new CJavaScriptExpression("function(data){
                            if(parseInt(data)) {
                                $('#CouponExt_id').val(data);
                                $('#map-block-group').hide();
                                $('#progress-bar-group').show();
                                changeProgress();
                            }}")
            ),
            array(
                'class' => 'btn btn-primary',
                'id' => 'generate-mines'
            )
        );
    }
?>
</div>
</div>
<div id="map-area">
<input id="search-area" type="text" placeholder="Search address..." />
<div id="google-map-area" class="google-map" style="width: 700px; height: 350px; border: 1px solid #cccccc"></div>
<div class="map-attributes">
<?php
    if(($model->amount > $count) || (!$model->amount)) {
        echo CHtml::ajaxSubmitButton(
            'Generate',
            CHtml::normalizeUrl(array('campaigns/saveCoupon')),
            array(
                'success' => new CJavaScriptExpression("function(data){
                            if(parseInt(data)) {
                                $('#CouponExt_id').val(data);
                                $('#map-block-group').hide();
                                $('#progress-bar-group').show();
                                changeProgress();
                            }}")
            ),
            array(
                'class' => 'btn btn-primary',
                'id' => 'scatterArea'
            )
        );

        if($model->isNewRecord) {
            echo CHtml::button('Clear', array(
                'id' => 'clearDotes',
                'class' => 'btn'
            ));

            echo CHtml::button('Remove last', array(
                'id' => 'removeDotes',
                'class' => 'btn'
            ));
        }
    }
?>

Set onclick event of Generate button to submit coupon-form

echo CHtml::ajaxSubmitButton(
   'Generate',
    ...
    array(
       'class' => 'btn btn-primary',
       'id' => 'scatterArea'
       'onclick'=>'$("#coupon-form").submit();'
    )
);