wtorek, 14 lutego 2012

Aktualizacja Yajs: php.js i Spinner

Wiele jest powodów do krytyki PHP jak np. nazewnictwo predefiniowanych funkcji, ale same ich istnienie jest jedną z największych zalet 6 języka na świecie. Dzięki nim osoby dla których nauka PHP jest pierwszym kontaktem z programowaniem, nie zniechęcają się tak łatwo. Projekt php.js ma za cel przeniesienie jak największej ilości funkcji z PHP do JavaScript, tak jak to niegdyś zrobił PHP z funkcjami C. Aktualna lista choć jest pełna braków to i tak imponuje.


Wśród aktualnie zaimplementowanych funkcji znajdziemy array_merge_recursive, get_defined_functions, czy md5, którymi możemy się cieszyć po pobraniu biblioteki  i dodaniu do nagłówka strony
<script src="php.default.min.js"></script>
Zaznaczę, że na stronie phpjs.org znajdują się różne gotowe paczki funkcji, a także narzędzie do przygotowania własnej.

Funkcje od teraz można przetestować także w Yajs. Przy okazji dodania tej w/w biblioteki do aplikacji zrobiłem kilka zmian, prześledźmy je.

Przestrzeń nazw i konwencje nazewnictwa

Żeby lepiej zorganizować kod zrobiłem dwie rzeczy: wprowadziłem swoją przestrzeń nazw Yats w formie obiektu do którego przypisuję kolejne zmienne i funkcje, oraz rozszerzyłem konwencję nazewnictwa o quasi stałe (duże litery), oraz pusty jQuery.


Kolejka zdarzeń

Wspomniany pusty obiekt wykorzystuję przy kolejce zdarzeń z jQuery: .queue() i .dequeue(). Dzięki niej nie muszę dodawać do moich funkcji callback.


Spinner

Do zasygnalizowania pracy skryptu użyłem Spinner/spin.js, który służy tylko do tworzenia progress bar, ale z wieloma opcjami.


Obsługa błędów

Obsługa błędów to obowiązek przy poważnej aplikacji, a poza tym chciałem, żeby obsługiwała je konsola.


Ładowanie bibliotek

W elemencie odpowiadającym za ładowanie bibliotek, ciekawy chyba tylko jest element odpowiadająca za wprost przeciwną funkcję, wyładowywanie funkcji. Problem tkwi w tym, że raz załadowany skrypt (w tym przypadku z pomocą getScript) nie może zostać od tak wyłączony ze skryptu. Żeby uzyskać taki efekt trzeba usunąć wszystkie funkcje i zmienne.


Time i String pad

Tak rozległa definicja czasu to nie błąd. Teoretycznie mógłbym użyć toLocaleTimeString, ale tak jak sama nazwa mówi nie uzyskałbym u wszytkich użytkowników jednolitego efektu. Poza tym brak w tej metodzie milisekund. Naprawiając niedociągnięcia użytych metod to wyświetlenia godzin etc. zdefiniowałem funkcję zbliżoną do PHP-owego str_pad.