Leniwce.com | blog technologiczny
PHP/JQuery – zakładki (taby) w kilku liniach kodu.
Bartosz Lewandowski, 2009-08-17 13:26:04

JQuery tabs w PHPRealizując niedawno projekt musiałem się zmierzyć z problemem zakładek. Postanowiłem, że nie będę tym razem pisać wszystkich Java Scriptów od postaw, lecz wykorzystałem bibliotekę JQuery. Dodatkowo, tworząc kod chcę, by był on łatwy do wykorzystania w innych projektach. Serwis wykonany był w PHP, postanowiłem więc połączyć możliwości JQuery z PHP.
W efekcie końcowym udało mi się utworzyć klasę, która w kilku linijkach (już cztery komendy) pozwala na utworzenie ciekawego efektu zakładek. 
Na potrzeby realizacji serwisu zaimplementowałem klasę Tabs. Jednak przed jej wykorzystaniem należy zdefiniować odpowiednie style CSS, o czym będzie później.
Kolejnym krokiem jest utworzenie nowego obiektu klasy Tabs, do którego można dodować zakładki metodą addTab() oraz narysować zestaw zakładek na ekranie metodą show().

Całość kodu PHP wygląda tak:

$tabs = new Tabs("test");
$tabs->addTab("Tab 1","Content 1");
$tabs->addTab("Tab 2","Content 2");
$tabs->addTab("Tab 3","Content 3");
$tabs->show();

Konstruktor oczekuje nazwy, która będzie identyfikować nasz zestaw utworzonych zakładek. Nazwa jest konieczna, gdy chcemy umieścić kilka niezależnych zakładek na stronie. W przypadku jednego zestawu zakładek możemy ją pominąć. Istotne jest, by nazwa była unikatowa.
Metoda addTab() oczekuje dwóch argumentów, pierwszy to tytuł zakładki, drugi natomiast to treść.
Efekt działania tego krótkiego kodu obrazuje poniższy obrazek:

Jquery tabs

 

Jak działają zakładki można zobaczyć pod adresem:
http://www.leniwce.com/examples/jquery-tabs/
W przykładzie umieściłem dwa zestawy zakładek.

 

Jak to jest zrobione

Jak wspomniałem na wstępie, najpierw musimy zdefiniować odpowiednie style. Mój arkusz styli opisuje następujące elementy:
div.tabHeaders – jest kontenerem zakładek,
div.tabInactive – nieaktywna zakładka,
div.tabActive – aktywna zakładka,
div.tabPages - kontener treści dla poszczególnych zakładek.
Zmiana wyglądu poszczególnych elementów zakładek ogranicza się do modyfikacji arkusza styli.

Hierarchicznie, elementy wygenerowane przez kod PHP prezentują się w sposób następujący:

Tabs - document objects model

Zadaniem skryptu jest prezentowanie tylko jednej treści (odpowiedni tabContent), powiązanej z aktywną zakładką. Reszta warstw (w node tabPages) jest wyłączana. I za to odpowiedzialny jest kod Javascriptowy, który wykorzystuje bibliotekę JQuery.
Gdy utworzymy zakładki, podając w konstruktorze nazwę test, klasa PHP w metodzie show() wygeneruje następujący kod (opis kodu w komentarzach):

//kod: JavaScript/JQuery
//funkcja uruchomi się w momencie załadowania
$(document).ready(function() 
{
  //ukrywam wszystkie div znalezione w elemencie test_pages
  $("#test_pages").find("div").hide();
  //aktywuje pierwszą zakładkę
  $("#test_tab1").addClass("tabActive");
  $("#test_tab1Content").show(); 
  //zdarzenie onClick dla selektorow (to naglowki zakładek)
  $("#test_tab1,#test_tab2,#test_tab3").click(function()
  {//szukam kliknietej zakladki (diva)
    var oldTab = "#"+$("#test_tabHeaders").children(".tabActive").attr("id");
   //usuwam z zakladki clase reprezentujaca aktywna zakladke
    $(oldTab).removeClass("tabActive");
   //oznaczam klikniety div jako aktywny
    $(this).addClass("tabActive");
    var newTab ="#"+$(this).attr("id")+"Content"; 
   //ukrywam tresc  zakladki
    $(oldTab+"Content").hide();
    //i pokazuje aktualna tresc
    $(newTab).fadeIn();
  });
});
 


Jak widać, sam kod JavaScriptowy nie jest rozbudowany. JQuery znacznie przyśpiesza tworzenie rozwiązań bazujących na JavaScripcie. Dodatkowo, dzięki PHP serwis WWW sam generuje odpowiedni kod JavaScript i umieszcza go w przeglądarce. Samej klasy Tabs omawiać specjalnie nie będę, najlepiej pobrać (23KB) klasę Tabs wraz z działającym przykładem.

Powiązane artykuły
Generowanie kodów CAPTCHA w PHP (2009-10-31)


Komentarze


Kriss [2009-08-30 21:54:58]
hej, wykorzystałem zakładki tylko szkoda, że aktywna jest klikalna. Można to zmieni?
Tubehome [2010-09-17 13:21:39]
Thanks, I am sure now the things will become much more easier
Royalowy [2010-09-18 11:01:40]
Działa idealnie :P wielkie dzięki. Idealne rozwiązanie do mojego skryptu.
Arkaster [2011-02-25 21:11:38]
A co zrobić w przypadku umieszczenia w treści innych div'ów? Bo skrypt ustawia je jako niewidoczne mimo, iż są w aktywnej karcie.
locksmith plano texas [2011-06-20 07:29:35]
Done well. I am satisfied with the quality of the data supplied. I expect that you continue with the outstanding job accomplished.
<a href="http://brett4golden.terapad.com">locksmith plano texas</a>
mastad [2011-06-28 17:41:13]
respect za wykonaną pracę - ale mam ten sam problem. Czy jest możliwość ustawienia aktywnego Taba?
mastad [2011-06-28 17:50:15]
Hej. jest proste - wystarczy pomyśleć
Zmiany Tab.php
1. public function show($active_tab)
linia 30
2. echo "$(\"#".$this->name."_tab".$active_tab."\").addClass(\"tabActive\");";
linia 42
3. echo "$(\"#".$this->name."_tab".$active_tab."Content\").show(); ";
linia 43

Więcej chyba nie da się powiedzieć - jak na patelni. Pozdrawiam
mastad [2011-06-28 18:14:12]
Aha zapomiałem ale nie przetestowałem do końca
4. if (empty($active_tab)|| $active_tab == 0)
$active_tab = 1;
Linia 33

na wypadek nie przekazania parametru do funkcji
Bartek [2011-07-12 19:11:24]
Dzięki za info. Ciesze się, że sie przydalo :)

Dodaj komentarz:
Autor:*

WWW:

Treść:*

Wprowadź kod zabezpieczający*:


        * - pola wymagane
Kategorie
C# (13)
Inne (6)
Java (3)
Matlab (1)
OpenGL (1)
PHP (2)


Najnowsze wpisy

Ostatnie komentarze