Przykład użycia hook „additionalCustomerFormFields”
Dzisiaj technicznie.
Jeden z użytkowników popularnej grupy PrestaShop na Facebook nie umiał poradzić sobie ze zmodyfikowaniem pól formularza, które dostępne są w procesie rejestracji. Jego zadaniem było zmodyfikowanie pola „optin” w taki sposób aby nadpisać zarówno treść jak i styl tego pola.
Z pomocą przychodzi hook „additionalCustomerFormFields”, od wersji 1.7.7 PrestaShop dostał on parametr fields, który zawiera całą tablicę pól używanych przez tę klasę.
W tym artykule opisuje w jaki sposób możemy z niego korzystać.
Jak to działa?
Tak jak w wielu innych miejscach systemu, tak i tutaj, dostajemy parametr, który jest przekazywany jako referencja (tutaj artykuł czym są referencje), dzięki temu możemy na nim dowolnie operować, a nasze modyfikacje będą miały zastosowanie po wywołaniu tego Hook’a.
Aby zacząć, musimy oczywiście przypiąć się do odpowiedniego miejsca w kodzie w naszym module.
public function install() { return parent::install() && $this->registerHook('additionalCustomerFormFields'); }
W metodzie, która obsługuje już przypięcie mamy dostęp do całej tablicy pól, w ten sposób:
public function hookAdditionalCustomerFormFields($params) { $format = $params['fields']; dump($format); }
Jeżeli wejdziemy w tym momencie na stronę rejestracji to zobaczymy wszystkie pola:
Mając do nich dostęp, reszta jest tylko formalnością. Przejdźmy do realnego użycia hookAdditionalCustomerFormFields.
Dodawanie pól
Każde pole, które przekazywane jest dalej powinno być instancją FormField, jest to klasa dostępna globalnie w systemie. Pole dodajemy w taki sposób:
public function hookAdditionalCustomerFormFields($params) { $format = $params['fields']; $format['confirmation_email'] = (new FormField()) ->setName('confirmation_email') ->setType('email') ->setLabel($this->trans('Confirm your e-mail address', [], 'Modules.Demooverridecustomerformatter.Front')) ->setRequired(true); $params['fields'] = $format; }
W ten sposób dodamy nowe pole do formularza, jest to pole o nazwie „confirmation_email”, dość popularny przykład dodania elementu, który ma na celu zmuszenie kupującego do potwierdzenia swojego adresu e-mail.
Usuwanie pól
Jeżeli chcemy spowodować, że któreś z pól nie będzie już dostępne w formularzu, możemy je usunąć używając unset. Przykład:
public function hookAdditionalCustomerFormFields($params) { $format = $params['fields']; unset($format['id_gender']); $params['fields'] = $format; }
Modyfikacja pól
Dochodzimy też do modyfikacji pól czyli tego na czym zależało autorowi wątku na Facebook, w jaki sposób modyfikować pola? Skupmy się na polu optin, zmodyfikujmy jego etykietę, a także dodajmy styl (chociaż to akurat nie jest coś co powinniśmy robić w tej warstwie aplikacji).
public function hookAdditionalCustomerFormFields($params) { $format = $params['fields']; $newLabel = '<em class="text-warning">'; $newLabel .= $this->trans( 'I want to receive free gift from your partners', [], 'Modules.Demooverridecustomerformatter.Front' ); $newLabel .= '</em>'; $format['optin']->setLabel( $newLabel ); $params['fields'] = $format; }
Jak widzimy, mając dostęp do instancji danego pola, możemy używać metod dostępnych w klasie FormField, jedną z nich jest właśnie setLabel.
Dodaliśmy pochylenie, kolor i zmieniliśmy tekst, efekt jest następujący:
Podsumowanie
Jak widzimy obsługa pól formularza rejestracji przy użyciu dedykowanego Hook jest całkiem przystępna i pozwala developerom na pełną kontrolę nad nim. Jako, że pola to tablica możemy je dowolnie modyfikować, zmieniać ich kolejność, usuwać i dodawać nowe.
Ten artykuł nie pokrył wszystkich kwestii związanych z formularzem rejestracji, nie pokazałem jak wartości przesyłane z dodatkowych pól odbierać, weryfikować i ewentualnie zapisywać w systemie, na to jednak przyjdzie czas innym razem.