2016-07-30 41 views
5

2 form için bir model dosyası kullanıyorum. Bir Dding üyeleri için SIGNUP Diğeri için.Senaryolarda ajax doğrulaması olan alan için doğrulama mesajı nasıl ayarlanır? - Yii2

SIGNUP formu için herhangi bir senaryo belirlemedim. Ancak, için senaryo ekleniyor üye ekleme formu ayarlanır.

Modeli

public function rules() { 
    return [ 

    //Add Members 
    ['first_name', 'required','message'=>'Please enter first name.','on'=>'addteammembersidebar'], 
    ['email', 'required','message'=>'Please enter email address.','on'=>'addteammembersidebar'], 
    ['mobile','required','message'=>'Please enter mobile number.','on'=>'addteammembersidebar'], 

    //Common 
    ['first_name', 'required','message'=>'Please enter your first name.'], 
    ['email', 'required','message'=>'Please enter your email address.'], 
    ['mobile','required','message'=>'Please enter your mobile number.'], 

    ]; 
} 

Burada Görünüm

, ben $modelTeamMembers->scenario = 'addteammembersidebar'; gibi senaryo ayarlayın.

<?php foreach ($modelsTeamMembers as $indexMember => $modelTeamMembers): 
    $modelTeamMembers->scenario = 'addteammembersidebar'; 
    ?> 
    <tr class="house-item"> 
    <td class="vcenter"> 
     <?php 
     // necessary for update action. 
     if (! $modelTeamMembers->isNewRecord) { 
     echo Html::activeHiddenInput($modelTeamMembers, "[{$indexMember}]id"); 
     } 
     ?> 

     <?php 
     $modelTeamMembers->first_name = $first_name; 
     echo $form->field($modelTeamMembers, "[{$indexMember}]first_name")->label(false); 
     ?> 
    </td> 
    <td> 
     <?php 
     $modelTeamMembers->last_name = $last_name; 
     echo $form->field($modelTeamMembers, "[{$indexMember}]last_name")->label(false); 
     ?> 
    </td> 
    <td> 
     <?php 
     $modelTeamMembers->email = $email; 
     echo $form->field($modelTeamMembers, "[{$indexMember}]email",['enableAjaxValidation' => true])->label(false); 
     ?> 
    </td> 
    <td> 
     <?php 
     $modelTeamMembers->mobile = $mobile_number; 
     echo $form->field($modelTeamMembers, "[{$indexMember}]mobile", 
      ['inputOptions' => ['class' => 'form-control', 'maxlength'=>"10"]])->label(false); 
     ?> 
    </td> 
    </tr> 

<?php endforeach; ?> 

email alanı hariç çalışan tüm doğrulama hata mesajı. 'enableAjaxValidation' => true alanını alandan kaldırırsam çalışır. Ama benim için 'enableAjaxValidation' => true gereklidir. görüntüdeki gibi resmi

enter image description here

, önümüzdeki bu hata mesajı açıkça görülebilir "e-posta adresinizi girin." olmalıdır hangisi "e-posta adresini girin." . Sadece email alan doğrulama hatası mesajı doğru değil. Hepsinin dışında iyiler.

Senaryolar için email alan için doğrulama mesajı nasıl ayarlanır? Herhangi bir yardım/ipucu/önerileri takdir edilebilir.

+0

cevabım sorununuzu çözdü mü ya da herhangi bir sorunları vardır: durumunda

bunu benzersiz e-posta yapmak istiyorum, siz de Model değişiklik yapmak zorunda? –

cevap

11

Neden burada AjaxValidation ile e-posta doğrulamasını kullanmanız gerektiğini tam olarak biliyor musunuz? Bu tip için veri tabanından veya diğer modellerden veri aramak ve almak istediğinizde, AjaxValidation daha uygun olduğundan yazı yazmanız yeterlidir. Ancak, AjaxValidation'a ihtiyacınız olduğunu düşünüyorsanız, geçerli kodun çalışmayacağından birkaç farklı şey ayarlamanız gerekir.


Görünüm içinde AjaxValidation kurma:

// Set to: index.php?r=profile/email-validation 
$form = ActiveForm::begin(['validationUrl' => ['profile/email-validation']]); 

// This is set correctly (no changes are needed comparing to your attempt) 
echo $form->field($modelTeamMembers, "[{$indexMember}]email", ['enableAjaxValidation' => true])->label(false); 

Bu neden gerekli? Etkin olmak için AjaxValidation ayarladınız, ancak bu Ajax'ın çalışacağı URL'yi ayarlamadınız. Çoğu durumda ActiveForm::begin()'da ayarlanır.


Kontrolör içinde AjaxValidation kurma (gerekli):

// Method that renders your view file 
public function actionSomethingThatRendersView() 
{ 
    // Code here 
    $user->scenario = 'addteammembersidebar';     // Custom scenario name 
    return $this->render(/* the remaining code goes here */); 
} 

// This is the method that Ajax will send request to ($_POST[]) 
public function actionEmailValidation() 
{ 
    $post = Yii::$app->request->post(); 
    if (!empty($post)) 
    { 
     Yii::$app->response->format = Response::FORMAT_JSON; // Must be in JSON format 
     $profile = new User();        // Edit your class name in here 
     // Custom scenario (must be the same as above otherwise you might get unexpected response) 
     $profile->scenario = 'addteammembersidebar'; 
     $profile->load($post); 

     return ActiveForm::validate($profile); 
    } 
} 

Bu neden gerekli? Ajax bir istek gönderecek ancak herhangi bir eylemde bulunmadan istekte bulunmayacaktır.Bu, aynı kurallara ve özelliklere sahip "yeni" nesne oluşturacak ve yeni veri kümesini doğrulamaya çalışacaktır. Görüntüleme yöntemi için $obj->scenario da ayarlanmalıdır, aksi halde varsayılan senaryo kullanılır.


Model herhangi bir değişiklik bulunmamaktadır. Her şey senin örneğindekiyle aynı kalmalı.

public function rules() 
{ 
    // ... 
    ['email', 'unique', 'message' => 'Email must be unique'], 
    // If your attribute is not in the same table as defined in class, then: 
    ['email', 'unique', 'message' => 'Email must be unique', 'targetClass' => User2::className()], 
} 
+1

Merhaba Yanıtladığınız için teşekkür ederiz. Aslında kontrol etmek için e-posta alanı benzersiz doğrulama kuralı için. Mevcut e-postaya izin verilmiyor. Bu yüzden Ajax onayını saklıyorum. Herhangi bir yeni yol veya bu kod e-posta benzersiz doğrulama için çalışacaktır. –

+0

@NanaPartykar Kodu biraz düzenledim. Değiştirmeniz gereken tek şey olduğu için ** Model ** nin sadece bir kısmı değiştirildi. Bu, 'e-posta' özelliğinizi benzersiz hale getirecektir. –

+0

Aslında ben ofise gitmedim. Yarın ilk görev bu cevabı kontrol etmek olacak. Umarım, kalite cevabını görerek problemimi çözerim. * Teşekkürler * –