У меня есть модель Location со следующими атрибутами -
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',
);
}
Но это не сработало.
У кого-нибудь есть идеи?