1

乍一看,这可能看起来很奇怪。

我们希望允许用户保存到数据库中,即使缺少一些必填字段。

然后,当用户希望发布这些记录时,不应该被允许,因为缺少这些必填字段。

也许,创建某种所需的变体来告诉我们: PUBLISHING 需要,但 INSERTING 不需要;

考虑到您的 Yii 知识,我们应该在这种情况下使用某种模式吗?

更新

场景似乎是一个不错的方法,但文档建议添加:

$model = new MyActiveRecord('Inserting');

在我们的控制器上。

但是,在我的控制器上,我有:

public function actionCreate()
{
  $this->layout = 'admin';

  $model=new HsGuestbook;

  $localized[] = $this->getExtraModelGuestTr();

  if(isset($_POST['HsGuestbook']))
  {
   ...

所以,我试着做:

  if(isset($_POST['HsGuestbook']))
  {
     //check validation scenarios
     if ($model->status === 0) { //if publish isn't set:
          $model->setScenario('Insert'); 
     } elseif ($model->status === 1){
           $model->setScenario('Publish'); 
     }

在我的模型上:

public function rules()
{
    return array(
         array('name, category', 'required', 'on'=>'Insert'),
         array('name, category, image', 'required', 'on'=>'Publish'))

我没有显示任何验证。

4

3 回答 3

3

您可以使用 Yii 的场景:您声明一个场景如“插入”,另一个场景如“发布”。

在您的模型规则中,您将拥有:

array('username, password, all your required attibutes', 'required', 'on'=>'Publishing'), 
// You defined with the "on" the scenario(s) in which the rule must apply

然后在您的控制器中,您将调用:

如果您需要插入,请将场景设置为“插入”

$model = new MyActiveRecord('Inserting');

如果您需要发布,请将场景设置为“发布”

$model = new MyActiveRecord('Publishing');

链接:了解场景

于 2012-06-21T12:02:43.627 回答
2

请记住,不允许必填字段的限制来自数据库而不是 yii。您的模型基于数据库中的模式。即使您更改模型类中的规则以确保安全,数据库也不会允许插入通过,因为缺少必填字段。

我不建议从数据库中删除任何限制,如何在表中添加另一个字段,将条目标记为可发布或不可发布。您可以通过指定默认值并将发布标志设置为 false 来克服缺少的必需条目。

于 2012-06-21T11:41:46.923 回答
1

编辑是一个完全不同的问题,所以我正在创建一个新的回复

在分配场景之前,您需要使用 post 值填充模型

   <?php if(isset($_POST['HsGuestbook'])) {
         //Assign the post value to your model
         $model->attributes =  $_POST['HsGuestbook'];          
         //check validation scenarios 
          if ($model->status === 0) 
          { 
            //if publish isn't set: 
            $model->setScenario('Insert');
           } 
          elseif ($model->status === 1)
          { 
            $model->setScenario('Publish');
              }
         //Here you should validate/save the datas
        } ?>

然后你可以验证数据

$model->validate();

哪个返回真或假。或者您可以在保存数据时验证数据:

$model->save(); // will validate the datas then save them

它也返回 true 或 false

于 2012-09-12T14:00:07.917 回答