• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[Code Review] Formularz kontaktowy

Object Storage Arubacloud
0 głosów
255 wizyt
pytanie zadane 30 marca 2017 w Nasze projekty przez Codeboy Stary wyjadacz (12,120 p.)

Stworzyłem formularz kontaktowy (w sumie poprawiłem stary) dla mojej strony jaki-jezyk-programowania.pl i napisałem na moim blogu konkursowym DSP2017 serię postów opisujących ten proces krok po kroku.  Są 4 części. TU - pierwsza z nich, gdzie opisuję założenia. Zwracam się do was z prośbą o review. 
Uwzględniam:

  • HTML5
  • Javascript
  • JQuery
  • AJAX
  • PHP
  • Swiftmailer
  • Dostępność

Więc każdy znajdzie coś dla siebie ;) W postach starałem się w miarę wszystko uzasadniać, więc jeśli macie czas to przeczytajcie i ewentualnie mnie naprostujcie gdzie się mylę. Postaram się dopracować co trzeba według waszych sugestii, żeby te wpisy stały się rzetelne i żeby inni początkujący na tym korzystali ;)


Jeśli chcecie rzucić okiem tylko na kod to efekty końcowe są na końcu każdego postu w jsfiddle. Posty z ostatecznym kodem: HTML-JS i PHP

Dzięki sugestiom od  event15 (PHP) oraz Ivan (dostępność) zagłębiłem się w temat i oto tego efekt ;). Większość rzeczy musiałem się douczyć od podstaw, mam nadzieję, że nie trafiłem na jakieś stare źródła. Od Ivana dostałem również PR (dzięki wielkie jeszcze raz) w którym poprawiał dostępność strony i zastosował strukturę z role="document" dla formularza. Tu linki do githuba:HTMLJS. Ja nieco zmodyfikowałem formularz i pozbyłem się tego (bo wydawało mi się zbędne) pozostając przy samym role="dialog" + dopracowałem kwestię jego dostępności. Gryzło się to też z niektórymi założeniami W3C. Dajcie znać czy tak też jest ok ;)

komentarz 31 marca 2017 przez efiku Szeryf (75,160 p.)

2 odpowiedzi

+2 głosów
odpowiedź 31 marca 2017 przez xandros Nałogowiec (29,450 p.)
wybrane 18 kwietnia 2017 przez Codeboy
 
Najlepsza
<?php

require_once 'swiftmailer/lib/swift_required.php'; //najlepiej uzyc composera
$config    = require_once 'emailconfig.php'; //brakuje __DIR__
$secretKey = $config['secretKey'];

$userEmail = $_POST['userEmail'];
$subject   = filter_var($_POST['subject'], FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);
$message   = filter_var($_POST['message'], FILTER_SANITIZE_STRING, FILTER_FLAG_NO_ENCODE_QUOTES);

$checkIfBot = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret=' . $secretKey . '&response=' . $_POST['g-recaptcha-response']);
$recaptcha  = json_decode($checkIfBot);

if (!filter_var($userEmail, FILTER_VALIDATE_EMAIL)) {
    $alert = 'Podaj poprawny email!'; //powinien byc arrayem
} else if (empty($subject)) {
    $alert = 'Wpisz jakiś temat!'; //powinien byc arrayem
} else if (empty($message)) {
    $alert = 'Pusta wiadomość? Napisz coś!'; //powinien byc arrayem
} else if ($recaptcha->success === false) {
    $alert = 'Potwierdź, że nie jesteś robotem!'; //powinien byc arrayem
} else {
    $transport = Swift_SmtpTransport::newInstance($config['mailServer'], $config['port'])
                                    ->setUsername($config['username'])
                                    ->setPassword($config['password']);

    $mailer = Swift_Mailer::newInstance($transport);

    $message = Swift_Message::newInstance($subject)
                            ->setFrom($userEmail)
                            ->setReplyTo($userEmail)
                            ->setTo($config['myEmail'])
                            ->setBody($message);//ze niby body, to nasz message instance? wywali error.. nadpisujesz zmienna

    $emailSent = $mailer->send($message);

    if ($emailSent) {
        $alert = 'Wysłano. Dzięki za wiadomość!';
    } else {
        $alert = 'Coś poszło nie tak.';
    }
}

$response = json_encode(array( //shortcode?
    'text' => $alert
));

exit($response);

?> <- niepotrzebne

Taki strukturalny kodzik. Nic specjalnego... prócz użycia swiftmailera : )

  • Ogólnie nie tworzysz własnych funkcji, co utrudnia późniejsze wykorzystanie kodu.
  • W konfiguracji użyłeś [], a w programie używasz array(). Bądź konsekwentny.
  • Masz tam błąd, który nie pozwala na normalne działanie programu. (Nadpisujesz message instancją)
  • Jeśli ktoś popełni wiele błędów w formularzu i tak zobaczy ten jeden.
  • Jest możliwość wysłania recaptchy bez jsa: http://stackoverflow.com/questions/18853007

Oto moja odpowiedź na twój kod: (robiona na kolanie w 30min)

https://gist.github.com/xandros15/3c17a9c5961cca901bbfea3c226eca3b

komentarz 31 marca 2017 przez Codeboy Stary wyjadacz (12,120 p.)

No strukturalny, bo na razie nie zagłębiałem się w backend (głównie z braku czasu). Nie miałem jeszcze styczności z Symfony, composer itd, a widzę, że z tego korzystasz. 

Alę dzięki za gotowe rozwiązanie, na pewno do tego wrócę. Wracając do mojego rozwiązania, to w tak prostym formularzu nie jest dopuszczalny taki strukturalny kod? Nie spełnia swojej roli?

  • Masz tam błąd, który nie pozwala na normalne działanie programu. (Nadpisujesz message instancją)

O jakim błędzie mówisz? Sprecyzujesz? Co to znaczy, że nie pozwala na normalne działanie programu? Maile się wysyłają i wszystko przebiega zgodnie z założeniami ;)

Jest możliwość wysłania recaptchy bez jsa

Czytałem o tym, ale jak podają na oficjalnej stronie, tylko z JS-em mamy największe bezpieczeństwo. Gdy JS jest wyłączony to też jest wyłączona część zabezpieczeń. A z invisibleRECAPTCHA w ogóle nie jest możliwe korzystanie w takim wypadku.

Tak szczerze, to w dzisiejszych czasach nadal wspiera się przeglądarki bez JS-a? ;)

komentarz 31 marca 2017 przez xandros Nałogowiec (29,450 p.)

 

> O jakim błędzie mówisz? 

  $message = Swift_Message::newInstance($subject)
                            ->setFrom($userEmail)
                            ->setReplyTo($userEmail)
                            ->setTo($config['myEmail'])
                            ->setBody($message);//ze niby body, to nasz message instance? wywali error.. nadpisujesz zmienna

 

 > Symfony, composer itd, a widzę, że z tego korzystasz.  

Nie ma tam ani jednej rzeczy z symfony.

Composer, a dokladniej zewnetrzne biblioteki, ułatwiaja nam znaczonco prace. Jakbym mial budować samemu te walidatory, to byś się pogubił w moim kodzie.

>  w tak prostym formularzu nie jest dopuszczalny taki strukturalny kod?

Zależy, co chcesz osiągnąć i ile masz na to czasu. Bo jeśli na to zagadnienie możesz poświęcić 30min. To robisz to najszybciej, jak się da. 

Dlaczego zamykanie w funkcjach jest takie ważne? 

  • Czytelność kodu
  • DRY
  • KISS
  • Możesz wyciągnąć funkcje, ktorę cię interesują i użyć w innym projekcie

Jak zapewne zauważyłeś (albo i nie), zrobiłem 2 wersje obsługi wysłania maila:

  1. Zapytanie RESTowe, po ajaxie.
  2. Zapytanie standardowe, z przetrzymywaniem stanu w sesji.

Zamiast sesji, mógłbym użyć formularza/kontenera, ale to już wyższa szkoła jazdy. (sprawdzenie, czy request był postem, czy getem etc.)

> Tak szczerze, to w dzisiejszych czasach nadal wspiera się przeglądarki bez JS-a? ;)

Chyba mój kindle nie obsluguje JSa.

komentarz 31 marca 2017 przez Codeboy Stary wyjadacz (12,120 p.)

Whoa, z tym $message to rzeczywiście się pospieszyłem, aż dziwne że to normalnie działało :O

"symfony/validator": "Use Symfony validator through Respect\\Validation",

Nie korzystasz z walidatora Symfony? Tak wywnioskowałem z tej linijki.

Chyba mój kindle nie obsluguje JSa.

Mój (Paperwhite 3) obsługuje, ale to i tak jest wersja eksperymentalna przeglądarki.

Przysiądę do tego PHP, ale raczej nie będzie to 30 min tak jak mówisz. W 30 min to zrobiłeś to Ty, a nie kompletnie raczkująca osoba ;)

Dzięki jeszcze raz ;)

komentarz 31 marca 2017 przez xandros Nałogowiec (29,450 p.)

> Nie korzystasz z walidatora Symfony?

Nie, użyłem respecta, którego używa symfony we własnym walidatorze.

> Tak wywnioskowałem z tej linijki.

  1. To jest plik wygenerowany automatycznie, by instalacja przebiegła łatwiej
  2. ta paczka jest w `"require-dev"` więc nie jest instalowana normalnie
  3. to tylko komponent/moduł symfony, a nie cały framework.

> aż dziwne że to normalnie działało :O

Bo zadziała, ale jest to bardzo mylące. :P

Zanim nadpiszesz zmienna, jest ona przekazywana do funkcji/metody i tam przerabiana. Po wykonaniu kodu jest nadpisywana.

komentarz 31 marca 2017 przez Codeboy Stary wyjadacz (12,120 p.)
rzeczywiście ;)
0 głosów
odpowiedź 1 kwietnia 2017 przez Codeboy Stary wyjadacz (12,120 p.)
Do reszty nikt się nie przyczepi? ;)

Podobne pytania

0 głosów
1 odpowiedź 243 wizyt
pytanie zadane 1 listopada 2018 w PHP przez marek90552 Początkujący (430 p.)
0 głosów
1 odpowiedź 172 wizyt
pytanie zadane 13 lutego 2019 w HTML i CSS przez Byczek_ Bywalec (2,570 p.)
0 głosów
0 odpowiedzi 1,280 wizyt
pytanie zadane 11 września 2016 w JavaScript przez skrzatjedyny Gaduła (3,150 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...