首页 > 解决方案 > Yii 1.1.17 Select2 -- 选择的值不更新数据库

问题描述

我正在尝试使用 select2 查询数据库,因为有 30000 条记录,这确实是我能想到的唯一有效方法。

我的问题是,如果我只是提交此表单,pole_id 不会更新。

有人可以帮助 jQuery 获取 id 或告诉我为什么选择框不更新pole_id数据库中的字段吗?

<?php
/* @var $this JpapolesController */
/* @var $model Jpapoles */
/* @var $form CActiveForm */
?>

<div class="form">

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'jpapoles-form',
    'enableAjaxValidation'=>false,
)); ?>

    <p class="note">Fields with <span class="required">*</span> are required.</p>

    <?php echo $form->errorSummary($model); ?>

    <div class="row">
        <?php echo $form->labelEx($model,'pole_id'); ?>
        <?php //echo $form->textField($model,'pole_id',array('id'=>'pole_id')); ?>

        <?php 
        $list = CHtml::listData(Poles::model()->findAll(array('order' => 'pole_number')), 'id', 'pole_number');
        //echo $form->dropDownList($model, 'pole_id', $list, array('class'=>"js-example-basic-multiple", 'name'=>'pole_id', 'multiple'=>'multiple'));
        //
        echo CHtml::hiddenField('selectbox_pole_id', '', array('class' => 'span5'));

        $this->widget('ext.select2.ESelect2',array(
            'id'=>'myselect',

            'selector' => '#selectbox_pole_id',
            'options'  => array(
                'allowClear'=>true,
                'placeholder'=>'Select a Pole',
                'minimumInputLength' => 3, 

                   'ajax' => array(
                    'url' => Yii::app()->createUrl('jpapoles/poles'),
                     'type'=>'GET',
                    'dataType' => 'json',
                    'quietMillis'=> 100,
                    'data' => 'js: function(text,page) {
                    return {
                                q: text, 
                                page_limit: 10,
                                page: page,
                            };

                        }',

                    'results'=>'js:function(data,page) { var more = (page * 10) < data.total; return {results: data, more:more }; 

                    }

                    ',
                      ),

                   ),

        ));


        ?>
        <?php echo $form->error($model,'pole_id'); ?>
    </div>

    <div class="row">
        <?php echo $form->labelEx($model,'member_id'); ?>
        <?php //echo $form->textField($model,'member_id'); ?>
        <?php 
        $list = CHtml::listData(Members::model()->findAll(array('order' => 'abriviation')), 'id', 'abriviation');
        echo $form->dropDownList($model, 'member_id', $list);
        ?>
        <?php echo $form->error($model,'member_id'); ?>
    </div>

    <div class="row">
        <?php //echo $form->labelEx($model,'jpa_id'); ?>
        <?php echo $form->hiddenField($model,'jpa_id', array('value'=>$_GET['jpano'])); ?>
        <?php echo $form->error($model,'jpa_id'); ?>
    </div>

    <div class="row buttons">
        <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
    </div>

<?php $this->endWidget(); ?>

</div><!-- form -->
<script type="javascript">

$("#myselect").on("change", function (e) { 
    var id = $("#myselect").select2("data")[0].id;

   // Now you can work with the selected value, i.e.:
   //$("#pole_id").val(id);
   alert(id);
});



</script>

标签: phpyiiyii1.x

解决方案


您可以只使用CActiveForm::hiddenField()生成此隐藏输入:

<div class="row">
    <?php echo $form->labelEx($model, 'pole_id'); ?>

    <?php
    echo $form->hiddenField($model, 'pole_id', ['id'=>'pole_id']);

    $this->widget('ext.select2.ESelect2', [
        'id' => 'myselect',
        'selector' => '#' . CHtml::activeId($model, 'pole_id'),
        'options' => [
            'allowClear' => true,
            'placeholder' => 'Select a Pole',
            'minimumInputLength' => 3,

            'ajax' => [
                'url' => Yii::app()->createUrl('jpapoles/poles'),
                'type' => 'GET',
                'dataType' => 'json',
                'quietMillis' => 100,
                'data' => 'js: function(text,page) {
                    return {
                        q: text, 
                        page_limit: 10,
                        page: page,
                    };
                }',
                'results' => 'js:function(data,page) { 
                    var more = (page * 10) < data.total; return {results: data, more:more }; 
                }',
            ],
        ],
    ]);
    ?>
    <?php echo $form->error($model, 'pole_id'); ?>
</div>

它将正确处理现有数据,并且控制器中不需要特殊操作来处理此输入 -$model->attributes = $_POST['Jpapoles']pole_id作为任何其他属性加载。

但是这个扩展也应该适用于模型,所以你可以使用:

$this->widget('ext.select2.ESelect2', [
    'model' => $model,
    'attribute' => 'pole_id',
    'options' => [
        // ...
    ],
]);

您不需要自己创建隐藏文件。


推荐阅读