wtorek, 19 maja 2015

[UPGRADE][Blogger] Robimy system kategorii cz.4 - finał

TRUE
4728963745578807098
To już ostatnia część poradnika do stworzenia systemu kategorii w Bloggerze. Mając już przygotowane wszystkie niezbędne funkcje dochodzimy zatem do ostatniej części tutoriala, w której złożymy wszystko w całość i uruchomimy. Wykorzystamy tutaj oczywiście bibliotekę jQuery i zdarzenia ready(). Na samym końcu wpisu znajdzie się również cały przeanalizowany do tej pory kod.

  1. var postLabels = ''; var inPost = false;

Na samym początku deklarujemy domyślnie 2 zmienne:

  • postlabels - do której pobierzemy etykiety wyświetlanego posta,
  • inPost - przyjmująca TRUE/FALSE w zależności od tego czy oglądamy całość posta, czy listę postów


I teraz malutki trick, który pozwoli na "powiedzenie" Jjavascriptowi, czy znajdujemy się w całości posta, czy na liście postów.
Za pomocą jQuery odwołujemy się do DIV-a o przypisanej klasie CSS inPost. DIV-a tego ukryłem w szablonie bloga w bloku, który odpowiada za wyświetlenie szablonu treści PEŁNEGO posta. Do DIV-a przypisany jest z CSS styl display: none, nie jest więc renderowany na stronie, a mimo to istnieje jako element drzewa DOM. Dodatkowo w DIV-ie zawarty jest ciąg znaków TRUE, czyli wygląda to tak:

  1. <div class='inPost'>TRUE</div>

Co za tym idzie - element ten znajdzie się w strukturze DOM jedynie w przypadku, gdy będziemy w widoku CAŁOŚCI posta, w innym przypadku takiego DIV-a w drzewie DOM zabraknie, a więc poniższy kod nigdy się nie wykona, gdyż zmienna inPostDiv nigdy nie przyjmie wartości TRUE.
Jeśli jednak znajdujemy się w poście, to wykonywane są następujące akcje:

zmienna inPost przyjmuje wartość TRUE - od tej pory w każdej części kodu będziemy już wiedzieć w jakim widoku znajdujemy się obecnie,
do zmiennej postLabels pobierane są etykiety jakimi otagowany jest post. Korzystamy tutaj z metody text(), zamiast z html(), gdyż interesuje nas sam tekst. Etykietki te później przeparsujemy i utwórzymy z nich tablicę.
do DIV-a z przypisaną klasą CSS ifClr dodawana jest kolejna klasa CSS - clr, która "ucieknie" z float:left przypisanego obrazkowi i poprzez clear:both wyświetli resztę posta pod obrazkiem. W widoku listy z tego zrezygnowałem, aby nie było zbyt dużo pustej przestrzeni na stronie. Oczywiście DIV-a tego zaszywamy w treści posta, tuż za <!-- more -->, czyli za dyrektywą, która informuje Bloggera, w ktorym miejscu kończy się skrócona wersja posta.

  1. $("div.inPost").ready(function() {
  2.  
  3.  
  4.  
  5.  var inPostDiv = $("div.inPost").text();
  6.  
  7.  
  8.  
  9.  if(inPostDiv == 'TRUE') {
  10.  
  11.   inPost = true;
  12.  
  13.   postId = $("div.inPostID").text();
  14.  
  15.   postLabels = $("span.post-labels").text();
  16.  
  17.   $('div.ifClr').addClass('clr');
  18.  
  19.  }
  20.  
  21. });

Czas na zabawę

Mając już wszystkie funkcje, pora na właściwą logikę działania.
Szczerze mówiąc, długo zastanawialem się jak poinformować javascript, w jakiej części widoku bloga aktualnie się znajdujemy. Mając do dyspozycji kod po stronie serwera, jak PHP sprawa byłaby banalnie prosta, lecz tutaj niestety, w przypadku Bloggera - dostępu takiego nie posiadamy i pozostaje nam jedynie Javascript działający po stronie przeglądarki. Sposobów wymyśliłem dokładnie 3, z czego wykorzystałem jeden, który tutaj opiszę.
Na początek pomyślmy - możemy znajdować się jednorazowo w którymś z poniższych statusów:


  • strona główna
  • lista postów oznaczonych daną etykietą/przedziałem czasowym
  • widok pojedyńczego posta
  • wynik wyszukiwania
  • strona

Do każdego z tych widoków prowadzi nieco inny URL i wyświetlane są nieco inne informacje, np. w DIV-ie o klasie CSS status-msg-body wyświetlana jest informacja o wyniku wyszukiwania z wyszukiwarki, lub informacja z jakiej kategorii/etykiety wyświetlamy listę postów. Postanowiłem wykorzystać ten fakt i na podstawie analizy tego DIV-a napisać kod, który odgadnie w jakim obecnie widoku znajduje się oglądający. Innym sposobem moze być analiza adresu URL w jakim się znajdujemy pobierana za pomocą Javascriptu. Ja wybrałem jednak sposób z DIV-em. Zobaczmy jak to zadziała. Na początek czekamy na załadowanie treści DIV-a, gdy będzie już ready() ruszamy do akcji:

Przyjrzyjmy się kodowi:

  1. $("div.status-msg-body").ready(function() {
  2.  
  3.  
  4.  
  5.  var mode = '';
  6.  
  7.  var msg_str = $("div.status-msg-body" ).text();
  8.  
  9.  var msg_html = $("div.status-msg-body" ).html();
  10.  
  11.  
  12.  
  13.  if(msg_str != '')
  14.  
  15.  {  
  16.  
  17.   if(mode == '' && strstr(msg_str, 'wyszukiwania'))
  18.  
  19.   {
  20.  
  21.    mode = 'search_null';  
  22.  
  23.  
  24.  
  25.   } else {
  26.  
  27.  
  28.  
  29.    if(mode == '' && strstr(msg_str, 'Brak postów'))
  30.  
  31.    {
  32.  
  33.     mode = 'empty';
  34.  
  35.     var exploded = msg_str.split('etykietą ');
  36.  
  37.     var label_name = exploded[1].split('. Pokaż');  
  38.  
  39.  
  40.  
  41.    } else {
  42.  
  43.  
  44.  
  45.     if(strstr(msg_str, 'etykietą'))
  46.  
  47.     {
  48.  
  49.      mode = 'label';
  50.  
  51.      var exploded = msg_str.split('etykietą ');
  52.  
  53.      var label_name = exploded[1].split('. Pokaż');  
  54.  
  55.     }
  56.  
  57.    }
  58.  
  59.   }
  60.  
  61.  
  62.  
  63.   if(mode == '' && strstr(msg_str, 'posortowane'))
  64.  
  65.   {
  66.  
  67.    mode = 'search';
  68.  
  69.   }
  70.  
  71.  
  72.  
  73.   switch(mode)
  74.  
  75.   {
  76.  
  77.  
  78.  
  79.    case 'label':
  80.  
  81.     var fullname = '';
  82.  
  83.     fullname = getHeader(label_name);  
  84.  
  85.     $("div.status-msg-body" ).html('<h1>' + fullname + '</h1>');  
  86.  
  87.    break;
  88.  
  89.  
  90.  
  91.    case 'search':
  92.  
  93.     $("div.status-msg-body" ).html('<h1>' + msg_html.replace('Sortuj', '</br>Sortuj') + '</h1>');
  94.  
  95.    break;
  96.  
  97.  
  98.  
  99.    case 'empty':
  100.  
  101.     var fullname = '';
  102.  
  103.     fullname = getHeader(label_name);
  104.  
  105.     $("div.status-msg-body" ).html('<h1>' + fullname + ' <br/>Chwilowo brak artykułów w tym dziale.</h1>');  
  106.  
  107.    break;
  108.  
  109.  
  110.  
  111.    case 'search_null':
  112.  
  113.     $("div.status-msg-body" ).html('<h1>' + msg_html.replace('Pokaż', '</br>Pokaż') + '</h1>');        
  114.  
  115.    break;
  116.  
  117.  
  118.  
  119.   }
  120.  
  121.  }
  122.  
  123. });


Przeanalizujmy go:

  1. $("div.status-msg-body").ready(function() {
  2.  
  3.  
  4.  
  5.  var mode = '';
  6.  
  7.  var msg_str = $("div.status-msg-body" ).text();
  8.  
  9.  var msg_html = $("div.status-msg-body" ).html();
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  /*
  16.  
  17.  Na początek definiujemy domyślne wartości zmiennych.
  18.  
  19.  Zmienna mode określać będzie rodzaj widoku, obecnie deklarujemy pustą zmienną.
  20.  
  21.  Do zmiennej msg_str pobieramy zawartość tekstową z DIV-a 'status-msg-body', a do zmiennej msg_html pełną zawartość, wraz z tagami HTML.
  22.  
  23.  Jeśli zawartość naszego DIV-a ze statusem nie jest pusta, co za tym idzie - nie znajdujemy się na stronie głównej, to jedziemy dalej.
  24.  
  25.  Dla lepszych rezultatów DIV ten został przeze mnie domyślnie ukryty, za pomocą ustawienia w jego CSS wartości 'display: none'.
  26.  
  27.  Przywrócimy mu widoczność na samym końcu, gdy już podmienimy całą zawartość.
  28.  
  29.  */
  30.  
  31.  
  32.  
  33.  
  34.  
  35.  if(msg_str != '')
  36.  
  37.  {
  38.  
  39.   /*
  40.  
  41.   STATUS: WYSZUKIWANIE - BRAK WYNIKÓW
  42.  
  43.   Sprawdzamy funkcją strstr(), czy treść DIV-a zawiera ciąg 'wyszukiwania'. Dlaczego akurat taki ciąg?
  44.  
  45.   Ponieważ podczas korzystania z wyszukiwarki, w przypadku nieznalezienia postów odpowiadających zapytaniu wyświetlona zostaje przez Bloggera informacja:
  46.  
  47.  
  48.  
  49.   BLOGGER WYŚWIETLA: Brak postów spełniających kryteria wyszukiwania: SZUKANA_FRAZA. Pokaż wszystkie posty
  50.  
  51.  
  52.  
  53.   Jeśli więc wystąpiło słowo 'wyszukiwania' to znak, że jesteśmy tutaj:
  54.  
  55.  
  56.  
  57.   http://phpmajster.blogspot.com/search?q=SZUKANA_FRAZA
  58.  
  59.  
  60.  
  61.   Zapisujemy do zmiennej mode wartość 'search_null', która określi nam status na "wyszukiwarka - niczego nie znaleziono"
  62.  
  63.   */
  64.  
  65.  
  66.  
  67.   if(mode == '' && strstr(msg_str, 'wyszukiwania'))
  68.  
  69.   {
  70.  
  71.    mode = 'search_null';  
  72.  
  73.  
  74.  
  75.   } else {
  76.  
  77.  
  78.  
  79.    /*
  80.  
  81.    W innym przypadku jeśli znajdziemy ciąg 'Brak postów', znaczy to, że jesteśmy tutaj:
  82.  
  83.    http://phpmajster.blogspot.com/search/label/ETYKIETA_GDZIE_NIE_MA_ANi_JEDNEGO_POSTA
  84.  
  85.  
  86.  
  87.    a komunikatem wyświetlanym jest:
  88.  
  89.  
  90.  
  91.    BLOGGER WYŚWIETLA: Brak postów z etykietą ETYKIETA_GDZIE_NIE_MA_ANi_JEDNEGO_POSTA. Pokaż wszystkie posty
  92.  
  93.  
  94.  
  95.    Wiemy już, że jesteśmy w pustym dziale, do zmiennej mode przypisujemy wartość 'empty'.
  96.  
  97.    Następnie metodą split() dzielimy informację o braku postów na dwie części, rozdzielamy słowem 'etykietą'.
  98.  
  99.    W tablicy exploded znajdzie się więc:
  100.  
  101.    exploded[0] = 'Brak postów z '
  102.  
  103.    exploded[1] = ' ETYKIETA_GDZIE_NIE_MA_ANi_JEDNEGO_POSTA. Pokaż wszystkie posty'
  104.  
  105.  
  106.  
  107.    To co nam zostało exploded[1] znowu rozdzielamy, tym razem stringiem  '. Pokaż', spowoduje to, że do tablicy label_name trafią:
  108.  
  109.  
  110.  
  111.    label_name[0] = ' ETYKIETA_GDZIE_NIE_MA_ANi_JEDNEGO_POSTA'
  112.  
  113.    label_name[1] = ' wszystkie posty'
  114.  
  115.  
  116.  
  117.    Mamy więc już wyciągniętą nazwę kategorii/etykietę z jakiej posty chcieliśmy wyświetlić.
  118.  
  119.    */
  120.  
  121.  
  122.  
  123.    if(mode == '' && strstr(msg_str, 'Brak postów'))
  124.  
  125.    {
  126.  
  127.     mode = 'empty';
  128.  
  129.     var exploded = msg_str.split('etykietą ');
  130.  
  131.     var label_name = exploded[1].split('. Pokaż');  
  132.  
  133.  
  134.  
  135.    } else {
  136.  
  137.  
  138.  
  139.     /*
  140.  
  141.     W jeszcze innym przypadku szukamy ciągu 'etykietą'.
  142.  
  143.     Ciąg taki wystąpi jeśli jesteśmy w kategorii/etykiecie i przeglądamy listę postów w niej zawartą.
  144.  
  145.  
  146.  
  147.     BLOGGER WYŚWIETLA: Pokazywanie postów oznaczonych etykietą ETYKIETA. Pokaż wszystkie posty
  148.  
  149.  
  150.  
  151.     I znowu - tniemy za pomocą słowa 'etykietą '.
  152.  
  153.     Do tablicy exploded trafią nam:
  154.  
  155.     exploded[0] = 'Pokazywanie postów oznaczonych ';
  156.  
  157.     exploded[1] = 'ETYKIETA. Pokaż wszystkie posty'
  158.  
  159.  
  160.  
  161.     Ponownie pozbywamy się ciągu 'Pokaż wszystie posty' i do label_name[0] trafia nam nazwa wyświetlanej etykiety.
  162.  
  163.     Zmienną mode ustawiamy na 'label'.  
  164.  
  165.     */  
  166.  
  167.     if(strstr(msg_str, 'etykietą'))
  168.  
  169.     {
  170.  
  171.      mode = 'label';
  172.  
  173.      var exploded = msg_str.split('etykietą ');
  174.  
  175.      var label_name = exploded[1].split('. Pokaż');  
  176.  
  177.     }
  178.  
  179.    }
  180.  
  181.   }
  182.  
  183.  
  184.  
  185.   /*
  186.  
  187.   Ostatnią możliwością jest wyświetlanie postów z wyszukiwarki w przypadku dopasowania szukanego słowa:
  188.  
  189.  
  190.  
  191.   BLOGGER WYŚWIETLA: Wszystkie posty spełniające kryteria zapytania php, posortowane według trafności. Sortuj według daty Pokaż wszystkie posty
  192.  
  193.   W tym przypadku jednak nic nie robimy z treścią komunikatu, zapisujemy jedynie do zmiennej mode wartość search.
  194.  
  195.   */
  196.  
  197.  
  198.  
  199.   if(mode == '' && strstr(msg_str, 'posortowane'))
  200.  
  201.   {
  202.  
  203.    mode = 'search';
  204.  
  205.   }
  206.  
  207.  
  208.  
  209.   // Zauważmy, że w każdym kolejnym warunku sprawdzana jest wartość zmiennej mode - kolejne dopasowania sprawdzamy tylko jeśli do tej pory jeszcze nic nie dopasowano.
  210.  
  211.  
  212.  
  213.  
  214.  
  215.   /*
  216.  
  217.   Wiemy już gdzie jesteśmy, znamy nazwę kategorii, pora więc wykorzystać zdobyte dane:
  218.  
  219.   */
  220.  
  221.  
  222.  
  223.   switch(mode)
  224.  
  225.   {
  226.  
  227.    /*
  228.  
  229.    W widoku listy postów z daną etykietą, przygotowujemy nagłówek do wyświetlenia i "wstrzykujemy" do DIV-a, zastępując oryginalną zawartość.
  230.  
  231.    Analogicznie w przypadku pozostałych widoków - preparujemy odpowiednio wyświetlane dane:
  232.  
  233.    */
  234.  
  235.  
  236.  
  237.    case 'label':
  238.  
  239.     var fullname = '';
  240.  
  241.     fullname = getHeader(label_name);  
  242.  
  243.     $("div.status-msg-body" ).html('<h1>' + fullname + '</h1>');  
  244.  
  245.    break;
  246.  
  247.  
  248.  
  249.    case 'search':
  250.  
  251.     $("div.status-msg-body" ).html('<h1>' + msg_html.replace('Sortuj', '</br>Sortuj') + '</h1>');
  252.  
  253.    break;
  254.  
  255.  
  256.  
  257.    case 'empty':
  258.  
  259.     var fullname = '';
  260.  
  261.     fullname = getHeader(label_name);
  262.  
  263.     $("div.status-msg-body" ).html('<h1>' + fullname + ' <br/>Chwilowo brak artykułów w tym dziale.</h1>');  
  264.  
  265.    break;
  266.  
  267.  
  268.  
  269.    case 'search_null':
  270.  
  271.     $("div.status-msg-body" ).html('<h1>' + msg_html.replace('Pokaż', '</br>Pokaż') + '</h1>');        
  272.  
  273.    break;
  274.  
  275.  
  276.  
  277.   }
  278.  
  279.   // Na sam koniec przywracamy widoczność DIV-a z już podmienionym nagłówkiem.
  280.  
  281.   $("div.status-msg-body").css('display', 'block');
  282.  
  283.  }
  284.  
  285. });
  286.  

Kolejny problem

Teraz stajemy przed następnym problemem - jak dowiedzieć się do jakiej kategorii należy czytany właśnie post. Rozwiązać to można dość prosto, za pomocą wyciągnięcia tych danych bezpośrednio z ekranu :)
Szablon posta tuż pod jego treścią wyświetla DIV-a z kilkoma fajnymi rzeczami, takimi jak nazwa autora, przyciski do udostępniania oraz nasze szukane etykiety - jest to DIV klasy CSS .postHeaderAd. Wyciągnijmy je więc stamtąd i rozłóżmy na czynniki pierwsze.
Mamy to już za sobą, a etykietki zapisaliśmy do globalnej zmiennej postLabels.
Najpierw moze więc funkcja, która wykona całą robotę na już wyciągniętych etykietach:

  1. function searchLabelInCats(labels)
  2.  
  3. {
  4.  
  5.  var tmpA = [];
  6.  
  7.  var lArray = labels.split(',');
  8.  
  9.  var lLen = lArray.length;
  10.  
  11.  var ret = '';
  12.  
  13.  
  14.  
  15.  for(i=0; i<lLen; i++)
  16.  
  17.  {  
  18.  
  19.   tmpA[0] = lArray[i].triaddActive();
  20.  
  21.   ret = getHeaderSub(tmpA);
  22.  
  23.  
  24.  
  25.   if(ret != '') {
  26.  
  27.    $("div.postHeaderAd").html(ret);
  28.  
  29.    $("div.postHeaderAd").css('display', 'block');
  30.  
  31.    return false;
  32.  
  33.   }
  34.  
  35.  }
  36.  
  37.  
  38.  
  39.  for(i=0; i<lLen; i++)
  40.  
  41.  {
  42.  
  43.   tmpA[0] = lArray[i].triaddActive();
  44.  
  45.   ret = getHeader(tmpA);
  46.  
  47.  
  48.  
  49.   if(ret != '') {
  50.  
  51.    $("div.postHeaderAd").html(ret);
  52.  
  53.    $("div.postHeaderAd").css('display', 'block');
  54.  
  55.    return false;
  56.  
  57.   }
  58.  
  59.  }
  60.  
  61. }
  62.  


Przeanalizujmy:

  1. function searchLabelInCats(labels)
  2.  
  3. {
  4.  
  5.  var tmpA = [];
  6.  
  7.  var lArray = labels.split(',');
  8.  
  9.  var lLen = lArray.length;
  10.  
  11.  var ret = '';
  12.  
  13.  
  14.  
  15.  /*
  16.  
  17.  Funkcja jako parametr labels przyjmuje wyciągnięte jako text etykiety bezpośrednio z opisu posta.
  18.  
  19.  Ciąg ten ma postać 'ETKIETA1, ETYKIETA2, ETYKIETA3...', aby więc dostać się do każdej etykiety osobno rozbijemy go na tablicę za pomocą: var lArray = labels.split(',');
  20.  
  21.  Rozdzielamy oczywiście za pomocą przecinka i nasza tablica magicznie wypełnia się naszymi etykietami. Podliczamy od razu ich ilość do zmiennej lLen i ruszamy do pętli:
  22.  
  23.  */
  24.  
  25.  
  26.  
  27.  for(i=0; i<lLen; i++)
  28.  
  29.  {
  30.  
  31.   /*
  32.  
  33.   Na początek tworzymy sobie tymczasową tablicę tmpA, gdyż funkcja getHeaderSub jako parametr pobiera tablicę, a nie string.
  34.  
  35.   Do tymczasowej tablicy na indexie 0 wrzucamy nazwę etykiety, przy okazji obcinając z niej spacje z początku i końca za pomocą triaddActive().
  36.  
  37.   Najpierw lecimy po podkategoriach: pobieramy kod wygenerowanego nagłówka dla naszej etykietki i sprawdzamy czy nie jest pusty (czy etykieta jest poprawna i czy jest podkategorią).
  38.  
  39.   Jeśli funkcja getHeaderSub() zwróciła nam nagłówek, znaczy to, że nasza etykieta to podkategoria, podmieniamy zatem nagłówek na ten wygenerowany i przywracamy mu widoczność, którą domyślnie wyłaczyliśmy w CSS.
  40.  
  41.   Po całej akcji przerywamy pętlę i wychodzimy z funkcji (return false).
  42.  
  43.   */
  44.  
  45.  
  46.  
  47.   tmpA[0] = lArray[i].trim();
  48.  
  49.   ret = getHeaderSub(tmpA);
  50.  
  51.  
  52.  
  53.   if(ret != '') {
  54.  
  55.    $("div.postHeaderAd").html(ret);
  56.  
  57.    $("div.postHeaderAd").css('display', 'block');
  58.  
  59.    return false;
  60.  
  61.   }
  62.  
  63.  }
  64.  
  65.  
  66.  
  67.  /*
  68.  
  69.  Jeśli jednak powyższe niczego nam nie wygenerowało, a funkcja dochodzi do tego momentu, znaczy to, że prawdopodobnie mamy do czynienia z etykietą kategorii nadrzędnej.
  70.  
  71.  Przelećmy pętlą tak jak powyżej, ale tym razem po kategoriach za pomocą getHeader(). Jeśli uda nam się wygenerować nagłówek to analogicznie jak powyżej kończymy działanie i wychodzimy z funkcji.
  72.  
  73.  */
  74.  
  75.  
  76.  
  77.  for(i=0; i<lLen; i++)
  78.  
  79.  {
  80.  
  81.   tmpA[0] = lArray[i].trim();
  82.  
  83.   ret = getHeader(tmpA);
  84.  
  85.  
  86.  
  87.   if(ret != '') {
  88.  
  89.    $("div.postHeaderAd").html(ret);
  90.  
  91.    $("div.postHeaderAd").css('display', 'block');
  92.  
  93.    return false;
  94.  
  95.   }
  96.  
  97.  }
  98.  
  99. }


Pozostaje nam tylko wywołanie całości, które umieszczamy w bloku $(document).ready():

  1. $(document).ready(function() {
  2.  
  3.  if($("div.status-msg-body").text() == '')
  4.  
  5.  {
  6.  
  7.   tmpLbls = postLabels.replace("Etykiety:", "");
  8.  
  9.   searchLabelInCats(tmpLbls);
  10.  
  11.  }
  12.  
  13.  $('#neat-menu').html(renderMenu());
  14.  
  15. });
  16.  


I analiza:

  1. $(document).ready(function() {
  2.  
  3.  
  4.  
  5.  if($("div.status-msg-body").text() == '')
  6.  
  7.  {
  8.  
  9.   /*
  10.  
  11.     Sprawdzamy, czy nie jesteśmy w widoku wyszukiwania, lub listy postów i pobieramy string z listą wszystkich etykiet, który wcześniej "ukradliśmy" z posta do zmiennej postLabels.
  12.  
  13.   Usuwamy z niego ciąg Etykiety:, który automatycznie dodaje Blogger i tak oczyszczony ciąg wysyłamy do funkcji powyżej opisanej.
  14.  
  15.   */
  16.  
  17.   tmpLbls = postLabels.replace("Etykiety:", "");
  18.  
  19.   searchLabelInCats(tmpLbls);
  20.  
  21.  
  22.  
  23.   /*
  24.  
  25.   W tym momencie mamy pięknie wygenerowany nagłówek dla posta.
  26.  
  27.   */
  28.  
  29.  }
  30.  
  31.  
  32.  
  33.  // Renderujemy menu, możemy pominąć jeśli menu nas nie interesuje:
  34.  
  35.  $('#neat-menu').html(renderMenu()());
  36.  
  37. });


I to już koniec zabawy z kategoriami, jak widać wymagało to napisania dość dużo kodu i kilku tricków, ale koncepcję taką można sobie dowolnie rozbudować.
Zachęcam do eksperymentowania. Na sam koniec umieszczam jeszcze opisany tutaj kod w całości:

Finalny kod w całości:


  1. <script>
  2.  
  3. var counter = [];
  4.  
  5. var counterCats = [];
  6.  
  7. var counterIndex = 0;
  8.  
  9. var counterCatIndex = 0;
  10.  
  11. var subcategories = [];
  12.  
  13. var categories = [];
  14.  
  15. var global_label = 'start';
  16.  
  17. var global_sublabel = 'start';
  18.  
  19. var menuRendered = false;
  20.  
  21.  
  22.  
  23. categories['PHP'] = new Array('PHP5', 0); //0
  24.  
  25. categories['HTML5_CSS3'] = new Array('HTML5/CSS3', 0); //1
  26.  
  27. categories['JAVASCRIPT'] = new Array('Javascript', 0); //2
  28.  
  29. categories['APACHE2'] = new Array('Apache 2', 0); //3
  30.  
  31. categories['SQL'] = new Array('SQL', 0); //4
  32.  
  33. categories['XML_JSON_SOAP'] = new Array('XML/JSON/SOAP', 0); //5
  34.  
  35. categories['GIT_SVN'] = new Array('Git/SVN', 0); //6
  36.  
  37. categories['API'] = new Array('API', 0); //7
  38.  
  39. categories['UPGRADE'] = new Array('Upgrade', 0); //8
  40.  
  41. categories['OTHER'] = new Array('Różności', 0); //9
  42.  
  43.  
  44.  
  45. subcategories['PHP_podstawy'] = new Array(0, 0, 'Podstawy');
  46.  
  47. subcategories['PHP_zaawansowane'] = new Array(1, 0, 'Zaawansowane');
  48.  
  49. subcategories['PHP_OOP'] = new Array(2, 0, 'Programowanie obiektowe');
  50.  
  51. subcategories['PDO'] = new Array(3, 0, 'PDO i bazy danych');
  52.  
  53. subcategories['PHP_wyrazenia_regularne'] = new Array(4, 0, 'Wyrażenia regularne');
  54.  
  55. subcategories['PHP_bezpieczenstwo'] = new Array(5, 0, 'Bezpieczeństwo');
  56.  
  57. subcategories['Smarty'] = new Array(6, 0, 'Smarty');
  58.  
  59. subcategories['ZendFramework'] = new Array(7, 0, 'Zend Framework');
  60.  
  61. subcategories['Symfony2'] = new Array(8, 0, 'Symfony2 Framework');
  62.  
  63. subcategories['Composer'] = new Array(9, 0, 'Composer');
  64.  
  65. subcategories['Propel'] = new Array(10, 0, 'Propel');
  66.  
  67. subcategories['Doctrine'] = new Array(11, 0, 'Doctrine');
  68.  
  69. subcategories['cURL'] = new Array(12, 0, 'cURL');
  70.  
  71. subcategories['GD2'] = new Array(13, 0, 'GD2');
  72.  
  73. subcategories['PHP_wzorce_projektowe'] = new Array(14, 0, 'Wzorce projektowe');
  74.  
  75. subcategories['PHP_pozostale'] = new Array(15, 0, 'Pozostałe');
  76.  
  77.  
  78.  
  79. subcategories['HTML5'] = new Array(16, 1, 'HTML5');
  80.  
  81. subcategories['CSS3'] = new Array(17, 1, 'CSS3');
  82.  
  83.  
  84.  
  85. subcategories['jQuery'] = new Array(18, 2, 'jQuery');
  86.  
  87. subcategories['Prototype'] = new Array(19, 2, 'Prototype');
  88.  
  89. subcategories['AJAX'] = new Array(20, 2, 'AJAX');
  90.  
  91.  
  92.  
  93. subcategories['APACHE2_httpd'] = new Array(21, 3, 'Konfiguracja - httpd.conf');
  94.  
  95. subcategories['APACHE2_htaccess'] = new Array(22, 3, 'Pliki .htaccess');
  96.  
  97. subcategories['APACHE2_rewrite'] = new Array(23, 3, 'Moduł RewriteEngine');
  98.  
  99. subcategories['APACHE2_vhosts'] = new Array(24, 3, 'Wirtualne hosty - vhosts.conf');
  100.  
  101. subcategories['APACHE2_auth'] = new Array(25, 3, 'Uwierzytelnianie / SSL');
  102.  
  103.  
  104.  
  105. subcategories['MySQL'] = new Array(26, 4, 'MySQL');
  106.  
  107. subcategories['SQL_zaawansowane'] = new Array(27, 4, 'Złożone zapytania');
  108.  
  109.  
  110.  
  111. subcategories['XML'] = new Array(28, 5, 'XML');
  112.  
  113. subcategories['JSON'] = new Array(29, 5, 'JSON');
  114.  
  115. subcategories['SOAP'] = new Array(30, 5, 'SOAP');
  116.  
  117.  
  118.  
  119. subcategories['GIT'] = new Array(31, 6, 'Git');
  120.  
  121. subcategories['SVN'] = new Array(32, 6, 'Subversion');
  122.  
  123.  
  124.  
  125. subcategories['API_Facebook'] = new Array(33, 7, 'Facebook API');
  126.  
  127. subcategories['API_Google'] = new Array(34, 7, 'Google API');
  128.  
  129. subcategories['API_Allegro'] = new Array(35, 7, 'Allegro API');
  130.  
  131.  
  132.  
  133. subcategories['Blogger'] = new Array(36, 8, 'Blogger');
  134.  
  135. subcategories['OTHERS'] = new Array(37, 9, 'Różności');
  136.  
  137.  
  138.  
  139. subcategories['QUICKTIPS'] = new Array(38, 9, 'QuickTips');
  140.  
  141.  
  142.  
  143. subcategories['QUICKLINKS'] = new Array(39, 9, 'QuickLinks');
  144.  
  145.  
  146.  
  147.  
  148.  
  149. function getCatLabel(catIndex)
  150.  
  151. {
  152.  
  153.  var cIndex = 0;
  154.  
  155.    for(cKey in categories)
  156.  
  157.    {
  158.  
  159.     if(catIndex == cIndex) return cKey;
  160.  
  161.     cIndex ++;
  162.  
  163.    }
  164.  
  165. }
  166.  
  167.  
  168.  
  169. function getCatIndex(catKey)
  170.  
  171. {
  172.  
  173.  var cIndex = 0; a
  174.  
  175.    for(cKey in categories)
  176.  
  177.    {
  178.  
  179.     if(cKey == catKey) return cIndex;
  180.  
  181.     cIndex ++;
  182.  
  183.    }
  184.  
  185. }
  186.  
  187.  
  188.  
  189. function arrayInverse(obj) {
  190.  
  191.  
  192.  
  193.   var new_obj = [];
  194.  
  195.   var j = 0;
  196.  
  197.   for(i in obj)
  198.  
  199.   {
  200.  
  201.    new_obj[j] = i;
  202.  
  203.    j++;
  204.  
  205.   }
  206.  
  207.   return new_obj;
  208.  
  209. }
  210.  
  211.  
  212.  
  213. var counterNames = arrayInverse(subcategories);
  214.  
  215.  
  216.  
  217. function writeCount(label)
  218.  
  219. {
  220.  
  221.  var sKey = parseInt(subcategories[label][0]);
  222.  
  223.  document.write(' (' + counter[sKey]  + ')');
  224.  
  225. }
  226.  
  227.  
  228.  
  229. function getCount(label)
  230.  
  231. {
  232.  
  233.  var sKey = parseInt(subcategories[label][0]);
  234.  
  235.  return counter[sKey];
  236.  
  237. }
  238.  
  239.  
  240.  
  241. function countPosts(json) {
  242.  
  243.  counter[counterIndex] = json.feed.openSearch$totalResults.$t;
  244.  
  245.  var sLabel = counterNames[counterIndex];
  246.  
  247.  var pIndex = parseInt(subcategories[sLabel][1]);
  248.  
  249.  var pLabel = getCatLabel(pIndex);
  250.  
  251.  categories[pLabel][1] = categories[pLabel][1] + parseInt(counter[counterIndex]);
  252.  
  253.  counterIndex++;
  254.  
  255. }
  256.  
  257.  
  258.  
  259. function getCatLabel(catIndex)
  260.  
  261. {
  262.  
  263.  var cIndex = 0;
  264.  
  265.    for(cKey in categories)
  266.  
  267.    {
  268.  
  269.     if(catIndex == cIndex) return cKey;
  270.  
  271.     cIndex ++;
  272.  
  273.    }
  274.  
  275. }
  276.  
  277. </script>
  278.  
  279.  
  280.  
  281. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_podstawy?alt=json-in-script&callback=countPosts">//0</script>
  282.  
  283. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_zaawansowane?alt=json-in-script&callback=countPosts">//1</script>
  284.  
  285. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_OOP?alt=json-in-script&callback=countPosts">//2</script>
  286.  
  287. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PDO?alt=json-in-script&callback=countPosts">//3</script>
  288.  
  289. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_wyrazenia_regularne?alt=json-in-script&callback=countPosts">//4</script>
  290.  
  291. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_bezpieczenstwo?alt=json-in-script&callback=countPosts">//5</script>
  292.  
  293. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Smarty?alt=json-in-script&callback=countPosts">//6</script>
  294.  
  295. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/ZendFramework?alt=json-in-script&callback=countPosts">//7</script>
  296.  
  297. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Symfony2?alt=json-in-script&callback=countPosts">//8</script>
  298.  
  299. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Composer?alt=json-in-script&callback=countPosts">//9</script>
  300.  
  301. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Propel?alt=json-in-script&callback=countPosts">//10</script>
  302.  
  303. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Doctrine?alt=json-in-script&callback=countPosts">//11</script>
  304.  
  305. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/cURL?alt=json-in-script&callback=countPosts">//12</script>
  306.  
  307. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/GD2?alt=json-in-script&callback=countPosts">//13</script>
  308.  
  309. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_wzorce_projektowe?alt=json-in-script&callback=countPosts">//14</script>
  310.  
  311. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_pozostale?alt=json-in-script&callback=countPosts">//15</script>
  312.  
  313.  
  314.  
  315. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/HTML5?alt=json-in-script&callback=countPosts">//16</script>
  316.  
  317. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/CSS3?alt=json-in-script&callback=countPosts">//17</script>
  318.  
  319.  
  320.  
  321. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/jQuery?alt=json-in-script&callback=countPosts">//18</script>
  322.  
  323. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Prototype?alt=json-in-script&callback=countPosts">//19</script>
  324.  
  325. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/AJAX?alt=json-in-script&callback=countPosts">//20</script>
  326.  
  327.  
  328.  
  329. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Konfiguracja?alt=json-in-script&callback=countPosts">//21</script>
  330.  
  331. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/APACHE2_htaccess?alt=json-in-script&callback=countPosts">//22</script>
  332.  
  333. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/APACHE2_rewrite?alt=json-in-script&callback=countPosts">//23</script>
  334.  
  335. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/APACHE2_vhosts?alt=json-in-script&callback=countPosts">//24</script>
  336.  
  337. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/APACHE2_auth?alt=json-in-script&callback=countPosts">//25</script>
  338.  
  339.  
  340.  
  341. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/MySQL?alt=json-in-script&callback=countPosts">//26</script>
  342.  
  343. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/SQL_zaawansowane?alt=json-in-script&callback=countPosts">//27</script>
  344.  
  345.  
  346.  
  347. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/XML?alt=json-in-script&callback=countPosts">//28</script>
  348.  
  349. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/JSON?alt=json-in-script&callback=countPosts">//29</script>
  350.  
  351. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/SOAP?alt=json-in-script&callback=countPosts">//30</script>
  352.  
  353.  
  354.  
  355. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/GIT?alt=json-in-script&callback=countPosts">//31</script>
  356.  
  357. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/SVN?alt=json-in-script&callback=countPosts">//32</script>
  358.  
  359.  
  360.  
  361. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/API_Facebook?alt=json-in-script&callback=countPosts">//33</script>
  362.  
  363. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/API_Google?alt=json-in-script&callback=countPosts">//34</script>
  364.  
  365. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/API_Allegro?alt=json-in-script&callback=countPosts">//35</script>
  366.  
  367.  
  368.  
  369. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Blogger?alt=json-in-script&callback=countPosts">//36</script>
  370.  
  371.  
  372.  
  373. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/OTHER?alt=json-in-script&callback=countPosts">//37</script>
  374.  
  375. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/QUICKTIPS?alt=json-in-script&callback=countPosts">//38</script>
  376.  
  377. <script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/QUICKLINKS?alt=json-in-script&callback=countPosts">//39</script>
  378.  
  379.  
  380.  
  381. <script>
  382.  
  383. function addActive(labelId)
  384.  
  385. {
  386.  
  387.  var activeClass = 'active';
  388.  
  389.  var actuaLabel = 'PHP';
  390.  
  391.  
  392.  
  393.  if(labelId == actualLabel)
  394.  
  395.  {
  396.  
  397.   document.write(' class=' + activeClass);
  398.  
  399.  }
  400.  
  401. }
  402.  
  403.  
  404.  
  405. String.prototype.replaceArray = function(find, replace) {
  406.  
  407.   var replaceString = this;
  408.  
  409.   for (var i = 0; i < find.length; i++) {
  410.  
  411.     replaceString = replaceString.replace(find[i], replace[i]);
  412.  
  413.   }
  414.  
  415.   return replaceString;
  416.  
  417. };
  418.  
  419.  
  420.  
  421. String.prototype.replaceArrayReg = function(find, replace) {
  422.  
  423.   var replaceString = this;
  424.  
  425.   var regex;
  426.  
  427.   for (var i = 0; i < find.length; i++) {
  428.  
  429.     regex = new RegExp(find[i]);
  430.  
  431.     replaceString = replaceString.replace(regex, replace[i]);
  432.  
  433.   }
  434.  
  435.   return replaceString;
  436.  
  437. };
  438.  
  439.  
  440.  
  441. String.prototype.replaceAll = function( token, newToken, ignoreCase ) {
  442.  
  443.     var _token;
  444.  
  445.     var str = this + "";
  446.  
  447.     var i = -1;
  448.  
  449.  
  450.  
  451.     if ( typeof token === "string" ) {
  452.  
  453.  
  454.  
  455.         if ( ignoreCase ) {
  456.  
  457.  
  458.  
  459.             _token = token.toLowerCase();
  460.  
  461.  
  462.  
  463.             while( (
  464.  
  465.                 i = str.toLowerCase().indexOf(
  466.  
  467.                     token, i >= 0 ? i + newToken.length : 0
  468.  
  469.                 ) ) !== -1
  470.  
  471.             ) {
  472.  
  473.                 str = str.substring( 0, i ) +
  474.  
  475.                     newToken +
  476.  
  477.                     str.substring( i + token.length );
  478.  
  479.             }
  480.  
  481.  
  482.  
  483.         } else {
  484.  
  485.             return this.split( token ).join( newToken );
  486.  
  487.         }
  488.  
  489.  
  490.  
  491.     }
  492.  
  493.  return str;
  494.  
  495. };
  496.  
  497.  
  498.  
  499. function strip_tags(input, allowed) {
  500.  
  501.   allowed = (((allowed || '') + '')
  502.  
  503.     .toLowerCase()
  504.  
  505.     .match(/<[a-z][a-z0-9]*>/g) || [])
  506.  
  507.     .join('');
  508.  
  509.   var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
  510.  
  511.     commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
  512.  
  513.   return input.replace(commentsAndPhpTags, '')
  514.  
  515.     .replace(tags, function($0, $1) {
  516.  
  517.       return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
  518.  
  519.     });
  520.  
  521. }
  522.  
  523.  
  524.  
  525.  
  526.  
  527. function br2nl(t) {
  528.  
  529.  return t.replace(/<br \/>/g, "\r");
  530.  
  531. }
  532.  
  533.  
  534.  
  535. function getRandomArbitary (min, max) {
  536.  
  537.     return Math.floor(Math.random() * (max - min + 1)) + min;
  538.  
  539. }
  540.  
  541.  
  542.  
  543. function strstr(haystack, needle, bool) {
  544.  
  545.     var pos = 0;
  546.  
  547.     haystack += "";
  548.  
  549.     pos = haystack.indexOf(needle); if (pos == -1) {
  550.  
  551.         return false;
  552.  
  553.     } else {
  554.  
  555.         if (bool) {
  556.  
  557.             return haystack.substr(0, pos);
  558.  
  559.         } else {
  560.  
  561.             return haystack.slice(pos);
  562.  
  563.         }
  564.  
  565.     }
  566.  
  567. }
  568.  
  569.  
  570.  
  571. function renderSubCats(parentIndex)
  572.  
  573. {
  574.  
  575.  var subCatData = new Array();
  576.  
  577.  var str = '';
  578.  
  579.  
  580.  
  581.  for(subKey in subcategories)
  582.  
  583.  {
  584.  
  585.   subCatData = subcategories[subKey];
  586.  
  587.   if(subCatData[1] == parentIndex)
  588.  
  589.   {
  590.  
  591.    if(subKey == global_sublabel) {
  592.  
  593.     str = str.concat("<li class='active'><a class='active_sub' href='http://phpmajster.blogspot.com/search/label/" + subKey + "'><b>" + subCatData[2] + " (" + getCount(subKey) + ")</b></a></li>");
  594.  
  595.     $("li[subid='" + global_sublabel +"']").addClass('left_sub_active');
  596.  
  597.  
  598.  
  599.    } else {
  600.  
  601.     str = str.concat("<li><a href='http://phpmajster.blogspot.com/search/label/" + subKey + "'>" + subCatData[2] + " (" + getCount(subKey) + ")</a></li>");
  602.  
  603.    }
  604.  
  605.   }
  606.  
  607.  }
  608.  
  609.  if(str != '')
  610.  
  611.  {
  612.  
  613.   return '<ul>' + str + '</ul>';
  614.  
  615.  } else {
  616.  
  617.  
  618.  
  619.   return '';
  620.  
  621.  }
  622.  
  623. }
  624.  
  625.  
  626.  
  627.  
  628.  
  629. function renderMenu()()
  630.  
  631. {
  632.  
  633.  var pIndex = null;
  634.  
  635.  var str = '';
  636.  
  637.  var home_str = '<li class="active"><a href="/">Home</a></li>';
  638.  
  639.  
  640.  
  641.  for(key in categories)
  642.  
  643.  {
  644.  
  645.   if(global_label == key) {
  646.  
  647.    str = str.concat("<li class='active'><a href='http://phpmajster.blogspot.com/search/label/" + key + "'>" + categories[key][0] + "</a>");  
  648.  
  649.   } else {
  650.  
  651.    str = str.concat("<li><a href='http://phpmajster.blogspot.com/search/label/" + key + "'>" + categories[key][0] + "</a>");
  652.  
  653.   }
  654.  
  655.  
  656.  
  657.   str = str.concat(renderSubCats(pIndex));
  658.  
  659.   str = str.concat("</li>");
  660.  
  661.  }
  662.  
  663.  
  664.  
  665.  if(global_label != 'start')
  666.  
  667.  {
  668.  
  669.   home_str = '<li><a href="/">Home</a></li>';
  670.  
  671.  }
  672.  
  673.  
  674.  
  675.  return '<ul>' + home_str + str + '<li><a href="http://phpmajster.blogspot.com/p/autorkontakt.html">Redakcja</a></li></ul>';
  676.  
  677. }
  678.  
  679.  
  680.  
  681.  
  682.  
  683. function getSubcatName(catIndex)
  684.  
  685. {
  686.  
  687.  var tmpKey = counterNames[catIndex];
  688.  
  689.  return subcategories[tmpKey][2];
  690.  
  691. }
  692.  
  693.  
  694.  
  695. function getHeader(label_name)
  696.  
  697. {
  698.  
  699.  var fullname = '';
  700.  
  701.  
  702.  
  703.  if(label_name[0] in categories) {
  704.  
  705.  
  706.  
  707.   fullname = categories[label_name[0]][0] + ' ('+ categories[label_name[0]][1] + ')' ; // a
  708.  
  709.   global_label =  label_name[0]; // b
  710.  
  711.  
  712.  
  713.  } else {
  714.  
  715.  
  716.  
  717.   if(label_name[0] in subcategories) {
  718.  
  719.  
  720.  
  721.    var tmpParentIndex = parseInt(subcategories[label_name[0]][1]); //a
  722.  
  723.    var tmpParentLabel = getCatLabel(tmpParentIndex); //b
  724.  
  725.    global_label = tmpParentLabel; //c
  726.  
  727.    global_sublabel = label_name[0]; //d
  728.  
  729.  
  730.  
  731.    fullname = '<a href="http://phpmajster.blogspot.com/search/label/' + tmpParentLabel +'">' + categories[tmpParentLabel][0] + '</a> / ' + subcategories[label_name[0]][2] + ' ('+ getCount(label_name[0]) +')'; // e
  732.  
  733.   }  
  734.  
  735.  }
  736.  
  737.  return fullname;
  738.  
  739. }
  740.  
  741.  
  742.  
  743. function getHeaderSub(label_name)
  744.  
  745. {
  746.  
  747.  var fullname = '';
  748.  
  749.   if(label_name[0] in subcategories) {
  750.  
  751.  
  752.  
  753.    var tmpParentIndex = parseInt(subcategories[label_name[0]][1]);
  754.  
  755.    var tmpParentLabel = getCatLabel(tmpParentIndex);
  756.  
  757.    global_label = tmpParentLabel;
  758.  
  759.    global_sublabel = label_name[0];
  760.  
  761.  
  762.  
  763.    fullname = '<a href="http://phpmajster.blogspot.com/search/label/' + tmpParentLabel +'">' + categories[tmpParentLabel][0] + '</a> / <a href="http://phpmajster.blogspot.com/search/label/' + label_name[0] +'">' + subcategories[label_name[0]][2] + ' ('+ getCount(label_name[0]) +')</a>';
  764.  
  765.   }  
  766.  
  767.  
  768.  
  769.  return fullname;
  770.  
  771. }
  772.  
  773.  
  774.  
  775. $("div.status-msg-body").ready(function() {
  776.  
  777.  
  778.  
  779.  var mode = '';
  780.  
  781.  var msg_str = $("div.status-msg-body" ).text();
  782.  
  783.  var msg_html = $("div.status-msg-body" ).html();
  784.  
  785.  
  786.  
  787.  if(msg_str != '')
  788.  
  789.  {  
  790.  
  791.   if(mode == '' && strstr(msg_str, 'wyszukiwania'))
  792.  
  793.   {
  794.  
  795.    mode = 'search_null';  
  796.  
  797.  
  798.  
  799.   } else {
  800.  
  801.  
  802.  
  803.    if(mode == '' && strstr(msg_str, 'Brak postów'))
  804.  
  805.    {
  806.  
  807.     mode = 'empty';
  808.  
  809.     var exploded = msg_str.split('etykietą ');
  810.  
  811.     var label_name = exploded[1].split('. Pokaż');  
  812.  
  813.  
  814.  
  815.    } else {
  816.  
  817.  
  818.  
  819.     if(strstr(msg_str, 'etykietą'))
  820.  
  821.     {
  822.  
  823.      mode = 'label';
  824.  
  825.      var exploded = msg_str.split('etykietą ');
  826.  
  827.      var label_name = exploded[1].split('. Pokaż');  
  828.  
  829.     }
  830.  
  831.    }
  832.  
  833.   }
  834.  
  835.  
  836.  
  837.   if(mode == '' && strstr(msg_str, 'posortowane'))
  838.  
  839.   {
  840.  
  841.    mode = 'search';
  842.  
  843.   }
  844.  
  845.  
  846.  
  847.   switch(mode)
  848.  
  849.   {
  850.  
  851.  
  852.  
  853.    case 'label':
  854.  
  855.     var fullname = '';
  856.  
  857.     fullname = getHeader(label_name);  
  858.  
  859.     $("div.status-msg-body" ).html('<h1>' + fullname + '</h1>');  
  860.  
  861.    break;
  862.  
  863.  
  864.  
  865.    case 'search':
  866.  
  867.     $("div.status-msg-body" ).html('<h1>' + msg_html.replace('Sortuj', '</br>Sortuj') + '</h1>');
  868.  
  869.    break;
  870.  
  871.  
  872.  
  873.    case 'empty':
  874.  
  875.     var fullname = '';
  876.  
  877.     fullname = getHeader(label_name);
  878.  
  879.     $("div.status-msg-body" ).html('<h1>' + fullname + ' <br/>Chwilowo brak artykułów w tym dziale.</h1>');  
  880.  
  881.    break;
  882.  
  883.  
  884.  
  885.    case 'search_null':
  886.  
  887.     $("div.status-msg-body" ).html('<h1>' + msg_html.replace('Pokaż', '</br>Pokaż') + '</h1>');        
  888.  
  889.    break;
  890.  
  891.  
  892.  
  893.   }
  894.  
  895.  }
  896.  
  897. });
  898.  
  899.  
  900.  
  901. var postLabels = '';
  902.  
  903. var inPost = false;
  904.  
  905.  
  906.  
  907. $("div.inPost").ready(function() {
  908.  
  909.  
  910.  
  911.  var inPostDiv = $("div.inPost").text();
  912.  
  913.  
  914.  
  915.  if(inPostDiv == 'TRUE') {
  916.  
  917.   inPost = true;
  918.  
  919.   postId = $("div.inPostID").text();
  920.  
  921.   postLabels = $("span.post-labels").text();
  922.  
  923.   $('div.ifClr').addClass('clr');
  924.  
  925.  }
  926.  
  927. });
  928.  
  929.  
  930.  
  931. function searchLabelInCats(labels)
  932.  
  933. {
  934.  
  935.  var tmpA = [];
  936.  
  937.  var lArray = labels.split(',');
  938.  
  939.  var lLen = lArray.length;
  940.  
  941.  var ret = '';
  942.  
  943.  
  944.  
  945.  for(i=0; i<lLen; i++)
  946.  
  947.  {  
  948.  
  949.   tmpA[0] = lArray[i].trim();
  950.  
  951.   ret = getHeaderSub(tmpA);
  952.  
  953.  
  954.  
  955.   if(ret != '') {
  956.  
  957.    $("div.postHeaderAd").html(ret);
  958.  
  959.    $("div.postHeaderAd").css('display', 'block');
  960.  
  961.    return false;
  962.  
  963.   }
  964.  
  965.  }
  966.  
  967.  
  968.  
  969.  for(i=0; i<lLen; i++)
  970.  
  971.  {
  972.  
  973.   tmpA[0] = lArray[i].trim();
  974.  
  975.   ret = getHeader(tmpA);
  976.  
  977.  
  978.  
  979.   if(ret != '') {
  980.  
  981.    $("div.postHeaderAd").html(ret);
  982.  
  983.    $("div.postHeaderAd").css('display', 'block');
  984.  
  985.    return false;
  986.  
  987.   }
  988.  
  989.  }
  990.  
  991. }
  992.  
  993.  
  994.  
  995. $(document).ready(function() {
  996.  
  997.  if($("div.status-msg-body").text() == '')
  998.  
  999.  {
  1000.  
  1001.   tmpLbls = postLabels.replace("Etykiety:", "");
  1002.  
  1003.   searchLabelInCats(tmpLbls);
  1004.  
  1005.  }
  1006.  
  1007.  $('#neat-menu').html(renderMenu()());
  1008.  
  1009. });
  1010.  
  1011. </script>

Brak komentarzy:

Prześlij komentarz

Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji