Yii2;先在 "else" 块中编码 运行,然后在 "if" 块之前编码 运行?
Yii2; code running in "else" block first, and then running code before "if" block?
我完全不知道为什么会这样,而且大约有 50% 的时间会发生这种情况。
我通过电子邮件和姓氏检查用户是否存在,如果存在,运行 一些代码。如果用户不存在,则创建用户,然后 运行 一些代码。
我已经对虚拟数据进行了各种测试,即使用户不存在,它也会首先创建它们,然后 运行s "if" 块中的代码。
这是我的。
if (User::existsByEmailAndLastName($params->email, $params->lastName)) {
var_dump('user already exists');
} else {
User::createNew($params);
var_dump("Creating a new user...");
}
下面是各自的方法:
public static function existsByEmailAndLastName($email, $lastName) {
return User::find()->where([
'email' => $email,
])->andWhere([
'last_name' => $lastName
])->one();
}
public static function createNew($params) {
$user = new User;
$user->first_name = $params->firstName;
$user->last_name = $params->lastName;
$user->email = $params->email;
$user->address = $params->address;
$user->address_2 = $params->address_2;
$user->city = $params->city;
$user->province = $params->province;
$user->country = $params->country;
$user->phone = $params->phone;
$user->postal_code = $params->postal_code;
return $user->insert();
}
我试过刷新缓存。我已经使用 Yii::$app->db->createCommand()
对原始 SQL 查询进行了尝试,但似乎没有任何效果。我完全被难住了。
有谁知道为什么要先创建用户,然后在 if 语句中进行检查?
使用控制器代码编辑:
public function actionComplete()
{
if (Yii::$app->basket->isEmpty()) {
return $this->redirect('basket', 302);
}
$guest = Yii::$app->request->get('guest');
$params = new CompletePaymentForm;
$post = Yii::$app->request->post();
if ($this->userInfo || $guest) {
if ($params->load($post) && $params->validate()) {
if (!User::isEmailValid($params->email)) {
throw new UserException('Please provide a valid email.');
}
if (!User::existsByEmailAndLastName($params->email, $params->lastName)) {
User::createNew($params);
echo "creating new user";
} else {
echo "user already exists";
}
}
return $this->render('complete', [
'model' => $completeDonationForm
]);
}
return $this->render('complete-login-or-guest');
}
这是经过多次尝试后的答案:
通过 ActiveForm 小部件传递 'ajaxParam' 参数以定义在请求是 ajax 请求时将发送的 GET 参数的名称。我将我的参数命名为 "ajax"。
ActiveForm 的开头如下所示:
$form = ActiveForm::begin([
'id' => 'complete-form',
'ajaxParam' => 'ajax'
])
然后我在我的控制器中添加了这个检查:
if (Yii::$app->request->get('ajax') || Yii::$app->request->isAjax) {
return false;
}
这是一个 ajax 问题,所以非常感谢 Yupik 指出我的方向(接受他的回答,因为它引导我来到这里)。
将 'enableAjaxValidation' => false
添加到视图中的 ActiveForm 参数。发生这种情况是因为 yii 向您的操作发送请求以验证此模型,但它未在您的 if
语句之前处理。
您可以在您的模型中进行如下验证:
public function rules() { return [ [['email'], 'functionName'], [['lastname'], 'functionforlastName'], ];}
public function functionName($attribute, $params) {
$usercheck=User::find()->where(['email' => $email])->one();
if($usercheck)
{
$this->addError($attribute, 'Email already exists!');
}
}
和create/apply相同的姓氏函数。
输入表单字段电子邮件和姓氏 => ['enableAjaxValidation' => true]
在控制器的创建函数中
use yii\web\Response;
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
else if ($model->load(Yii::$app->request->post()))
{
//place your code here
}
我完全不知道为什么会这样,而且大约有 50% 的时间会发生这种情况。
我通过电子邮件和姓氏检查用户是否存在,如果存在,运行 一些代码。如果用户不存在,则创建用户,然后 运行 一些代码。
我已经对虚拟数据进行了各种测试,即使用户不存在,它也会首先创建它们,然后 运行s "if" 块中的代码。
这是我的。
if (User::existsByEmailAndLastName($params->email, $params->lastName)) {
var_dump('user already exists');
} else {
User::createNew($params);
var_dump("Creating a new user...");
}
下面是各自的方法:
public static function existsByEmailAndLastName($email, $lastName) {
return User::find()->where([
'email' => $email,
])->andWhere([
'last_name' => $lastName
])->one();
}
public static function createNew($params) {
$user = new User;
$user->first_name = $params->firstName;
$user->last_name = $params->lastName;
$user->email = $params->email;
$user->address = $params->address;
$user->address_2 = $params->address_2;
$user->city = $params->city;
$user->province = $params->province;
$user->country = $params->country;
$user->phone = $params->phone;
$user->postal_code = $params->postal_code;
return $user->insert();
}
我试过刷新缓存。我已经使用 Yii::$app->db->createCommand()
对原始 SQL 查询进行了尝试,但似乎没有任何效果。我完全被难住了。
有谁知道为什么要先创建用户,然后在 if 语句中进行检查?
使用控制器代码编辑:
public function actionComplete()
{
if (Yii::$app->basket->isEmpty()) {
return $this->redirect('basket', 302);
}
$guest = Yii::$app->request->get('guest');
$params = new CompletePaymentForm;
$post = Yii::$app->request->post();
if ($this->userInfo || $guest) {
if ($params->load($post) && $params->validate()) {
if (!User::isEmailValid($params->email)) {
throw new UserException('Please provide a valid email.');
}
if (!User::existsByEmailAndLastName($params->email, $params->lastName)) {
User::createNew($params);
echo "creating new user";
} else {
echo "user already exists";
}
}
return $this->render('complete', [
'model' => $completeDonationForm
]);
}
return $this->render('complete-login-or-guest');
}
这是经过多次尝试后的答案:
通过 ActiveForm 小部件传递 'ajaxParam' 参数以定义在请求是 ajax 请求时将发送的 GET 参数的名称。我将我的参数命名为 "ajax"。
ActiveForm 的开头如下所示:
$form = ActiveForm::begin([
'id' => 'complete-form',
'ajaxParam' => 'ajax'
])
然后我在我的控制器中添加了这个检查:
if (Yii::$app->request->get('ajax') || Yii::$app->request->isAjax) {
return false;
}
这是一个 ajax 问题,所以非常感谢 Yupik 指出我的方向(接受他的回答,因为它引导我来到这里)。
将 'enableAjaxValidation' => false
添加到视图中的 ActiveForm 参数。发生这种情况是因为 yii 向您的操作发送请求以验证此模型,但它未在您的 if
语句之前处理。
您可以在您的模型中进行如下验证:
public function rules() { return [ [['email'], 'functionName'], [['lastname'], 'functionforlastName'], ];}
public function functionName($attribute, $params) {
$usercheck=User::find()->where(['email' => $email])->one();
if($usercheck)
{
$this->addError($attribute, 'Email already exists!');
}
}
和create/apply相同的姓氏函数。
输入表单字段电子邮件和姓氏 => ['enableAjaxValidation' => true]
在控制器的创建函数中
use yii\web\Response;
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
else if ($model->load(Yii::$app->request->post()))
{
//place your code here
}