Yii2规则仅适用于场景

时间:2018-06-06 09:47:01

标签: yii2 yii2-basic-app scenarios

我在Yii2评论模型中写了两个场景,当用户登录或是访客时。

我的规则是:

public function scenarios()
{
    $scenarios = parent::scenarios();
    $scenarios[self::SCENARIO_GUEST] = ['name' , 'email'];
    $scenarios[self::SCENARIO_USER] = ['user_id'];
    return $scenarios;
}

和senarios funtion:

$commentModel = Yii::$app->user->isGuest ? new Comment(['scenario' => Comment::SCENARIO_GUEST]) : new Comment(['scenario' => Comment::SCENARIO_USER]);

我按如下方式使用它:

{% load staticfiles %}
    <!DOCTYPE html>

<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello Django</title>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<link rel="stylesheet" href="{% static "css/style.css" %}">
<link rel="stylesheet" href="{% static "css/style2.css" %}">
<script src="{% static 'js/jquery.1.12.4.min.js' %}"></script>
<script type="text/javascript" src="{% static "js/main.js" %}"></script>
<script src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
{% block js %}{% endblock %}

</head>
<body>
{% block content %}{% endblock content %}


</body>
</html>

如果客人查看表单,只检查姓名和电子邮件以及用户填写表单,则不检查任何字段! 为什么其他规则不检查?如何解决?

2 个答案:

答案 0 :(得分:4)

参考this article

scenario()方法返回一个数组,其键是方案名称,并且值为相应的活动属性。可以大规模分配活动属性并进行验证。

# Create simple example
df <- cbind.data.frame(A=c("A","B","C")
                      ,B=c(1,2,3)
,Timestamp_1=c(as.POSIXct(NA),as.POSIXct("2018-05-04 00:19:41"),as.POSIXct("2018-07-31 22:09:10"))
,Timestamp_2=c(as.POSIXct("2018-05-04 00:18:45"),as.POSIXct("2018-05-05 00:18:43"),as.POSIXct("2018-06-05 00:00:01"))
,Timestamp_3=c(as.POSIXct("2018-05-04 00:19:13"),as.POSIXct("2018-05-05 00:17:00"),as.POSIXct("2018-05-06 00:18:41"))
,C=c("Dog","Cat","Mouse")
)

df

A B         Timestamp_1         Timestamp_2         Timestamp_3     C
1 A 1                <NA> 2018-05-04 00:18:45 2018-05-04 00:19:13   Dog
2 B 2 2018-05-04 00:19:41 2018-05-05 00:18:43 2018-05-05 00:17:00   Cat
3 C 3 2018-07-31 22:09:10 2018-06-05 00:00:01 2018-05-06 00:18:41 Mouse

答案 1 :(得分:2)

如果使用scenarios(),则需要定义在给定方案中允许分配的所有属性。因此,如果您希望允许访客同时修改sudo stop zeppelin; sudo start zeppelinbody,您需要以下内容:

date

如果您在方案之间有许多“共享”属性,则可能不应覆盖此方法并仅在public function scenarios() { $scenarios = parent::scenarios(); $scenarios[self::SCENARIO_GUEST] = ['name' , 'email', 'body', 'date']; $scenarios[self::SCENARIO_USER] = ['user_id']; return $scenarios; } 中定义它。

scenarios documentation中查看更多内容。