uSend, czyli formularz kontaktowy dla leniwych

Dawno nie chwaliłem się na blogu nowymi wydaniami swoich projektów i w pewnym momencie stwierdziłem, że to chyba nie jest miejsce służące do informowania o tym, że coś tam ma podbitą wersję z 1.0.5 do 1.0.6 i ostatecznie zaprzestałem tego procederu. Ale sytuacja jest wyjątkowa, bo jeden z moich projektów dobił do 1.0.0 (a właściwie 1.0.1, bo już był bugfix). Projekt jest też na Packagiście, więc stwierdziłem, że nie ma co się kryć i ogłoszę światu, co tam ciekawego ostatnio spłodziłem.

Zdarzyło się wam klecić skrypt do obsługi formularza kontaktowego na prostej stronce, np. SPA bez backendu, czy innej wizytówce w gołym HTML? Mnie tak. Powiem więcej: takich stron utrzymuję kilka i za każdym razem, kiedy musiałem coś zmienić z skrypcie, brała mnie taka niechęć, że szkoda gadać. No i zdarzyła się taka sytuacja, że znajomemu coś tam dłubałem na stronie i okazało się, że jak mu kiedyś wstawiałem formularz, to użyłem funkcji http_response_code(), która nie istniała w PHP 5.3 — a taką wersją kolega właśnie dysponował. Formularz nie działał, odkryliśmy przyczynę — trzeba było coś z tym zrobić. Zasugerowałem, żeby dla własnego dobra zaktualizował wersję PHP, i to do jak najnowszej, najlepiej do 5.6. Jak poradziłem, tak kolega zrobił. No i zaczęło się. Formuarz dalej leżał, do tego padł ten na jeszcze innej stronie na tym samym serwerze.

Dlaczego jeden z formularzy zdechł, nie będę tłumaczył, bo może mi wyjść epistoła, ale w skrócie chodziło o to, że PHP 5.6 domyślnie przy połączeniach szyfrowanych z innym hostem weryfikuje certyfikat SSL. Używał SwiftMailera, który ustawienia verify_peer nie pozwala wyłączyć, bo nie wystawia go w publicznym API. Drugi z kolei korzystał z jakiejś starej wersji PHPMailera, chyba jeszcze pod jakieś wczesne wersje PHP 5 i po prostu korzystał z jakichś zdeprecjonowanych funkcji, co spowodowało sypanie warningami.

Nie chciało mi się dłubać w dwóch zupełnie różnych skryptach, zwłaszcza w tym z PHPMailerem, który był dość niezrozumiałą górą spaghetti, do tego zwracającą jeszcze gotowy HTML, który z kolei JavaScript wykorzystywał do powiadomień po wysyłce. Bałem się, że coś skopię, najkrócej mówiąc, a na odtwarzanie tych samych funkcji to już w ogóle nie miałem ochoty. I tak narodził mi się w głowie pomysł na bibliotekę uSend.

Co to robi? Jak sama nazwa wskazuje, wysyła. Maile, jakby ktoś nie zgadł. Do tego jeszcze waliduje dane z formularza, krawaty wiąże, usuwa ciąże i… a nie, dwóch ostatnich nie zaimplementowałem. No więc zostaje walidacja i wysyłka maili. Niby nic rewolucyjnego, ale nie znalazłem nic, co by dawało takie możliwości w podobnie zgrabny sposób. Otóż sekretem do całej tej zabawy jest fakt, że uSend nie wymaga wołania na nim pierdyliarda metod. Tu sprawdź, czy email jest poprawny, tam ustaw nagłówek wiadomości taki, siaki, czy owaki. Nic z tych rzeczy. Wszystko odbywa się przez konfigurację w zewnętrznym pliku. uSend łyka oczywiście konfigurację w postaci zwykłej tablicy, ale bardziej elegancko jest użyć pliku konfiguracyjnego — a można tu użyć formatu YAML lub JSON, do wyboru, do koloru. Oddzielnie konfigurowany jest transport maili (pewnie będzie jeden na całą aplikację), a oddzielnie walidacja i wysyłka maili (bo tu już trzeba oddzielnie skonfigurować każdy formularz).

Walidacja odbywa się za pomocą walidatorów z Zend Frameworka. W konfiguracji podajemy nazwy walidatorów i opcjonalnie również ich konfigurację (np. StringLength łyka minimalną długość stringa). Walidujemy te pola, które chcemy i takimi walidatorami, jakie nam się podobają.

Konfiguracja maili polega na podaniu treści i nagłówków. Co ciekawe, wszystko w konfiguracji wysyłanych wiadomości jest traktowane jako templatka Twiga lub nazwa pliku zawierającego taką templatkę. Można zatem w konfiguracji łatwo podać adres mail osoby, która wypełniła formularz: "{{ mail }}". Za każdym razem, gdy formularz zostanie wypełniony, zmienna ta będzie inna, ale konfiguracja jest ta sama. Dla treści wiadomości można (i należy) użyć zewnętrznych templatek. Można tam sobie spłodzić praktycznie dowolną wiadomość, a jej modyfikacja nie przysparza problemównawet osobie, która z PHP nie ma nic wspólnego. Ot, otwieramy templatkę Twiga, zmieniamy tekst, zapisujemy i wszystko gra.

Biblioteka jest dostępna w swoim repozytorium oraz na Packagiście.


Komentarze

Darek

2015-10-07, 13:15

Siema :).
Wszystko fajnie, tylko bladego pojęcia nie mam jak tego użyć. Templata nie ma, testy nibą są, ale nie działają. Może coś źle robię, nie wiem. Przykład z PHPUnit mi działa, więc i Twój test powinien działać. Tak czy inaczej szkoda, bo zapowiadało się fajnie.

Dominik Marczuk

2015-10-07, 13:29

Hej. Czy możesz dokładniej opisać, co nie działa i/lub co jest niewystarczająco opisane? Problem z pisaniem kodu w pojedynkę zawsze jest taki, że autor wszystko kuma i nie zdaje sobie sprawy z tego, co dla innej osoby może być nieoczywiste. Jakbyś zgłosił szczegóły w bugtrackerze, byłbym wielce zobowiązany: https://bitbucket.org/mingos/usend
Z góry dzięki.


Napisz komentarz


Szukaj wpisów


Chmura tagów