Yii: обновить значения модели перед actionCreate и actionUpdate - PullRequest
0 голосов
/ 29 марта 2012

У меня есть модель 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',
    );
}

Но это не сработало.

У кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 30 марта 2012

Я предполагаю, что это происходит в операции CRUD, основанной на методе actionCreate ().

Лично я бы создал отдельную форму для функциональности создания со следующими атрибутами.

Форма

  • Города
  • States
  • Страны
  • Новый город (не требуется)
  • Новое состояние (не требуется)
  • Новая страна (не требуется)

Затем в форме проверки вы можете проверить, ввел ли пользователь город, штат или страну, которая уже существует и т. Д.

0 голосов
/ 29 марта 2012

Вы можете добавить строки в метод beforeSave () (вам придется его переопределить) вашей модели.

...