2017-05-26 46 views
0

我完全失去了爲什麼會發生這種情況,而且大約有50%的時間發生。Yii2;代碼首先在「else」塊中運行,然後在「if」塊之前運行代碼?

我有一個檢查,看看用戶是否存在通過電子郵件和姓氏,如果他們這樣做,運行一些代碼。如果用戶不存在,則創建用戶,然後運行一些代碼。

我已經使用虛擬數據進行了各種測試,即使用戶不存在,它也會先創建它們,然後在「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(); 
} 

我已經試過清空緩存。我試過用原始SQL查詢使用Yii::$app->db->createCommand(),但似乎沒有任何工作。我完全被難住了。

有誰知道它爲什麼會先創建用戶,然後在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'); 
} 

這裏的多次嘗試後回答:

傳遞一個「ajaxParam」參數與的ActiveForm控件定義GET參數,這將是名如果請求是ajax請求,則發送。我給我的參數命名爲「ajax」。

下面介紹一下的ActiveForm的開頭是這樣的:

$form = ActiveForm::begin([ 
    'id' => 'complete-form', 
    'ajaxParam' => 'ajax' 
]) 

然後,我在我的控制器中添加此檢查:

if (Yii::$app->request->get('ajax') || Yii::$app->request->isAjax) { 
    return false; 
} 

這是一個AJAX的問題,所以非常感謝幫到尤皮克指向我(接受他的回答,因爲它引導我到這裏)。

+0

在創建功能位置這個'if'叫? – Yupik

+0

@Yupik它在控制器內部被調用。我注意到一些非常奇怪的東西。它與使用Active表單驗證表單輸入有關。顯然,如果我運行'validate()'方法,它將運行整個控制器方法(並抑制任何輸出或進行奇怪的重定向),然後再次加載控制器方法。我猜這就是這個錯誤發生的原因。它第一次運行控制器方法來驗證輸入,然後創建一個新用戶,它再次調用該方法,但到那時,用戶已經創建......至少,這是我認爲正在發生的事情。 – 9997

+0

顯示控制器代碼 –

回答

0

'enableAjaxValidation' => false添加到您查看的ActiveForm參數中。發生這種情況是因爲yii向您的操作發送請求以驗證此模型,但在您的陳述之前未處理。

+0

它似乎沒有工作。 :(我甚至嘗試禁用客戶端驗證,並仍然是虛擬現實 – 9997

+0

嘗試檢查瀏覽器中的開發人員工具網絡,如果它發送任何 - 我們必須深入瞭解Ajax請求 – Yupik

+0

已經檢查過,並沒有網絡活動 – 9997

1

你可以把驗證像下面的模型:

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

,並創建/應用相同的功能姓氏。

放表單域的電子郵件和姓氏=> [ 'enableAjaxValidation'=>真]在控制器

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 
} 
相關問題