Skip to content


Niedoskonałość sfValidatorEmail

Ostatnio klient zgłosił, że w jego stronie, w momencie wysyłania newsletter’a pojawia się błąd i wiadomości nie dochodzą do klientów. Okazało się, że formularz, który używał do walidacji klasę sfValidatorEmail przepuszczał adresy w postaci konto.@host.com. Uwaga dla niedowidzących -> kropka jest przed znakiem małpy. Do wysyłania maili był zaprzęgnięty sfMailer, który notabene dziedziczy po Swift_Mailer, który z kolei sprawdza “po swojemu” i (podobno) zgodnie z jakimś RFC co powodowało zrzucanie wyjątku Swift_RfcComplianceException (wg. RFC 2822 taki adres nie powinien mieć miejsca). Trochę mnie to zirytowało, ponieważ ślepo zaufałem REGEXP’owi w ww. walidatorze.

Nauczony doświadczeniem zacząłem sprawdzać, jakby tu wykorzystać wyrażenia ze Swift_Mailer’a do własnej walidacji ale niestety po przebrnięciu stwierdziłem, że jest sporo obiektów do tworzenia gdybym chciał tylko sprawdzić adres więc napisałem walidator, który tworzy nową wiadomość i przechwytuje ww. wyjątek. Udostępniam dla potomnych i czekam na niepochlebne komentarze :))) Dla ułatwienia, dziedziczy on po sfValidatorEmail więc nie musimy używać obu.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
/**
 * Walidator do adresów email korzystający z biblioteki Swift
 * do sprawdzania czy adres email jest zgodny z odpowiednim RFC
 *
 * @author Arkadiusz Malinski
 *
 * @uses Swift_Message
 */

class fnValidatorSwiftEmail extends sfValidatorEmail
{

    /**
     * Konfiguracja walidatora. Dodany komunikat błedów "invalid_rfc" który
     * otrzymywany jest z walidatora w momencie gdy  
     *
     * @param array $options   An array of options
     * @param array $messages  An array of error messages
     *
     * @see sfValidatorEmail
     */

    protected function configure($options = array(), $messages = array())
    {
        parent::configure($options, $messages);
       
        $this->addMessage('invalid_rfc', '"%value%" is not valid email (RFC 2822, 3.6.2).');
    }
   
   
    /**
     * Sprawdzanie podanej wartości na podstawie tworzonej
     * nowej wiadomości Swift_Message
     *
     * @see sfValidatorEmail
     */

    protected function doClean($value)
    {
        $value = parent::doClean($value);
       
        try
        {
            $msg = new Swift_Message();
            $msg->addTo($value);
        }
        catch (Swift_RfcComplianceException $exception)
        {
            throw new sfValidatorError($this, 'invalid_rfc', array('value' => $value));
        }
       
        unset($msg);
        return $value;
    }
   
}
?>

Posted in Programowanie.

Tagged with , , , .


Zend Framework okiem zatwardziałego symfoniarza…

Nawet papier toaletowy wie, że żeby żyć trzeba się rozwijać, podjąłem trudną decyzję o zapoznaniu się ze swoim największym wrogiem – frameworkiem od Zend’a. Oczywiście nie jest to “tutorial jak napisać pierwszą aplikację z wykorzystaniem ZendFramework” a jedynie moje własne subiektywne odczucie po kilku krótkich chwilach obcowania z tym dziwnym (na pierwszy rzut oka) tworem. Tak więc pozwólcie, że wielu części kodu nie będę przytaczał bo nie ma po co. Ci co znają Zend’a będą wiedzieć o czym piszę, a Ci co nie znają to niech się sami pomęczą :).

Jak to było w przypadku symfony, również dopiero trzecie podejście okazało się podejściem w którym coś nie coś udało mi się zdziałać. Tak więc pełen szczerych chęci ściągnąłem ze strony Zend’a najnowszą wersję FW, wrzuciłem na serwer, ustawilem vhosta i stworzyłem pierwszy projekt w oparciu o tutorial z firmowego manuala. Wpisuje adres w przegladarce i co ? i strona z tekstem typu “super że chciałeś użyć naszego FW, zapraszamy do manuala i na stronę, blablabla…”. Pomyślałem sobie – nie taki diabeł straszny. Ustawiłem projekt w eclipsie, dolinkowałem biblioteki zenda no i pierwszy krok miałem za sobą. Pełen dumy stwierdziłem, że strona typu “Hello world” nie jest chyba dość opiniotwórcza, żeby wyrobić sobie własne zdanie na temat FW. Tak więc przyjąłem sobie pewne założenia do spełnienia….
Continued…

Posted in Programowanie.

Tagged with .


Walidator do numerów kont IBAN

Zawsze przy pisaniu formularzy korzystamy z walidatorów, które sprawdzają nasze dane wejściowe. Ostatnio potrzebny mi był walidator do numerów kont bankowych klientów rejestrujących się w moim serwisie. Regułę do sprawdzania poprawności konta możemy znaleźć tutaj a poniżej podaję kod walidatora do używania w projektach stworzonych przy użyciu symfony. Oczywiście testowałem to na wersji 1.4.6 ale nie przeczę że na starszych może również działać :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
/**
 * Walidator do Symfony 1.4.x sprawdzający poprawność numeru konta.
 *
 * @author Arkadiusz Maliński <amalinski@gmail.com>
 */

class sfValidatorIban extends sfValidatorRegex
{

    /**
     * Konfiguracja walidatora. Opcje konfiguracyjne:
     *  - country_code - kod kraju wg. ISO 13616, domyślnie PL (2521)
     *  
     * Kody błedów:
     *  - invalid_iban - numer konta niepoprawny
     *  - invalid_iban_length - długość podanego konta niepoprawna
     *  
     *  @see http://pl.wikipedia.org/wiki/International_Bank_Account_Number
     */

    protected function configure($options = array(), $messages = array())
    {
        parent::configure($options, $messages);
       
        $this->addMessage('invalid_iban', '"%value%" is invalid IBAN account number.');
        $this->addMessage('invalid_iban_length', '"%value%" has incorrect length.');
       
        //setting county code - default is '2521' - poland
        $this->addOption('country_code', '2521');
       
        // setting regexp to only numbers and spaces
        $this->setOption('pattern', '/^[0-9 ]*$/');
    }


    /**
     * Sprawdzanie poprawności numer konta
     *
     * @see sfValidatorString
     */

    protected function doClean($value)
    {
        $clean = parent::doClean($value);

        $iban = str_replace(' ', '', $value);
        if(strlen($iban) != 26)
        {
            throw new sfValidatorError($this, 'invalid_iban_length', array('value' => $value));
        }
       
        $weights = array(1, 10, 3, 30, 9, 90, 27, 76, 81, 34, 49, 5, 50, 15, 53, 45, 62, 38, 89, 17, 73, 51, 25, 56, 75, 71, 31, 19, 93, 57);

        $iban = $iban.$this->getOption('country_code');
        $iban = substr($iban, 2).substr($iban, 0, 2);

        $sum = 0;

        for($i = 0; $i < 30; $i++)
        {
            $sum += $iban[29-$i] * $weights[$i];
        }

        if ($sum % 97 != 1)
        {
            throw new sfValidatorError($this, 'invalid_iban', array('value' => $value));
        }

        return $clean;
    }
}
?>

Posted in Programowanie.

Tagged with , , , , .


Widget i parser do BBCode w symfony – aktualizacja

Niestety jak to zwykle bywa, pierwsze koty za płoty i w widgecie do BBCode opisanym wcześniej wkradł się bład. Niestety użycie właściwości DOM selectionStart i selectionEnd powoduje nie działanie skryptu pod naszym kochanym IE :(. Ale sprawę załatwia plugin do jQuery o wdzięcznej nazwie fieldselection. Tak więc zmodyfikowałem funkcję JS wstawiającą kod do textarea z:

1
2
3
4
5
var Insertion = {
    strStart:   Content.substr(0, TA_DOM.selectionStart),
    strReplace: Content.substr(TA_DOM.selectionStart, (TA_DOM.selectionEnd - TA_DOM.selectionStart)),
    strEnd:     Content.substr(TA_DOM.selectionEnd)
};

na poniższą:

1
2
3
4
5
6
7
var range = TA.getSelection();
                   
var Insertion = {
    strStart:   Content.substr(0, range.start),
    strReplace: Content.substr(range.start, range.length),
    strEnd:     Content.substr(range.end)
};

Oraz dodałem opcję do widgetu – ‘FieldSelectionPathJs’, dzięki której możemy określić położenie naszego pluginu.
Continued…

Posted in Programowanie.

Tagged with , , , .


Symfony, walidacja obrazków i PHP 5.3.2

Jak to zwykle bywa po aktualizacji oprogramowania (w tym przypadku PHP 5.3.2 poszło na warsztat) coś zaczyna źle działać. Ale do rzeczy.

Opis problemu:
Mam projekt klienta w którym jest panel administracyjny do dodawania i zarządzania zdjęciami do ofert, które klient sobie dodaje. No i dzisiaj jak gdyby nic dodaję nową ofertę. Przechodzę do dodawania zdjęć a tam komunikat: “Plik nie może być dodany. Akceptowalne formaty to PNG, JPG i GIF”. Hmmm… nic dziwnego. Sam narzuciłem taki wymóg. No ale wydaje mi się że mój własny system stara się zrobić ze mnie debila. Ale co tam. Sprawdziłem najpierw czy poprawnie zrobiłem obrazek. Sprawdziłem też jaki typ zwraca funkcja getimagesize(). No i zdębiałem. Typ poprawny “image/jpeg” a walidacja nie działa. Jako że do walidacji obrazka mam własny walidator, który dziedziczy po sfValidatorFile to po kolei sprawdzałem co może być problemem i oto…. voilla !!

Rozwiązanie !
Problem stwarza funkcja finfo_open dodana w PHP 5.3.0. Zwraca ona typ “image/jpeg; content=binary” no i dlatego nie działa. Na chwilę obecną rozwiązaniem jest nadpisanie opcji “mime_type_guessers” w walidatorze tak żeby nie używał opcji “guessFromFileinfo” i gra muzyka. Mam nadzieje że komuś się to przyda bo chwilę można spędzić nad problemem :)

Posted in Programowanie.

Tagged with , , .