我在mysql中有3个表
我有Cityid Cityname的城市
我拥有的标签 labelid langid and text
我有langid的语言表, langname并启用
现在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));
}
答案 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:
的onchangeYii::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';
}
...