2016-07-30 40 views
5

Używam jednego pliku modelu dla 2 formularzy. Jeden dla SIGNUP & Inne dla A członków dillingowych. Nie został ustawiony żaden scenariusz dla formularza SIGNUP. Ale został ustawiony scenariusz dla Dodawanie członków formularz jest ustawiony.Jak ustawić komunikat sprawdzania poprawności dla pola o walidacji ajaxów w scenariuszach? - Yii2

model

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.'], 

    ]; 
} 

Zobacz

Tutaj ustawić scenariusz jak $modelTeamMembers->scenario = 'addteammembersidebar';.

<?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; ?> 

Wszystkie komunikaty o błędach sprawdzania poprawności działają z wyjątkiem pola email. Jeśli usuniemy z pola 'enableAjaxValidation' => true, to działa. Ale dla mnie wymagane jest 'enableAjaxValidation' => true.

Obraz

enter image description here

jak w obrazek, to jest wyraźnie widoczne, że komunikat o błędzie nadchodzi „Wpisz swój adres e-mail.”, która powinna być „Proszę podać adres e-mail.” . Tylko komunikat błędu sprawdzania poprawności pola email nie nadchodzi poprawnie. Tylko że wszystkie są w porządku.

Jak ustawić komunikat sprawdzania poprawności dla pola email dla scenariuszy? Każda pomoc/podpowiedź/sugestie są dostrzegalne.

+0

Czy moja odpowiedź rozwiązać swój problem lub czy są jakieś problemy? –

Odpowiedz

11

Czy mogę wiedzieć, dlaczego dokładnie trzeba używać sprawdzania poczty e-mail pod numerem AjaxValidation? Dla tego typu wystarczy napisać bez niego, ponieważ AjaxValidation jest bardziej odpowiedni, gdy chcesz wyszukiwać i pobierać dane z bazy danych lub innych modeli, a nie sam model.

Jeśli jednak potrzebujesz AjaxValidation, musisz ustawić kilka różnych rzeczy, ponieważ aktualny kod nie działa.


Konfigurowanie AjaxValidation w View:

// 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); 

Dlaczego to potrzebne? Ustawiłeś AjaxValidation jako aktywny, ale nie ustawiłeś adresu URL, na którym będzie działać ten Ajax. W większości przypadków jest ustawiony na ActiveForm::begin().


Konfigurowanie AjaxValidation w Controller (wymagane):

// 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); 
    } 
} 

Dlaczego to potrzebne? Ajax wyśle ​​żądanie, ale prośba bez żadnych działań nic nie da.Spowoduje to "utworzenie nowego" obiektu z tymi samymi regułami i atrybutami i spróbuje sprawdzić poprawność za pomocą nowego zestawu danych. W przypadku metody renderowania należy również ustawić wartość $obj->scenario, ponieważ w przeciwnym razie byłby to scenariusz domyślny.


Brak zmiany Modelu. Wszystko powinno pozostać takie samo, jak w twoim przykładzie.

W przypadku, gdy chcesz uczynić go wyjątkowym e-mail, trzeba wprowadzić zmiany do Modelu, a także:

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

Cześć Dzięki za odpowiedź. Właściwie dla adresu e-mail sprawdzana jest unikalna reguła sprawdzania poprawności. Istniejący e-mail nie pozwala. Właśnie dlatego zachowuję walidację Ajax. Każdy nowy sposób działania lub ten kod będzie działał w celu unikalnej weryfikacji adresu e-mail. –

+0

@NanaPartykar Trochę zmieniłem kod. Zmieniono tylko tę część ** Modelu **, ponieważ jest to jedyna rzecz, którą należy zmienić. To sprawi, że twój atrybut 'email' będzie unikalny. –

+0

Właściwie to nie poszedłem do biura. Jutro pierwszym zadaniem będzie sprawdzenie tej odpowiedzi. Mam nadzieję, że widząc odpowiedź jakościową, rozwiążę mój problem. * Dzięki * –