2

次の状況があります。

郵便番号のフィールドと都市のフィールドを含むフォーム。

郵便番号フィールドでオートコンプリートが必要なため、ユーザーがインスタンス 1000 を入力すると、オートコンプリート値は「1000 - ブリュッセル」と表示されます。この値を選択すると、郵便番号フィールドに 1000 が入力され、都市フィールドにブリュッセルが入力されます。

郵便番号、都市、および連結された情報は、mysql データベースから取得されます。

オートコンプリートは郵便番号のみで動作しますが、説明されている効果を実装する方法についての手がかりがありません (= 2 番目のフィールドへの入力)。

現在のフォーム コード:

<div class="row">
        <?php echo $form->labelEx($model,'PostalCode'); ?>
        <?php //echo $form->textField($model,'PostalCode',array('size'=>10,'maxlength'=>50));

                $this->widget('zii.widgets.jui.CJuiAutoComplete', array(
                'name'=>'PostalCode',
                'value'=>$model->PostalCode,
            //'source'=>$people, // <- use this for pre-set array of values
                'source'=>$this->createUrl('BeCity/GetBelgianPostalCodes'),// <- path to controller which returns dynamic data
                // additional javascript options for the autocomplete plugin
                'options'=>array(
                        'minLength'=>'1', // min chars to start search
                        'showAnim'=>'fold'
                ),
                ));

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

現在のコントローラ アクション コード:

public function actionGetBelgianPostalCodes()
        {                     
            $res =array();

            if (isset($_GET['term'])) {
                    // http://www.yiiframework.com/doc/guide/database.dao
                    $qtxt ="SELECT
                            DISTINCT
                            bc.PostalCode as PostalCode,
                            bc.NameNL as CityName,
                            CONCAT(bc.PostalCode, ' - ', bc.NameNL) as FullCityName
                            FROM be_city bc
                            WHERE bc.PostalCode LIKE :qterm
                            ORDER BY bc.PostalCode, bc.NameNL ASC";
                    $command =Yii::app()->db->createCommand($qtxt);
                    $command->bindValue(":qterm", $_GET['term'].'%', PDO::PARAM_STR);
                    $res =$command->queryColumn();
            }

            echo CJSON::encode($res);
            Yii::app()->end();
        }

コントローラーのアクションが完全に正しいかどうかわからない、 $command->queryAll() が機能していないように見えるので、代わりに queryColumn() を使用しますが、最初の列のみを返しますか?

ヒントはありますか?

また、追加の質問です。コントローラー アクションへのリンクを動的にしたいと思います。前の国ドロップダウンでユーザーがベルギーを選択した場合は、'BeCity/GetBelgianPostalCodes' を呼び出す必要があります。フランスの場合は、'FrCity/GetFrenchPostalCodes' に送信する必要があります。これは可能ですか?

ありがとう

4

2 に答える 2

3

ここで私が見つけた方法(アプリケーションに合わせて調整するので、タイプミスがないことを願っています...)また、ウィジェットの名前を myPostCode に変更しました。

<?php
        $this->widget('zii.widgets.jui.CJuiAutoComplete', array(
        'name'=>'myPostCode',
        'value'=>$model->PostalCode,
        'source'=>$this->createUrl('BeCity/GetBelgianPostalCodes'),
        'options'=>array(
                'minLength'=>'1', // min chars to start search
                'showAnim'=>'fold'
                //focus option will tell what is displayed in field during the selection
                'focus'=> 'js:function( event, ui ) {
                    $( "#myPostCode" ).val( ui.item.postalcode );
                    return false;
                }',
                //select function will tell where go each field
                'select'=>'js:function( event, ui ) {
                    $( "#myPostCode" ).val( ui.item.postalcode );
                    $( "#CityName" ).val(ui.item.cityname);
                    return false;
                }'
        ),
        ));

//Here is the code for the display.
//This code MUST be AFTER the widget
//It should be possible to include it in the widget but I do not know how.
// You may change the line "<a>"+item.postalcode... with what you want to display but must keep the a tag."

    Yii::app()->clientScript->registerScript('input', '
        $("#myPostCode").data("autocomplete")._renderItem = function( ul, item ) {
        return $( "<li></li>" )
    .data( "item.autocomplete", item )
    .append( "<a>"+item.postalcode + " - " + item.cityname+"</a>")
    .appendTo( ul );
    };');

?>

また、すべてのデータを返すようにクエリを変更する必要があります

$res =$command->queryAll();
于 2012-09-25T02:36:42.063 に答える
2

Ajax選択オプションを次のように設定します。

$this->widget('zii.widgets.jui.CJuiAutoComplete', array(
    'name'=>'PostalCode',
    'source'=>$this->createUrl('/site/getpostalcode'),
    // additional options for the autocomplete plugin
    'options'=>array(
        'minLength'=>'4',
        'select'=>"js:function(event, ui) {
                    $('#PostalCode').val(ui.item.postalcode);
                    $('#CityName').val(ui.item.cityname);
                  }",
     ),
    'htmlOptions'=>array(
        'style'=>'width: 200px;',
        'placeholder' => 'Postal Code'
    ),
));
于 2012-09-17T21:01:36.400 に答える