【问题标题】:Yii: Update model values before actionCreate and actionUpdateYii:在 actionCreate 和 actionUpdate 之前更新模型值
【发布时间】:2012-03-29 06:45:03
【问题描述】:

我有一个具有以下属性的 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)); ?>

state2country2 不是模型属性的一部分。现在,在位置控制器中,我有以下操作 -

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 我将这些行直接添加到actionCreateactionUpdate。但是,我认为这不是一个干净的解决方案。

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',
    );
}

但这不起作用。

有人有什么想法吗?

【问题讨论】:

    标签: post controller yii action


    【解决方案1】:

    我认为这是在基于 actionCreate() 方法的 CRUD 操作中发生的。

    我个人会为具有以下属性的创建功能创建一个单独的表单。

    表格

    • 城市
    • 国家
    • 国家/地区
    • 新城市(非必需)
    • 新状态(非必需)
    • 新国家(非必需)

    然后在表单验证中,您可以检查用户是否输入了已经存在的城市、州或国家等。

    【讨论】:

    • 对我来说似乎是正确的选择。我把自己限制在工厂的 CRUD 脚手架上。
    【解决方案2】:

    您可以在模型的 beforeSave() 方法中添加行(您必须覆盖它)。

    【讨论】:

    • beforeValidate() 不是在 beforeSave() 之前调用的吗?如果下拉列表为空(第一条记录插入),验证是否会失败?
    • 这取决于您在模型中设置的验证...如果您为字段设置了“必需”验证,验证将失败。但在您的情况下,它们可以为空且未设置,因此验证不应该失败。
    猜你喜欢
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多