Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM

Autor wpisu: batman, dodany: 04.02.2011 08:00, tagi: javascript, jquery

Przed kilkoma miesiącami na oficjalnym blogu jQuery pojawiła się informacja na temat powstania trzech nowych pluginów, które zostały zaakceptowane jako oficjalne rozszerzenia jQuery. Były to jQuery Templates, jQuery Data Link oraz jQuery Globalization. Według podanej wówczas informacji jQuery Templates miał trafić do głównej biblioteki jQuery wraz z pojawieniem się wersji 1.5. Najwyraźniej ekipa pracująca nad tym pluginiem nie zdążyła na czas i w wydanej kilka dni temu bibliotece, nie uraczymy szablonów. Nic nie stoi jednak na przeszkodzie, aby pobrać ten plugin osobno i już dzisiaj zacząć poznawanie jego możliwości.

Instalacja

Instalacja plginu jest tak samo banalna jak instalacja samego jQuery i sprowadza się do pobrania jego najnowszej wersji ze strony https://github.com/jquery/jquery-tmpl. Następnie wystarczy dołączyć plugin do strony.

Pierwszy szablon

Zanim zaczniemy zagłębiać się w szczegóły szablonów, rzućcie okiem na poniższy kod.

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<script src="jquery-1.5.min.js"></script>
		<script src="jquery.tmpl.min.js"></script>
		<script id="szablon" type="text/x-jquery-tmpl">
			<tr>
				<td>${nazwa}</td>
				<td>${cena}zł</td>
				<td><a href="/usun?id=${id}">usuń</a></td>
			</tr>
		</script>
		<script>
		$(document).ready(function() {
			var produkty = [
				{ id: 1, nazwa: "Spodnie", 	cena: "100" },
				{ id: 2, nazwa: "Buty", 	cena: "250" },
				{ id: 3, nazwa: "Okulary", 	cena: "90" },
				{ id: 4, nazwa: "Worek", 	cena: "1" }
			];

			$("#szablon").tmpl(produkty).appendTo("#produkty tbody");
		});
		</script>
	</head>
	<body>
		<table id="produkty">
			<thead>
				<tr>
					<th>Nazwa</th>
					<th>Cena</th>
					<th>Akcja</th>
				</tr>
			</thead>
			<tbody>
			</tbody>
		</table>
	</body>
</html>

To co widzicie to najprostszy przykład zastosowania szablonów jQuery. Wszystko sprowadza się do stworzenia szablonu HTML w znaczniku script, któremu nadajemy identyfikator (w tym przypadku identyfikatorem jest słowo szablon). Oprócz identyfikatora znacznik ten musi posiadać odpowiedni typ. Jest nim text/x-jquery-tmpl. W przypadku problemów z przeglądarkami, które nie będą poprawnie interpretować tego atrybutu można stosować text/html.

Tagi szablonów oraz nowe metody

W chwili obecnej do jQuery wprowadzone zostały następujące tagi.

  • ${} lub ${{= }} – służy do wstawiania do szablonu danych tekstowych
  • {{html }} – służy do wstawienia danych w postaci html
  • {{if}}, {{else}}, {{/if}} – podstawowa instrukcja warunkowa
  • {{each}} – pętla
  • {{tmpl}} – renderowanie szablonu w szablonie
  • {{wrap}} – możliwość opakowania jednego szablonu innym

Oprócz tagów, do jQuery wprowadzone zostały nowe funkcje. Są to:

  • .tmpl() – metoda wywoływana na szablonie. Przyjmuje dwa parametry – dane oraz opcje. Dane mogą zostać przekazane na dwa sposoby. W pierwszym z nich będzie to obiekt, którego klucze będą stanowić zmienne dostępne w szablonie. W drugim sposobie można przekazać tablicę obiektów. Wówczas szablon zostanie wyrenderowany tyle razy, ile elementów będzie miała tablica. Opcje służą do przekazania do szablonu dodatkowych danych. W wyniku działania tej metody uzyskamy kolekcję elementów, które możemy wstawić do drzewa DOM przy pomocy metod .appendTo, .prependTo, .insertBefore oraz .insertAfter.
  • jQuery.tmpl() – działa na podobnej zasadzie jak poprzednia metoda, z tą różnicą, że pierwszym argumentem jest treść szablonu, drugim dane, a trzecim opcje.
  • .tmplItem() oraz jQuery.tmplItem() – metody, dzięki którym uzyskamy dostęp do danych wyrenderowanego elementu na podstawie szablonu oraz wszystkich informacji powiązanych z tym elementem
  • .template() oraz jQuery.template() – metody te umożliwiają na “skompilowanie” szablonu do postaci nazwanego szablonu (named template), do którego możemy się odwoływać po jego nazwie.

Ponieważ w teorii wszystko zawsze wydaje się być bardziej skomplikowane niż to jest w rzeczywistości, przejdźmy do przykładów.

${}

W miejsce tego taga wstawiona zostanie zawartość przypisana pod klucz obiektu przekazanego jako dane do szablonu.

<script id="szablon" type="text/x-jquery-tmpl">
	<p>${pole}</p>
</script>
<script>
$(document).ready(function() {
	$("#szablon").tmpl({ pole: "zawartosc"}).appendTo("#element");
});
</script>
<div id="element"></div>

Zamiast ${pole} możemy napisać {{= pole}} i efekt będzie identyczny.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: nospor, dodany: 03.02.2011 20:37, tagi: mysql

Na wielu forach i grupach widzę, iż często w kodzie zapytań tabel jest INT(11). Zdaję sobie sprawę, iż czasami jest to spowodowane skopiowaniem zapytania z jakiegoś programu, który automatycznie nam z jakiegoś powodu coś takiego dodaje. Częściej jednak jest to stosowane przez programistów z premedytacją wynikającą poprostu z niewiedzy. Postaram się tutaj tę sprawę wyjaśnić.

Autor wpisu: cojack, dodany: 03.02.2011 12:06, tagi: javascript

PHP Już od dawna nurtował mnie mankament parsowania szablonów w php, trudności z jakimi człowiek się spotykał to niepotrzebne zużycie pamięci do przetworzenie danych w php, działanie na stringach itd. Fascynowała mnie sprawa by tym zajmowała się tylko przeglądarka, niech komputer użytkownika męczy się z wygenerowaniem szablonu. Tylko jak to zrobić? Długo nic nie mogłem na to wymyślić, ale zrobili to za mnie. ExtJS – jest to framework napisany w JavaScript będący częścią innych projektów firmy Sencha. Daje on nam wiele możliwości, począwszy od ingerencji w drzewo DOM, skończywszy na generowaniu UI naszej aplikacji.

Dlaczego nie lubię szablonów w PHP?

Bo są zbędne, nasze aplikacje mogą być o wiele szybsze, jeżeli będą przetwarzały tylko dane jakie do nich przesyłamy, a nie zajmowały się przetwarzaniem tony bajtów stringów który musi przechowywać odpowiednią długość czasu a później wypluć w eter. Przechowywanie stringów, operacje na nich są nie wydajne. Jeżeli tylko mogę to unikam takich sytuacji. Widać że mogę, bo dzięki ExtJS w PHP nie muszę parsować skomplikowanych templatek, obracać pętle w szablonach by wy-renderować tabele, menu, listę.

Podejście alternatywne do szablonów

Jest ogrom systemów szablonów które się ścigają w czasie, który szybciej się skompiluje, sparsuje itd. Jakby nie można było najprościej w świecie wklepać php z html w jakiejś templatce. Znajdź mi coś szybszego. Nie ważne, kolejnym krokiem -> xlst też ciekawe, dzięki tej technologii część mechanizmu jest po stronie serwera, a reszta po stronie przeglądarki, dane przechowujemy w XML, szablony w XSL, i dzieje się jakaś magia. Mimo wszystko to dalej nie jest rozwiązanie o które mi chodziło. Pomyślcie sobie o tej kwestii jak aplikacji server desktop. Serwerze przetwarza tylko dane, i zwraca je do aplikacji desktop-owej która je musi przetworzyć w widok. No i o to chodzi. Jak najmniej operacji na serwerze, żeby czas oczekiwania na odpowiedź był jak najkrótszy a informowanie użytkownika o postępie zadania na bieżąco jest najlepszym rozwiązaniem. Najbardziej co wkurza ludzi podczas pracy z oprogramowaniem jest brak informacji co się w danej chwili dzieje. Tzn użytkownik klika w link, leci zapytanie ajax, nie widzi tego, to klika raz jeszcze no bo skąd ma wiedzieć że coś się wydarzyło. Mamy techniczną możliwość informowania użytkownika co w danej chwili aplikacja wykonuje:

* Zapytanie zostało wysłane do serwera * Serwer przetwarza dane * Serwer odpowiedział * Przetwarzanie danych od serwera * I Na końcu wyświetlenie tych danych

4 proste kroki, bo piąty jest już widoczny, pozwoli użytkownikowi nie popadać w frustrację i będzie zadowolony z działania aplikacji.

Utworzenie takiego interfejsu w HTML który jest nie dynamiczny, dostęp do niego mamy tylko z poziomu DOM, bez żadnych obiektów do elementów, byłby mało wygodny. Za to wy-renderujmy sobie HTML za pomocą JS, co to zmienia? Bardzo wiele, chociażby dostęp do komponentu wygenerowanego jest z miejsca, każdy element listy, tabelki jest obiektem. Dodatkowo to moc przeliczeniowa komputera użytkownika a nie maszyny się liczy, także jak chce narzekać, proszę bardzo ale na swoją maszynę a nie na naszą aplikację ;)

ExtJS nowa perspektywa

Produkt firmy Sencha jest pewnym rozwiązaniem moich problemów. Dlaczego pewnym? Ponieważ nie odważyłbym się zastosować go w frontendzie ;) Otóż stosuje go tylko w backendzie. Dlaczego? Jakoś nie mam do niego jeszcze pełnego zaufania, poza tym styl-owanie tych wszystkich elementów jest trochę jak syzyfowa praca. Idzie jak krew z nosa. Inaczej, nie mam do tego siły. Ujednolicony sposób wyświetlania danych, komentarzy, błędów, interakcji na polecenia użytkownika, jest przyjemny dla oka inie zmusza użytkownika do ciągłego poznawania nowych rzeczy, tylko podświadomie będzie wiedział jak aplikacja się zachowa. Bez przeładowania, użytkownika nie męczymy ciągłym oczekiwaniem na przetworzenie kolejnych stosów bitów i wyświetlenie aplikacji całej od nowa po każdym requescie, w której została wykonana jakaś prosta akcja. Wszystko jest zaimplementowane po stronie przeglądarki w kodzie JavaScript.

Słów kilka na zakończenie

Niniejszy wpis, będzie rozpoczęciem cyklu wpisów o implementacji i mechanizmach ExtJS, z tym że dopiero od wydania ver. 4.0, która ma się ukazać końcem lutego. Perspektywa może być ciekawa, nie dla każdego może być użyteczna, gdyż logikę trzeba pisać niejako w dwóch miejscach. Ja sam używam, korzystam nałogowo w swoim FW, jestem zadowolony i działa dla mnie wyśmienicie, co prawda z początku miałem problemy z implementacją i strukturą oraz logiką ExtJS, ale przy pomocy googla udało się wszystko ładnie opanować.

Autor wpisu: matipl, dodany: 03.02.2011 10:05, tagi: php, framework, symfony

Zend FrameworkPrzed majem 2010 roku w świecie PHP poruszałem się głównie z pomocą Zend Frameworka. Kilka lat wcześniej był to autorski framework (netEngine) oraz firmowe frameworki. Z perspektywy czasu uważam, że złe było rozwijanie własnych narzędzi, zamiast pomóc społeczności. Taki zbiorowy projekt jest świetny:

  • bardzo szybko rozwijany
  • zawsze znajdziesz osobę, która zna framework (a Twój lub firmowy?)
  • spora baza tutoriali w Sieci
  • popularny = groźny (wykryta dziura w Australii może spowodować ciężki tydzień w Twojej firmie)

Od maja pracuję głównie z wykorzystaniem Symfony (1.4). Z mojego punktu widzenia przedstawia on odmienne podejście do sprawy. W Symfony da się sporo rzeczy ustawić z góry, dobry cmd line, a mnóstwo mamy out of box. Ale rozwijanie Symfony o własne dodatki czy helpery nie jest przyjemnością. Symfony odbieram jak takiego WordPressa – sprawdza się, ale jego kod pozostawia wiele do życzenia (przeplatanie języka proceduralnego z obiektowym).

Najgorszy minus Symfony 1.4 ? Mimo, że jest długo na rynku i jest najnowszą stabilną wersją Sieć prawie o nim milczy poza oficjalną dokumentacją. Jeśli przyjdzie zmierzyć się Tobie z nietrywalnym problemem lepiej od razu przejrzeć kod źródłowy frameworka niż szukać w Google.

Od grudnia znów pracuję z Zend Framework, przy okazji projektu bilancio. Wrażenia ogólne – bosko, w końcu czuję się jak w domu. Mam tyle obiektów ile dusza zapragnie. A Google bardzo jest pomocne. Najgorszy był początek przy powrocie z Symfony.

Nadal nie widzę dobrze opisanego application.ini w Sieci, a można obecnie przez niego pozbyć się nadpisywania większości zasobów (ach czasy ZF < 1.0). Dodatkowo wydaje mi się, że formularze w Symfony „szybciej mi szły”. Chociaż irytujące jest, że w większości wypadków wypluwał inputy, zamiast pełnego tagu form (łatwiej obudować w ZF jak się potrafi). No i te magiczne url_for() w Symfony (w zależności od parametru wywołuje rózne inne funkcje).

Po pierwszym tygodniu pracy z Zend Framework nie chcę się z nim znów rozstawać, Symfony to naprawdę nieprzyjemne środowisko. A przy okazji projektów ZF może w końcu zacznę dzielić się jakimiś drobnostkami z Wami. Zobaczymy czy czas pozwoli (jak widać po blogu tutejszym ostatnio mi go brak).

PS: Przed wczoraj został opublikowany Zend Framework w wersji 1.11.3 (30 załatanych dziur).

Autor wpisu: cojack, dodany: 02.02.2011 15:15, tagi: php

PHP Kiedyś już pisałem o Seo Url na blogu, co prawda temat stary jak świat, ale jakoś nigdy nie miałem koncepcji by to jakoś skrzętnie napisać. Otóż może tak trochę historii, ogólnie routing to wymyślili chłopacy od ruby on rails, napisali i tam im śmigało, następnie paru maniaków przepisało to do pythona, widać mieli w tym jakiś cel (dla mnie to masochizm pisać strony w pythonie ale co ich to ich). I nadszedł czas by ktoś przepisał koncept do PHP. Chwała im za to. A teraz ja ogarnięty szałem pisania swojego systemu, z nadszarpniętą przez kolegę Glossego dumą że pierdzę w stołek i nic nie robię postanowiłem wykorzystać dobrodziejstwo Open Sourcowych Licencji.

Routing wtf?

Czym jest routing? W sumie to wikipedia ma o tym swoje zdanie co prawda, ale moje jest takie: „Przepływem informacji”. O i na tym mógłbym zakończyć, ale że jakoś nie chce mi się jeszcze spać to sobie popiszę trochę. Jak dobrze wiemy, żeby nasza aplikacja napisana w jakże to niebanalnym języku którym jest PHP, wiedziała co robimy, co wywołać, co zepsuć. Musimy jej przesłać akcję, najczęściej po staremu byśmy to zrobili metodą łopatologiczną czyli: index.php?action=urwij. I w także oto cudowny sposób (prawie że magiczny), przesyłamy do naszej aplikacji GETa z danym kluczem i wartością, która po danej wartości z klucza wykona odpowiednią dla nas akcję. Ale czy to nie zubożałe? Takie prymitywne. W ten sposób to piszą strony gimnazjaliści za 50zł i zabierają nam chleb. Z tą różnicą że pewnie nawet nie wiedzą jak bardzo ich aplikacja jest crackerFriendly. Ale who care?

(… wdech … wydech… )

Czy nie ładniej by było gdyby nasza aplikacja miała jakiś bardziej zaawansowany system URL? Otóż oczywiście że ładniej, a np taki: www.domena.pl/:controller/:action ?

Horde Routes

Z pomocą przychodzi nam horde routes, horde to jest w ogóle zbiór przygotowanych do użycia regexpów którę sparsują nam naszego urla, zwrócą nam akcję i controllery. Także wszystko mamy gotowe. Nie działa to inaczej niż routing w Symfony. Też mamy statycznie routingi, nazwane, funkcje filtrujące, wildcard, grupowanie ścieżek, oraz warunkowe ścieżki (ciekawa sprawa swoją drogą).

Do dzieła!

Idziemy na stronę: http://dev.horde.org/routes/ pobieramy paczkę albo z pear’a instalujemy:

$ sudo pear channel-discover pear.horde.org
$ sudo pear install horde/routes

Wymagania co do php to 5.1 lub wyżej a najlepiej 5.2 lub wyżej. Dziwne, nie zagłębiałem się w kod, ani changeloga pomiędzy tymi ver nie sprawdzałem skąd taka rozbieżność.

No to pierwsze uruchomienie:

require_once 'Horde/Routes/Mapper.php';
require_once 'Horde/Routes/Exception.php';
require_once 'Horde/Routes/Route.php';
require_once 'Horde/Routes/Utils.php';
 
$mapper = new Horde_Routes_Mapper();
$mapper->connect(':controller/:action');

Poprzez metodę Horde_Routes_Mapper::connect() dodajemy nasze ścieżki które będziemy chcieli by mapper wyłapał który z adresów przesyłany do adresu url jest pasujący. A mało tego, przydałby się jakiś .htaccess, ja korzystam z tego z drupala, oczywiście przerobionego na moje potrzeby, ale w wcześniejszym link wpisie o routingu już podawałem jak może taki .htaccess wyglądąć.

Options +FollowSymLinks
DirectoryIndex index.php
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>

Amen.

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: Zyx, dodany: 02.02.2011 13:20, tagi: php

Świat idzie naprzód. Już od jakiegoś czasu PHP udostępnia przestrzenie nazw, a społeczność programistów wstąpiła na nowe poziomy abstrakcji, rozpoczynając prace nad nowymi wersjami znanych frameworków. Niedawno rozpocząłem reaktywację grupy Invenzzia i dzisiaj pragnę zaprezentować pierwszy namacalny efekt prac, czyli bibliotekę Open Power Autoloader. Jest to kolekcja wydajnych ładowarek klas dla PHP 5.3+ zgodnych z konwencją nazewnictwa PSR-0, które jednocześnie otwierają nową edycję Open Power Libs.

Autor wpisu: cojack, dodany: 01.02.2011 13:54, tagi: javascript

Programowanie w JavaScript w cale nie musi być nudne, trudne i wkurzające. Wystarczy się pilnować i nie popełniać prostych błędów. Bo te trudniejsze łatwiej wyłapać niż te banalne, których nie widać na pierwszy rzut oka. O czym będzie dzisiejszy wpis? O obiektach w JavaScript, a bardziej o literal notation, czyli definicji obiektów liniowo. Ciekawy sposób tworzenia obiektów w JS.

Na początku musimy sobie coś uświadomić: „W JavaScript nie ma klas”.

Jeżeli już to rozumiemy, możemy przejść do dalszej części czytania tego wpisu.

Scope – Zasięg

Wiele razy zastanawiamy się czym w danej chwili jest „this” w funkcji, jeżeli używamy jakiś callbacków i bindujemy pewną funkcję z obiektu w taki sposób:

$('#some_id').click(function(){
  console.log(this); // z użyciem firebuga
});

no to w zakresie funkcji this bedzie obiektem #some_id

Dobra teraz musimy sobie coś wyjaśniać podanie nazwy a wywołanie funkcji to dwie różne rzeczy!

Czyli:

 someCallback: someObject.someFunction(); // WYWOŁANIE!
 someCallback: someObject.someFunction; // zbindowanie

I teraz jeżeli napiszemy za pomocą pierwszego przykładu, to skrypt kiedy dojdzie do tej linijki wywoła ją, a nie przypisze, a w drugim wykona ją poprawnie dopiero przy wywołaniu callbacka. I czym jest this w takiej funkcji? Ciekawa sprawa, bo mimo wszystko iż ta funkcja jest metodą obiektu to

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.