我有一个具有以下属性的位置模型 -
id
City
State
Country
我不希望用户能够从现有州/国家/地区的列表中进行选择,如果需要添加其他项目,则可以将其键入文本框中。我修改了_form.php
部分如下 -
// city
<?php echo $form->textField($model,'city',array('size'=>60,'maxlength'=>100)); ?>
// state
<?php echo $form->dropDownList($model, 'state', CHtml::listData(Location::model()->findAll(), 'state', 'state')); ?>
<?php echo CHtml::textField('state2','',array('size'=>60,'maxlength'=>100)); ?>
// country
<?php echo $form->dropDownList($model, 'country', CHtml::listData(Location::model()->findAll(), 'country', 'country')); ?>
<?php echo CHtml::textField('country2','',array('size'=>60,'maxlength'=>100)); ?>
state2
和country2
不属于模型属性。现在,在位置控制器中,我有以下操作 -
public function actionCreate()
{
$model=new Location;
// Uncomment the following line if AJAX validation is needed
// $this->performAjaxValidation($model);
if(isset($_POST['Location']))
{
$model->attributes=$_POST['Location'];
if($model->save())
$this->redirect(array('view','id'=>$model->id));
}
$this->render('create',array(
'model'=>$model,
));
}
我想在此操作执行之前设置这样的值 -
if(!empty($_POST['state2'])) $model->state = $_POST['state2'];
if(!empty($_POST['country2'])) $model->country = $_POST['country2'];
到目前为止我尝试了什么
1。尝试1
我将这些行直接添加到actionCreate
和actionUpdate
。但是,我不认为这是一个干净的解决方案。
1。尝试2 我尝试添加这样的过滤器 -
public function filterAlternateData($filterChain)
{
if(!empty($_POST['state2'])) $_POST['Location[state]'] = $_POST['state2'];
if(!empty($_POST['country2'])) $_POST['Location[country]'] = $_POST['country2'];
$filterChain->run();
}
然后我修改了这样的filters()函数,以便它绑定到创建和更新操作 -
public function filters()
{
return array(
'accessControl', // perform access control for CRUD operations
'alternateData + create, update',
);
}
但这不起作用。
有人有什么想法吗?
答案 0 :(得分:0)
您可以在模型的beforeSave()方法中添加行(您必须覆盖它)。
答案 1 :(得分:0)
我认为这是在基于actionCreate()方法的CRUD操作中发生的。
我个人会为具有以下属性的创建功能创建一个单独的表单。
表格
然后在表单验证中,您可以检查用户是否已输入已存在的城市,州或国家等。