3

我在mysql中有3个表

  1. 我拥有 Cityid Cityname 的城市

  2. 我有 labelid langid 和 text 的标签

  3. 我在其中启用了 langid、langname 和启用的语言表

现在这 3 个表是相互关联的,因为 cityname=labelid 文本将保存实际名称语言将保存语言名称,例如

城市表将是`

  • 城市标识=1,城市名称=3000

  • 城市标识=2,城市名称=3001

`

标签表将是

  • labelid =3000, langid=1, text=纽约

    • labelid =3000, langid=23, text=New York in Chinese

    • labelid= 3001, langid=1, text= 孟买

语言表将是

  • `langid=1, lagname=english, 启用=1

  • langid=23,langname=chinese,启用=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

好的,我试着绕开它,我想我有它。

您希望默认以英语显示所有城市名称,但有一个包含所有可用语言的下拉菜单。切换语言时,以该语言显示城市名称。

因此,您需要使用下拉指定的参数填充所有名称的网格视图,但默认为英文。你大部分时间都在那里。

您的国家/地区被拉到这里:

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

....我认为

无论哪种方式,您都拥有那里的国家,并且已经在下拉列表中填充它们。

因此,所有这些都应该为您提供一个带有语言下拉列表的视图和一个网格视图,其中城市名称默认填充有英文名称,但如果您传递带有 ID 的 lang 参数,它将显示具有该语言的城市。

您如何实现 Javascript 以实际更新 Ajax 上的网格视图将影响您的页面布局、框架和拆分更多视图的其余部分。但我们可以再谈一次。

于 2012-04-19T09:46:41.970 回答
0

您可以使用它来根据 aGridView上的选择更新 a 的内容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,赋予选择的名称(如果需要,使用 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 回答