我在mysql中有3个表
我有 Cityid Cityname 的城市
我有的标签 labelid langid 和 text
我有 langid 的语言表, 语言名称和启用
现在这 3 个表相互关联为 cityname=labelid 文本将保留实际名称 语言将保留语言名称 例如
城市表将是`
cityid=1, cityname=3000
cityid=2, cityname=3001
`
标签表将是
labelid =3000, langid=1, text=纽约
labelid =3000, langid=23, text=中文纽约
labelid= 3001, langid=1, text= 孟买
语言表将是
`langid=1, lagname=english, enabled=1
langid=23, langname=chinese, enabled=1`
现在我实现的是在 GridView 中显示城市数据,并显示所有语言的下拉列表,其 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,));
}
任何帮助将不胜感激
这是渲染 View 文件的 Controller Action
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));
}
最佳答案
好吧,我已经试着想清楚了,我想我明白了。
您希望默认以英语显示所有城市名称,但有一个包含所有可用语言的下拉列表。切换语言后,以该语言显示城市名称。
所以你需要的是让 GridView 填充所有使用参数拉出的名称,由下拉列表指定,但默认为英语。你的大部分时间都在那里。
你的国家被拉出来了:
....dget('zii.widgets.grid.CGridView',
array('id'=>'city-grid',
'dataProvider'=>$model->search(),
....
我猜你只想在 GridView 中显示代码和翻译后的名称?
所以小部件将变成:
$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,));
}
现在您需要修改将正确的变量发送到 View 中的操作:
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'));
....我认为
无论哪种方式,您都拥有这些国家/地区,并且已经在下拉列表中填充了这些国家/地区。
因此,所有这些都应该为您提供一个带有语言下拉列表的 View 和一个默认使用英文名称填充城市名称的 GridView ,但是如果您传递带有 ID 的 lang 参数,它将显示使用该语言的城市。
如何实现 Javascript 以实际更新 Ajax 上的 GridView 将影响页面布局、框架的其余部分并拆分出更多 View 。但我们可以改天再谈。
关于php - 根据下拉列表中的更改更改 GridView 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10072220/