2016-07-30 4 views
5

Ich verwende eine Modelldatei für 2 Formulare. Eine für ANMELDEN & Andere für A dding Mitglieder.Wie setze ich eine Validierungsnachricht für ein Feld mit einer Ajax-Validierung in Szenarien? - Yii2

Ich habe kein Szenario für SIGNUP Formular festgelegt. Aber Szenario für Hinzufügen von Mitgliedern Formular wird festgelegt.

Modell

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

    ]; 
} 

Ansicht

Hier stelle ich Szenario wie $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; ?> 

All Nachricht Validierungsfehler mit Ausnahme email Feld arbeiten. Wenn ich 'enableAjaxValidation' => true aus dem Feld entferne, funktioniert es. Aber für mich ist 'enableAjaxValidation' => true erforderlich.

Bild

enter image description here

Wie in Bild, ist es deutlich zu sehen, dass Fehlermeldung kommt „Bitte geben Sie Ihre E-Mail-Adresse ein.“ Was sollte „Bitte geben Sie E-Mail-Adresse ein.“ . Nur email Feldvalidierungsfehlermeldung wird nicht korrekt angezeigt. Außer alle sind in Ordnung.

Wie setze ich die Validierungsnachricht für email Feld für Szenarien? Jede Hilfe/Hinweis/Vorschläge sind nennenswert.

+0

Hat meine Antwort Ihr Problem gelöst oder es irgendwelche Probleme? –

Antwort

11

Darf ich wissen, warum genau müssen Sie E-Mail-Validierung mit AjaxValidation hier? Für diesen Typ ist es genug, ohne es zu schreiben, da AjaxValidation besser geeignet ist, wenn Sie Daten aus der Datenbank oder anderen Modellen suchen und abrufen möchten, nicht selbst modellieren.

Wenn Sie jedoch das Gefühl haben, Sie brauchen AjaxValidation, müssen Sie ein paar verschiedene Dinge einrichten, da Ihr aktueller Code nicht funktioniert.


Einrichten AjaxValidation in Ansicht:

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

Warum dies notwendig? Sie haben AjaxValidation als aktiv festgelegt, aber Sie haben keine URL festgelegt, mit der dieser Ajax arbeiten wird. Es ist in den meisten Fällen in ActiveForm::begin() eingestellt.


Einrichten AjaxValidation in -Controller (erforderlich):

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

Warum dies notwendig? Ajax wird eine Anfrage senden, aber eine Anfrage ohne irgendwelche Aktionen wird nichts tun.Dies wird ein "neues" Objekt mit denselben Regeln und Attributen erzeugen und wird versuchen, mit neuen Datensätzen zu validieren. Für die Rendering-Methode muss $obj->scenario ebenfalls festgelegt werden, da andernfalls das Standardszenario verwendet würde.


Es sind keine Änderungen an Modell. Alles sollte gleich bleiben wie in Ihrem Beispiel.

Falls Sie es eindeutige E-Mail machen, müssen Sie auch Änderungen an Modell machen:

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

Hallo Danke für die Antwort. Eigentlich für E-Mail-Feld eindeutige Validierungsregel, die ich überprüfe. Bestehende E-Mails nicht zulassen. Deshalb behalte ich Ajax-Validierung. Jeder neue Weg oder dieser Code funktioniert für die eindeutige Validierung von E-Mails. –

+0

@NanaPartykar Ich habe den Code ein wenig bearbeitet. Habe nur den Teil von ** Model ** geändert, da es das einzige ist, was du ändern musst. Dadurch wird Ihr Attribut'Email' eindeutig. –

+0

Eigentlich bin ich nicht ins Büro gegangen. Morgen wird die erste Aufgabe sein, diese Antwort zu überprüfen. Ich hoffe, durch die Qualität Ihrer Antwort wird mein Problem gelöst. * Danke * –

Verwandte Themen