Przejdź do głównej zawartości

Rozszerzanie ActiveForm po stronie klienta

Widżet [[yii\widgets\ActiveForm]] posiada szereg wbudowanych metod JavaScript, służących do walidacji po stronie klienta. Ich implementacja jest bardzo elastyczna i pozwala na rozszerzanie ich na wiele sposobów.

ActiveForm wyzwala serie dedykowanych zdarzeń. Używając poniższego kodu, można przechwycić te zdarzenia i je obsłużyć:

$("#contact-form").on("beforeSubmit", function (e) {
if (!confirm("Wszystko jest w porządku. Wysłać formularz?")) {
return false;
}
return true;
});

Poniżej znajdziesz opis dostępnych zdarzeń.

beforeValidate jest wyzwalane przed walidacją całego formularza.

Sygnatura metody obsługującej to zdarzenie powinna wyglądać następująco:

function (event, messages, deferreds)

gdzie

  • event: obiekt Event.
  • messages: asocjacyjna tablica, gdzie kluczami są ID atrybutów, a wartościami tablice opisów błędów dla tych atrybutów.
  • deferreds: tablica obiektów kolejkujących. Możesz użyć deferreds.add(callback), aby dodać nową walidację do kolejki.

Jeśli metoda obsługująca zwróci boolean false, zatrzyma dalszą walidację formularza. W takim wypadku zdarzenie afterValidate nie będzie już wyzwalane.

afterValidate jest wyzwalane po walidacji całego formularza.

Sygnatura metody obsługującej to zdarzenie powinna wyglądać następująco:

function (event, messages, errorAttributes)

gdzie

  • event: obiekt Event.
  • messages: asocjacyjna tablica, gdzie kluczami są ID atrybutów, a wartościami tablice opisów błędów dla tych atrybutów.
  • errorAttributes: tablica atrybutów z błędami walidacji. Sprawdź konstrukcję attributeDefaults, aby dowiedzieć się więcej o strukturze tego parametru.

beforeValidateAttribute jest wyzwalane przed walidacją atrybutu.

Sygnatura metody obsługującej to zdarzenie powinna wyglądać następująco:

function (event, attribute, messages, deferreds)

gdzie

  • event: obiekt Event.
  • attribute: atrybut poddawany walidacji. Sprawdź konstrukcję attributeDefaults, aby dowiedzieć się więcej o strukturze tego parametru.
  • messages: tablica, do której możesz dodać opisy błędów walidacji dla wybranego atrybutu.
  • deferreds: tablica obiektów kolejki. Możesz użyć deferreds.add(callback), aby dodać nową walidację do kolejki.

Jeśli metoda obsługująca zwróci boolean false, zatrzyma dalszą walidację wybranego atrybutu. W takim wypadku zdarzenie afterValidateAttribute nie będzie już wyzwalane.

afterValidateAttribute jest wyzwalane po walidacji całego formularza i każdego atrybutu.

Sygnatura metody obsługującej to zdarzenie powinna wyglądać następująco:

function (event, attribute, messages)

gdzie

  • event: obiekt Event.
  • attribute: atrybut poddawany walidacji. Sprawdź konstrukcję attributeDefaults, aby dowiedzieć się więcej o strukturze tego parametru.
  • messages: tablica, do której możesz dodać opisy błędów walidacji dla wybranego atrybutu.

beforeSubmit jest wyzwalane przed wysłaniem formularza, po pomyślnej walidacji.

Sygnatura metody obsługującej to zdarzenie powinna wyglądać następująco:

function (event)

gdzie event jest obiektem Event.

Jeśli metoda obsługująca zwróci boolean false, zatrzyma wysyłanie formularza.

ajaxBeforeSend jest wyzwalane przed wysłaniem żądania AJAX w przypadku walidacji AJAX-owej.

Sygnatura metody obsługującej to zdarzenie powinna wyglądać następująco:

function (event, jqXHR, settings)

gdzie

  • event: obiekt Event.
  • jqXHR: obiekt jqXHR.
  • settings: konfiguracja żądania AJAX.

ajaxComplete jest wyzwalane po ukończeniu żądania AJAX w przypadku walidacji AJAX-owej.

Sygnatura metody obsługującej to zdarzenie powinna wyglądać następująco:

function (event, jqXHR, textStatus)

gdzie

  • event: obiekt Event.
  • jqXHR: obiekt jqXHR.
  • textStatus: status żądania (“success”, “notmodified”, “error”, “timeout”, “abort” lub “parsererror”).

Walidacja może być przeprowadzona po stronie klienta lub za pomocą AJAX-a, ale wysyłanie formularza jest domyślnie przeprowadzane za pomocą zwyczajnego żądania. Jeśli chcesz przesłać formularz za pomocą AJAX, możesz to zrobić obsługując zdarzenie beforeSubmit formularza w następujący sposób:

var $form = $("#formId");
$form.on("beforeSubmit", function () {
var data = $form.serialize();
$.ajax({
url: $form.attr("action"),
type: "POST",
data: data,
success: function (data) {
// Implementacja pomyślnego statusu
},
error: function (jqXHR, errMsg) {
alert(errMsg);
},
});
return false; // powstrzymuje przed domyślnym sposobem wysłania
});

Aby dowiedzieć się więcej o funkcji jQuery ajax(), zapoznaj się z dokumentacją jQuery.

We współczesnych aplikacjach webowych często koniecznie jest modyfikowanie formularza już po tym, jak został zaprezentowany użytkownikowi. Dla przykładu może to być dodawanie nowego pola po kliknięciu w ikonę “z plusem”. Aby uruchomić walidację takich pól, należy je zarejestrować za pomocą JavaScriptowego pluginu ActiveForm.

Po dodaniu pola do formularza, należy dołączyć je również do listy walidacji:

$("#contact-form").yiiActiveForm("add", {
id: "address",
name: "address",
container: ".field-address",
input: "#address",
error: ".help-block",
validate: function (attribute, value, messages, deferred, $form) {
yii.validation.required(value, messages, {
message: "Informacja dotycząca walidacji tutaj",
});
},
});

Aby usunąć pole z listy walidacji (aby nie było już sprawdzane), możesz wykonać następujący kod:

$("#contact-form").yiiActiveForm("remove", "address");