根据下拉列表中的更改在网格视图中更改数据

时间:2012-04-09 10:59:59

标签: php yii

我在mysql中有3个表

  1. 我有Cityid Cityname的城市

  2. 我拥有的标签     labelid langid and text

  3. 我有langid的语言表,     langname并启用

  4. 现在3个表相互关联为cityname = labelid 文本将保留实际名称 语言将保留语言名称 例如

    城市表将是`

    • cityid = 1,cityname = 3000

    • cityid = 2,cityname = 3001

    `

    标签表将

    • labelid = 3000,langid = 1,text = New York

      • labelid = 3000,langid = 23,text =纽约中文

      • labelid = 3001,langid = 1,text = Mumbai

    语言表将是

    • `langid = 1,lagname = english,enabled = 1

    • langid = 23,langname = chinese,enabled = 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));
    
    
         }  
    

2 个答案:

答案 0 :(得分:2)

好的,我试图绕过它,我想我已经拥有它了。

默认情况下,您希望以英语显示所有城市名称,但请使用所有可用语言的下拉列表。切换语言时,请以该语言显示城市名称。

所以你需要的是让网格视图填充所有使用参数拉出的名称,由下拉列表指定,但默认为英语。你大部分时间都在那里。

您的国家/地区已退出:

....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'));

....我想

无论哪种方式,你都拥有那里的国家,而且已经在他们身上出现了下拉。

因此,所有这些都应该为您提供一个视图,其中包含langauges和网格视图,默认情况下城市名称中填充了英文名称,但如果您使用ID传递lang参数,则会显示具有该语言的城市。

如何实现Javascript以实际更新Ajax上的网格视图将在页面布局的其余部分,框架和拆分更多视图。但我们可以再进入另一次。

答案 1 :(得分: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)对于gridview小部件:

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

...

Reference