Yii2: ajax Formular-Validierung, die auf eine ajax-Formulars gesendet
Frage ich mich, ob alle Yii2 Experten kann mir helfen zu verstehen, wie am besten, um die Arbeit mit ajax-Formulare kombiniert mit Yii ajax-Validierung. Ich denke, ich kann erklären, das Problem, ohne Sie durch alle von meinem code.
Arbeite ich an einer Promo-Code-Eingabe-Formular, wo die Benutzer Ihre promo code in das Formular, wird das Formular Absenden via ajax. Wir führen Sie dann eine Datenbank-lookup für den promo-code ein, überprüfen Sie den code, und wenn der code validiert, wollen wir die Anzeige des Formulars, die versteckt auf der Seite.
Habe ich eine benutzerdefinierte validierungsfunktion für das Formular-Feld "code", welches der aktive Bereich in einem Modell-Szenario mit der Bezeichnung "registrieren".
class UserCode extends ActiveRecord
{
...
public function scenarios()
{
return [
'register' => ['code'],
];
}
public function rules()
{
return [
[['code'], 'required'],
[['code'], 'validateUserCode', 'on' => ['register']],
];
}
public function validateUserCode($attribute, $params)
{
//perform all my custom logic to determine if the code is valid
if ($code_invalid) {
$this->addError($attribute, 'Sorry, this code is invalid.');
}
}
...
}
Dann in den controller, wie die Yii2 Guide schon sagt, ich Falle dieses ajax-Validierung mit dem folgenden code:
public function actionValidate() {
$model = new UserCode(['scenario' => 'register']);
if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
Yii::$app->response->format = Response::FORMAT_JSON;
return ActiveForm::validate($model);
}
//no logic can be run after the above code b/c the form is submit with ajax
//and therefore always trapped in the Yii::$app->request->isAjax conditional
}
Der obige code alles Prima funktioniert und wenn ich den Fokus aus dem $form->field($model, 'code')
Feld auf meinem Formular, Yii 's ajax-Validierung in tritt und zeigt meine benutzerdefinierte Fehlermeldung aus der Basis von" meine benutzerdefinierte Validierungslogik.
Meine Herausforderung entsteht, wenn ich gehen, um das Formular Absenden. Das Formular ist auch erfolgt über ajax, und daher der controller-Aktion gibt immer das Ergebnis der ActiveForm::validate($model);
weil if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post()))
erhalten gelten sowohl für die ajax Formular-Validierung UND das Formular Absenden.
Mit dem obigen Ansatz, bin ich gezwungen, wieder nur die Ergebnisse von ajax-Validierung und keine json-Daten, die ich brauchen kann für zusätzliche client-seitige Validierung, wie z.B. die Anzeige des Anmeldeformulars nach einen gültigen code verwenden, übermittelt durch die ajax-Formular.
Merke ich, dass ich einstellen kann 'enableAjaxValidation' => false
auf die ActiveForm und dann wieder meine eigene json-Daten innerhalb der if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post()))
Zustand. Wenn ich das mache, bin ich in der Lage zu zeigen das Anmeldeformular, weil ich mein eigenes json-Daten, mit zu arbeiten.
Gibt es eine Möglichkeit, ajax-Validierung auf ein Formular, das vorgelegt wird, mit ajax? Wie konnte Sie fangen die ajax-Validierung separat von der ajax-Formular zu handhaben, die zwei Ereignisse in verschiedenen Manieren?
Irgendwelche Vorschläge oder alternativen Annäherungen sind SEHR geschätzt!
- Nicht dieser helfen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie
validationUrl
mit einer anderen URL im Vergleich zu der URL, die Sie dem Absenden des Formulars zu. Auf diese Weise können Sie die Validierung Funktion, validieren würde und die Rückkehr derreturn ActiveForm::validate($model);
normal und die submit-Formular, das macht noch etwas anderes.Lesen Sie mehr über
validationUrl
hier:Ich habe die Lösung gefunden :
Form :
Submit Via Ajax :
Controller :