3

私はmysqlに3つのテーブルを持っています

  1. 私が Cityid Cityname を持っている都市

  2. labelid langid と text を持つラベル

  3. langid、langname、および有効になっている言語テーブル

これで、cityname=labelid text が実際の名前を保持し、language が言語名を保持するため、3 つのテーブルが相互に関連付けられます。

都市テーブルは `

  • 都市 ID=1、都市名=3000

  • 都市 ID=2、都市名=3001

`

ラベルテーブルは

  • labelid =3000、langid=1、text=ニューヨーク

    • labelid =3000、langid=23、text=中国語のニューヨーク

    • labelid= 3001、langid=1、text= ムンバイ

言語テーブルは

  • `langid=1、lagname=英語、enabled=1

  • 言語 ID=23、言語名=中国語、有効=1`

今私が達成したことは、都市のデータをグリッド ビューで表示し、すべての言語のドロップダウンを表示することです。enabled=1

やりたいことは、ドロップダウンから選択した言語に従ってグリッドの内容を変更することです。

そのため、ドロップダウンで中国語を選択すると、すべての都市名が中国語で表示されます。

私のビューコードは

$Labelcriteria = new CDbCriteria;
$Labelcriteria->condition = ("enabled=1");
$langarray= Language::model()->findAll($Labelcriteria);
$i=-1;
foreach ($langarray as $lang)
{
    $i=$i+1;
    $langName[$i]=$lang->langname;
}

//echo CHtml::dropDownList('select_box_name','select_value',$langName,array('onchange' => 'alert(1)',));


echo CHtml::link('Advanced Search','#',array('class'=>'search-button')); ?>    

<div class="search-form" style="display:none">    
    <?php    
    $this->renderPartial('_search',array('model'=>$model,));
    ?>
</div><!-- search-form -->    

<?php
echo CHtml::dropDownList('select_box_name','select_value',$langName, array(
    'onchange'=>'alert(1)',
    'ajax' => array(
        'type'=>'POST', //request type
        'url'=>CController::createUrl('cityController/dynamiccities'), 
     )
));

$this->widget('zii.widgets.grid.CGridView',
    array('id'=>'city-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array('citycode', 'cityname',array('class'=>'CButtonColumn',),),));
?>

私のモデルは

public function search()
{    
    $criteria=new CDbCriteria;

    $criteria->select = 't.citycode,lbl.text as cityname ';
    $criteria->join = 'inner join labels lbl on t.cityname=lbl.labelid inner join language lng on lbl.langid=lng.langid';
    $criteria->order = 'lbl.text ASC';
    $criteria->condition=$someway_to_change_dynamically_using_dropdown;

    $criteria->compare('citycode',$this->citycode,true);
$criteria->compare('cityname',$this->cityname,true);    

    //  $criteria->compare('cityid',$this->cityid);
    //  $criteria->compare('seq_no',$this->seq_no);
    //  $criteria->compare('enable',$this->enable);

    return new CActiveDataProvider($this, array('criteria'=>$criteria,));
}

どんな助けでも本当に感謝します

これは、ビュー ファイルをレンダリングするコントローラー アクションです。

public function Admin()
    {
    $model=new City();
    $model->unsetAttributes();  // clear any default values






    if(isset($_GET['City']))
        $model->attributes=$_GET['City'];
    $this->render('admin',array('model'=>$model));


     }  
4

2 に答える 2

2

OK、私はそれについて頭を包み込もうとしましたが、私はそれを持っていると思います.

デフォルトですべての都市名を英語で表示したいが、利用可能なすべての言語を含むドロップダウンが必要です。言語が切り替えられると、その言語で都市名が表示されます。

したがって、必要なのは、ドロップダウンで指定されたパラメーターを使用して引き出されたすべての名前でグリッドビューを埋めることですが、デフォルトは英語です。あなたのほとんどの道。

あなたの国はここに引き出されます:

....dget('zii.widgets.grid.CGridView',
    array('id'=>'city-grid',
    'dataProvider'=>$model->search(),
....

グリッド ビュー内にコードと翻訳された名前を表示したいだけだと思いますか?

したがって、ウィジェットは次のようになります。

$this->widget('zii.widgets.grid.CGridView',
    array('id'=>'city-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
        'citycode', 
        array(        
             'name'=>'Country',
             'value'=>'$data->getLabel("'.$langId.'")',
        ),  
        array('class'=>'CButtonColumn')
    ),
));

都市モデルでは、言語の ID に基づいて言語バリアントを取得するメソッドが必要なので、これをモデルに配置します。

public function getLabel($id){
    return $this->labels[$id]->text;
}

また、各都市名のラベルにも適切な関係が必要です。Yii 1.1.9 より下であり、それらを一緒にプル (結合) していないため、FK を FK に結合するための手動関数が必要になります。

これを都市モ​​デルに追加します。

 public function getLabels(){
      return Labels::model()->findAll(array(
          'condition'=>'labelid = :labelid',
          'params'=>array(':labelid'=>$this->cityname)
      ));
 }

検索機能を次のように変更します。

public function search()
{    
  $criteria=new CDbCriteria;

  $criteria->order = 'lbl.text ASC';
  $criteria->compare('citycode',$this->citycode,true);
  $criteria->compare('cityname',$this->cityname,true);  
  $criteria->compare('cityid',$this->cityid);
  $criteria->compare('seq_no',$this->seq_no);
  $criteria->compare('enable',$this->enable);

  return new CActiveDataProvider($this, array('criteria'=>$criteria,));
}

次に、アクションを変更して、正しい変数をビューに送信する必要があります。

public function Admin($lang=1)
{
    $model=new City();
    //populate the filters
    $model->attributes = $_GET['City'];
    $this->render('admin',array('model'=>$model, 'langId'=>$lang));
 }  

次に、検索フォームに、利用可能なすべての国を表示する必要があります。これらの国は、ここで既に抽出されています。

$Labelcriteria = new CDbCriteria;
$Labelcriteria->condition = ("enabled=1");
$langarray= Language::model()->findAll($Labelcriteria);
$i=-1;
foreach ($langarray as $lang)
{
    $i=$i+1;
    $langName[$i]=$lang->langname;
}

これは、結果を変更せずに次のように置き換えることができます。

 $langarray = Language::model()->findAll(array('condition'=>'enabled=1','select'=>'langname'));

....おもう

いずれにせよ、そこには国があり、すでにドロップダウンに入力されています。

これで、言語のドロップダウンを含むビューと、デフォルトで英語の名前が入力された都市名を含むグリッド ビューが表示されますが、lang パラメータに ID を渡すと、その言語の都市が表示されます。

Ajax でグリッド ビューを実際に更新するために Javascript を実装する方法は、残りのページ レイアウト、フレームワーク、およびいくつかのビューの分割に依存します。しかし、それについては別の機会に説明します。

于 2012-04-19T09:46:41.970 に答える
0

GridViewこれを使用して、 の選択に関してのコンテンツを更新できますCHtml::dropDownList

1) js スクリプトは、select の onchange をキャプチャするためのものです。

Yii::app()->clientScript->registerScript('sel_status', "
        $('#selStatus').change(function() {
            //alert(this.value);
            $.fn.yiiGridView.update('milestone-category-grid', {
                    data: $(this).serialize()
            });            
            return false;
        });
    ");

2)選択のコード:

$data = CHtml::listData(Status::model()->findAll('IsProcess=?',array(1)), 'ID', 'Description');

$select = key($data);

echo CHtml::dropDownList(
    'dropDownStatus',
    $select,            // selected item from the $data
    $data,       
    array(
        'style'=>'margin-bottom:10px;',
        'id'=>'selStatus',
    )
);

3) グリッドビュー ウィジェットの場合:

 $this->widget('bootstrap.widgets.TbGridView',array(
        'id'=>'milestone-category-grid',
        'afterAjaxUpdate' => 'installSortable',
        'enableSorting' => false,
        'dataProvider'=>$model->search($select),
        'rowCssClassExpression'=>'"items[]_{$data->ID}"',
        'columns'=>array(
            'Description',
        ),
    )); ?>

4)Search対応するモデルの関数では、次のコードは、渡される GET 変数をキャプチャする必要があります。この場合はdropDownStatus、select に指定された名前です (必要に応じて Firebug を使用して、変数の名前を取得します)。合格した):

public function search($status=false)
    {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria=new CDbCriteria;

        if ($status!==false) {
            $criteria->condition='StatusID=:StatusID';
            $criteria->params=array('StatusID'=>$status);
        }

        if (isset($_GET['dropDownStatus'])) {
            $criteria->condition='StatusID=:StatusID';
            $criteria->params=array('StatusID'=>$_GET['dropDownStatus']);
            $criteria->order='Position ASC';
        }

...

参照

于 2014-04-22T14:17:16.860 に答える