Pokazywanie postów oznaczonych etykietą Blogger. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Blogger. Pokaż wszystkie posty

wtorek, 19 maja 2015

[UPGRADE][Blogger] Kolorowanie składni kodu - Google Code Prettify

TRUE
5633298314763569632
Jak widać na tej stronie, wszystkie listingi z kodem są ładnie pokolorowane. Blogger oczywiście nie oferuje tego domyślnie, trzeba zatroszczyć się o to samemu. Pokażę tutaj jak tego dokonać. Wykorzystałem do tego celu popularny skrypt do kolorowania składni kodu udostępniany za darmo przez wujka Google, czyli Google Code Prettify. Oczywiście skryptów tego typu jest cała masa, ja jednak wybrałem ten od Google, gdyż wydaje mi się najszybszy i najbardziej odporny na wszelkie różne dziwne konstrukcje znakowe. Opiszę też mój sposób na automatyczne kolorowanie kodu ubranego w znaczniki bezpośrednio w edytorze wizualnym Bloggera - takie podejście jest o wiele bardziej wygodne, nic dodawanie ręcznie znacznika <pre> dla każdego listingu.

Dołączenie skryptu .js

Pierwsze co musimy zrobić to wejść w edycję szablonu i w nagłówku <head> załaczyć link do skryptu:
[code]<script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>[/code]

[UPGRADE][Blogger] Losowy post z danej kategorii pobierany z feeda

TRUE
6923652971032030257
Jak rozwiązałem wyświetlanie losowego "tipa" na górze strony? Bardzo prosto, choć trzeba było co nieco pokombinować. Po pierwsze z pomocą przychodzi generowany przez Bloggera kanał RSS. Jak wiemy, możemy pobierać wpisy po etykietach za pomocą specjalnie spreparowanego linku. W tym przypadku pobieramy zestawienie postów z etykietą QUICKTIPS za pomocą linka: /feeds/posts/summary/-/QUICKTIPS?alt=json, gdzie jako parametr alt podajemy oczywiście json, gdyż chcemy otrzymać dane w formacie JSON, a nie w XML. I tutaj pojawia się mały myk - ścieżkę do feeda musimy podać relatywną, lub pobrać poprzez javascript wartość location.hostname i dołączyć do ścieżki.

Dlaczego? Już wyjaśniam.
Podając tutaj np.:
[code]http://phpmajster.blogspot.com/feeds/posts/summary/-/QUICKTIPS?alt=json[/code]
nałożymy sobie ograniczenie Same Origin Policy.

Na czym to w skrócie polega skoro link prowadzi w to samo miejsce? Mianowicie za pomocą $.getJSON() pobrać możemy dane jedynie z TEJ SAMEJ domeny, na której uruchomiony został skrypt.

[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.
[code]var postLabels = ''; var inPost = false;[/code]
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:
[code]<div class='inPost'>TRUE</div>[/code]
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.

[UPGRADE][Blogger] Robimy system kategorii cz.3 - dynamicznie generowany nagłówek

TRUE
6980526829644944639
W części tej zajmiemy się wyświetleniem spreparowanego nagłówka dla posta. Dzięki naszemu kodowi nazwa kategorii i subkategorii pojawi się nad postem w postaci linka. Umożliwi to bardzo wygodną nawigację po naszej strukturze kategorii. Dodatkowo wyświetlimy tam liczbę wpisów znajdujących się w danej kategorii. Wszystko odbywać się będzie automatycznie za pomocą przygotowanego przez nas tutaj kodu. Przygotujmy zatem kilka nowych funkcji, które do tego wykorzystamy.

Kolejne funkcje

Funkcja getSubcatName() zwraca tytuł etykiety podkategorii za pomocą jej indeksu w tablicy. Pobiera najpierw NAZWĘ KLUCZA TABLICY Z ETYKIETĄ o indeksie = catIndex, a następnie za pomocą tego klucza zwraca resztę, np. wywołanie getSubcatName(4) zwróci z tablicy ciąg Wyrażenia regularne, wg zasady działania:


  1. tmpkey = counterNames[4] = PHP_wyrazenia_regularne
  2. subcategories['PHP_wyrazenia_regularne'] = new Array(4, 0, 'Wyrażenia regularne');
  3. return subcategories['PHP_wyrazenia_regularne'][2] = Wyrażenia regularne

[code]
function getSubcatName(catIndex)
{
 var tmpKey = counterNames[catIndex];
 return subcategories[tmpKey][2];
}[/code]

Co dalej?

[UPGRADE][Blogger] Robimy system kategorii cz.2 - dynamicznie generowane menu

TRUE
3865585716171268360
W tej części przygotujemy dynamiczne menu, taie jak widać tutaj, na górze strony. Będzie to wymagało kilka zabiegów i utworzenia paru funkcji, które automatycznie pobiorą nam informacje o kategoriach na stronie i policzą posty w nich zawarte. Konieczna będzie też mała modyfikacja szablonu w celu dodania do niego odpowiedzialnych za menu styli CSS.

DIV-a z naszym menu wklejamy w szablonie w miejsce tam, gdzie chcemy, aby nasze menu się wyświetliło, najlepiej przed znacznikiem </header>:

[code]
<div id='contact-links'>
    <div id='menu-container'>
        <nav id='neat-menu'></nav>    
        <div id='menu-search'>
          <form method='get' action='/search'>
                <input autocomplete='off' name='q' placeholder='szukaj...' type='text' value=''/>
            </form>
        </div>
    </div>
</div>
[/code]
Style CSS do menu zaczerpnięte zostały ze strony http://helplogger.blogspot.com/2014/02/add-a-neat-css-dropdown-menu-in-blogger.html, gdzie znajduje się prosty przykład użycia.
My jednak przebudujemy całość tak, aby zawartość naszego menu generowała się dynamicznie na podstawie zawartych w tablicach kategorii.

[UPGRADE][Blogger] Robimy system kategorii cz.1 - kategorie i podkategorie

TRUE
4284684279824674327
Jak widać na przykładzie tego bloga, istnieje tutaj system kategorii i podkategorii.
Blogger domyślnie nie oferuje niczego takiego, więc musiałem wymyślić taki system po swojemu i posłużyć się do tego kilkoma trickami. W tutorialu tym opiszę krok po kroku jak tego dokonałem. Wiedza zdobyta tutaj pozwoli Wam na przygotowanie własnego systemu kategorii i podkategorii na stronie Bloggera. Opiszę dokładnie cały kod jaki napisałem na potrzeby tej strony i pokażę jak wykorzystać to w praktyce. Do całości wykorzystamy tutaj javascriptową bibliotekę jQuery oraz kanały RSS jakie Blogger generuje dla swoich postów. Oczywiście nasze posty oznaczać będziemy odpowiednimi etykietami, tak aby trafiały do odpowiednich kategorii.
Zaczynamy

Na samym początku zdefiniujmy kilka zmiennych i tablic.
[code]
var counter = []; // tablica zawierająca ilość postów w podkategorii
var counterCats = [];  // tablica zawierająca ilość postów w kategorii
var counterIndex = 0;  // index aktualnie przetwarzanej podkategorii
var counterCatIndex = 0;  // index aktualnie przetwarzanej kategorii
var subcategories = [];  // tablica z listą podkategorii
var categories = [];  // tablica z listą kategorii nadrzędnyh
var global_label = 'start';  // globalna zmienna przechowywująca aktualną kategorię
var global_sublabel = 'start';  // globalna zmienna przechowywująca aktualną podkategorię
var menuRendered = false;  // zmienna pomocnicza do renderowania menu
[/code]
Będziemy musieli ręcznie zdefiniować listę wszystkich kategorii i podkategorii. Wykorzystamy do tego tablice w Javascripcie.
Naszą strukturę podzielimy na kategorie nadrzędne - categories[] - oraz podkategorie się w nich zawierające - subcategories[].

Na pierwszy ogień zdefiniujemy tablicę z kategoriami - co musi się w nich zawierać?
Przede wszystkim tytuł kategorii oraz pole przechowywujące ilość postów w danej kategorii i jej podkategoriach. Kluczem/indexem tablicy będzie natomiast NAZWA ETYKIETY postu. Muszę tutaj zaznaczyć, że w tutorialu tym będę używał przemieniennie zwrotów ETYKIETA oraz KATEGORIA i PODKATEGORIA, gdyż nasze kategorie to tak naprawdę etykiety.
Naszą tablicę zdefiniować powinniśmy w kolejności takiej w jakiej elementy pojawią się w menu - tutorial o tym jak stworzyć dynamiczne menu i podczepić je pod kod z kategoriami znajduje się w następnym artykule.

Tworzymy strukturę tablic

Tablicę tworzymy wg następującego schematu:
[code]categories[NAZWA_ETYKIETY] = new Array(TYTUŁ_ETYKIETY, ŁĄCZNA ILOŚĆ POSTÓW) [/code]

Dla ułatwienia sobie sprawy po komentarzu dajemy tutaj numer elementu począwszy od 0 - przyda to się nam na później, gdyż jak widać klucze tablicy to nazwy etykiet, a w kilku miejscach potrzebować będziemy ich wartości liczbowych jako indeksu elementów w tablicy. Zdefiniujmy zatem naszą tablicę z kategoriami:
[code]categories['PHP'] = new Array('PHP5', 0); //0
categories['HTML5_CSS3'] = new Array('HTML5/CSS3', 0); //1
categories['JAVASCRIPT'] = new Array('Javascript', 0); //2
categories['APACHE2'] = new Array('Apache 2', 0); //3
categories['SQL'] = new Array('SQL', 0); //4
categories['XML_JSON_SOAP'] = new Array('XML/JSON/SOAP', 0); //5
categories['GIT_SVN'] = new Array('Git/SVN', 0); //6
categories['API'] = new Array('API', 0); //7
categories['UPGRADE'] = new Array('Upgrade', 0); //8
categories['OTHER'] = new Array('Różności', 0); //9[/code]

Kategorie główne już mamy, teraz czas na podkategorie, ponownie jak w poprzednim wypadku, tutaj też utworzymy tablicę, z kluczem jako NAZWA ETYKIETY, ale o trochę innej strukturze:
[code]subcategories[NAZWA_ETYKIETY] = new Array(INDEX_NUMERYCZNY, INDEX_ETYKIETY_NADRZĘDNEJ, TYTUŁ_ETYKIETY);[/code]

gdzie:


  • NAZWA_ETYKIETY, to etykieta tak jak widzi ją Blogger,
  • INDEX_NUMERYCZNY - index elementu tablicy, który przyda nam się później, warto zauważyć, iż przy każdym dodaniu nowego elementu musimy zwiększyć nasz indeks o 1,
  • TYTUŁ ETYKIETY - tytuł etykiety do wyświetlenia na stronie


[code]
subcategories['PHP_podstawy'] = new Array(0, 0, 'Podstawy');
subcategories['PHP_zaawansowane'] = new Array(1, 0, 'Zaawansowane');
subcategories['PHP_OOP'] = new Array(2, 0, 'Programowanie obiektowe');
subcategories['PDO'] = new Array(3, 0, 'PDO i bazy danych');
subcategories['PHP_wyrazenia_regularne'] = new Array(4, 0, 'Wyrażenia regularne');
subcategories['PHP_bezpieczenstwo'] = new Array(5, 0, 'Bezpieczeństwo');
subcategories['Smarty'] = new Array(6, 0, 'Smarty');
subcategories['ZendFramework'] = new Array(7, 0, 'Zend Framework');
subcategories['Symfony2'] = new Array(8, 0, 'Symfony2 Framework');
subcategories['Composer'] = new Array(9, 0, 'Composer');
subcategories['Propel'] = new Array(10, 0, 'Propel');
subcategories['Doctrine'] = new Array(11, 0, 'Doctrine');
subcategories['cURL'] = new Array(12, 0, 'cURL');
subcategories['GD2'] = new Array(13, 0, 'GD2');
subcategories['PHP_wzorce_projektowe'] = new Array(14, 0, 'Wzorce projektowe');
subcategories['PHP_pozostale'] = new Array(15, 0, 'Pozostałe');

subcategories['HTML5'] = new Array(16, 1, 'HTML5');
subcategories['CSS3'] = new Array(17, 1, 'CSS3');

subcategories['jQuery'] = new Array(18, 2, 'jQuery');
subcategories['Prototype'] = new Array(19, 2, 'Prototype');
subcategories['AJAX'] = new Array(20, 2, 'AJAX');

subcategories['APACHE2_httpd'] = new Array(21, 3, 'Konfiguracja - httpd.conf');
subcategories['APACHE2_htaccess'] = new Array(22, 3, 'Pliki .htaccess');
subcategories['APACHE2_rewrite'] = new Array(23, 3, 'Moduł RewriteEngine');
subcategories['APACHE2_vhosts'] = new Array(24, 3, 'Wirtualne hosty - vhosts.conf');
subcategories['APACHE2_auth'] = new Array(25, 3, 'Uwierzytelnianie / SSL');

subcategories['MySQL'] = new Array(26, 4, 'MySQL');
subcategories['SQL_zaawansowane'] = new Array(27, 4, 'Złożone zapytania');

subcategories['XML'] = new Array(28, 5, 'XML');
subcategories['JSON'] = new Array(29, 5, 'JSON');
subcategories['SOAP'] = new Array(30, 5, 'SOAP');

subcategories['GIT'] = new Array(31, 6, 'Git');
subcategories['SVN'] = new Array(32, 6, 'Subversion');

subcategories['API_Facebook'] = new Array(33, 7, 'Facebook API');
subcategories['API_Google'] = new Array(34, 7, 'Google API');
subcategories['API_Allegro'] = new Array(35, 7, 'Allegro API');

subcategories['Blogger'] = new Array(36, 8, 'Blogger');
subcategories['OTHERS'] = new Array(37, 9, 'Różności');

subcategories['QUICKTIPS'] = new Array(38, 9, 'QuickTips');

subcategories['QUICKLINKS'] = new Array(39, 9, 'QuickLinks');[/code]



Mając już zdefiniowane obie tablice przystępujemy do napisania kodu, który je obsłuży.
Na początek przygotujmy kilka funkcji, a następnie na samym końcu wykorzystajmy je w bloku $(document).ready() biblioteki jQuery.

Stwórzmy kilka funkcji

Pierwsza z naszych funkcji odpowiadać będzie za pobieranie NAZWY ETYKIETY kategorii za pomocą indeksu w tablicy. Jako argument przyjmować będzie liczbowy indeks.
[code]
function getCatLabel(catIndex)
{
 var cIndex = 0;
   for(cKey in categories)
   {
    if(catIndex == cIndex) return cKey;
    cIndex ++;
   }
}[/code]
Kolejna to odwrotność powyższej - odpowiadać będzie a pobieranie indeksu kategorii w tablicy za pomocą NAZWY ETYKIETY. Jako argument przyjmować będzie nazwę etykiety.
[code]
function getCatIndex(catKey)
{
 var cIndex = 0; a
   for(cKey in categories)
   {
    if(cKey == catKey) return cIndex;
    cIndex ++;
   }
}[/code]

Przygotowanie indeksu dla tablicy

Poniższa funkcja niejako odwraca tablicę asocjacyjną z etykietami, jednocześnie ją indeksując i pobierając klucz starej tablicy jako wartość, Działać to będzie na zasadzie:

nowa_tablica[j] = KLUCZ     ===     stara_tablica['KLUCZ'] = WARTOŚĆ, gdzie j = 0,1,2,3....
[code]
function arrayInverse(obj) {

  var new_obj = [];
  var j = 0;
  for(i in obj)
  {
   new_obj[j] = i;
   j++;
  }
  return new_obj;
}[/code]

Przygotujmy teraz specjalną tablicę, za pomocą funkcji opisanej powyżej,
w przypadku, np. etykiety PHP_wzorce_projektowe otrzymamy:
[code]subcategories['PHP_wzorce_projektowe'] = new Array(14, 0, 'Wzorce projektowe');
counterNames[14] = 'PHP_wzorce_projektowe'[/code]
Odwracamy:
[code]var counterNames = arrayInverse(subcategories);[/code]

Funkcja writeCount(label) pobierać będzie z tablicy liczbę postów z etykietą label.
Wyświetli ilość postów w nawiasie bezpośrednio w miejscu jej wywołania.
Ilość postów pobierana jest z tablicy counter[index].
Indeks etykiety przechowywany jest w tablicy subcategories[NAZWA_ETYKIETY][0], np.
[code]subcategories['API_Facebook'] = new Array(33, 7, 'Facebook API'); [/code]

gdzie w tym przypadku:

  • API_Facebook - KLUCZ/NAZWA_ETYKIETY
  • 33 - index etykiety
  • Facebook API - tytuł etykiety
  • 7 - index kategorii nadrzędnej, w tym przypadku:

[code]categories['API'] = new Array('API', 0);[/code]
[code]
function writeCount(label)
{
 var sKey = parseInt(subcategories[label][0]);
 document.write(' (' + counter[sKey]  + ')');
}[/code]
Jedziemy dalej:
Funkcja, która pobiera z tablicy liczbę postów z etykietą label.
Nie wyświetla, a jedynie zwraca ilość postów.
[code]
function getCount(label)
{
 var sKey = parseInt(subcategories[label][0]);
 return counter[sKey];
}[/code]

Poniższa funkcja zostanie opisana za chwilę:
[code]
function countPosts(json) {
 counter[counterIndex] = json.feed.openSearch$totalResults.$t;
 var sLabel = counterNames[counterIndex]; // subcat label
 var pIndex = parseInt(subcategories[sLabel][1]); // parent index
 var pLabel = getCatLabel(pIndex); // parent label
 categories[pLabel][1] = categories[pLabel][1] + parseInt(counter[counterIndex]);
 counterIndex++;
}[/code]

Bazowe funkcje już mamy (potem będzie ich więcej).
Na początek policzymy posty w zadanych kategoriach (oznaczonych danymi etykietami). Wykorzystamy do tego kanał RSS bloga pobierając z niego informacje o ilości postów.
Po pierwsze musimy wywołać odpowiedni kanał za pomocą specjalnego linka, zrobimy to za pomocą następującego schematu:
[code]<script src="http://NAZWA_BLOGA.blogspot.com/feeds/posts/summary/-/NAZWA_ETYKIETY?alt=json-in-script&callback=FUNKCJA_ZWROTNA"></script>[/code]
gdzie jako NAZWA_ETYKIETY podajemy nazwę etykiety/kategorii, a jako FUNKCJA_ZWROTNA nazwę funkcji javascriptowej, która obsłuży odebrane dane.
W naszym przypadku funkcją tą jest countPosts(). Niestety napotykamy na pewne ograniczenie - nie możemy podać do nazwy funkcji żadnego swojego argumentu, a więc w jakiś sposób musimy poinformować ową funkcję z jakiej obecnie etykiety posty liczymy. Zrobimy to następującym sposobem - wykonamy pobieranie feeda ODPOWIEDNIO PO KOLEJI - tak jak nazwy etykiet występują w tablicy. Może być to niewygodne, ale jeśli wszystko wykonamy w odpowiedniej kolejności - całość zadziała poprawnie.

Przeanalizujmy co się dzieje w momencie pobrania danego feeda:
1) Wywoływana jest funkcja zwrotna countPosts():
[code]
function countPosts(json) {
 counter[counterIndex] = json.feed.openSearch$totalResults.$t; //a
 var sLabel = counterNames[counterIndex]; // b
 var pIndex = parseInt(subcategories[sLabel][1]); // c // parent index
 var pLabel = getCatLabel(pIndex); // parent label // d
 categories[pLabel][1] = categories[pLabel][1] + parseInt(counter[counterIndex]); // e
 counterIndex++; //f
}[/code]

a) zmienna counterIndex to index naszej tablicy z naszymi etykietami.
Rozpoczynamy od 0, a w każdym kolejnym wywołaniu tej funkcji wartość jest inkrementowana o 1 (punkt 'f')
Indeks odpowiada indeksowi tablicy z kategoriami, a więc w tym przypadku:

  • counter[0] - PHP_podstawy
  • counter[1] - PHP_zaawansowane
  • counter[2] - PHP_OOP
  • [...]

Dlatego ważne jest wywołanie feedów w odpowiedniej kolejności, tak jak etykiety występują w tablicy.

b) Do zmiennej sLabel pobierana jest nazwa (nazwa, nie pełny tutuł) etykiety podkategorii o indeksie counterIndex.
Nazwy są przechowywane w odwróconej tablicy counterNames[]:
np.
[code]subcategories['API_Facebook'] = new Array(33, 7, 'Facebook API');[/code]
po odwróceniu:
[code]counterNames[33] = 'API_Facebook';[/code]

c) do zmiennej pIndex pobierany jest index rodzica podkategorii, a więc indeks kategorii nadrzędnej.
Indeks rodzica podawaliśmy w tablicy:
[code]subcategories['API_Facebook'] = new Array(33, 7, 'Facebook API');[/code]
gdzie drugi element tablicy, czyli - 7, to indeks kategorii nadrzędnej, w tym przypadku:
[code]categories['API'] = new Array('API', 0); //7[/code]

d) do zmiennej pLabel pobierana jest nazwa etykiety kategorii nadrzędnej, za pomocą funkcji getCatLabel():
[code]
function getCatLabel(catIndex)
{
 var cIndex = 0;
   for(cKey in categories)
   {
    if(catIndex == cIndex) return cKey;
    cIndex ++;
   }
}[/code]

Powyższa funkcja pobierze nam z tablicy categories nazwę klucza, który jest wartością nazwy etykiety, tutaj categories[7] = 'API'

e) Na koniec:
 [code]categories[pLabel][1] = categories[pLabel][1] + parseInt(counter[counterIndex]);[/code]
 do tablicy kategorii dodajemy liczbę postów z obecnie badanej podkategorii

Pobranie ilości postów za pomocą feeda

Musimy teraz pobrać ilość postów w danych kategoriach/etykietach za pomocą generowanego przez silnik Bloggera feeda. Zrobimy to tak:
[code]
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_podstawy?alt=json-in-script&callback=countPosts">//0</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_zaawansowane?alt=json-in-script&callback=countPosts">//1</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_OOP?alt=json-in-script&callback=countPosts">//2</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PDO?alt=json-in-script&callback=countPosts">//3</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_wyrazenia_regularne?alt=json-in-script&callback=countPosts">//4</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_bezpieczenstwo?alt=json-in-script&callback=countPosts">//5</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Smarty?alt=json-in-script&callback=countPosts">//6</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/ZendFramework?alt=json-in-script&callback=countPosts">//7</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Symfony2?alt=json-in-script&callback=countPosts">//8</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Composer?alt=json-in-script&callback=countPosts">//9</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Propel?alt=json-in-script&callback=countPosts">//10</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Doctrine?alt=json-in-script&callback=countPosts">//11</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/cURL?alt=json-in-script&callback=countPosts">//12</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/GD2?alt=json-in-script&callback=countPosts">//13</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_wzorce_projektowe?alt=json-in-script&callback=countPosts">//14</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/PHP_pozostale?alt=json-in-script&callback=countPosts">//15</script>

<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/HTML5?alt=json-in-script&callback=countPosts">//16</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/CSS3?alt=json-in-script&callback=countPosts">//17</script>

<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/jQuery?alt=json-in-script&callback=countPosts">//18</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Prototype?alt=json-in-script&callback=countPosts">//19</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/AJAX?alt=json-in-script&callback=countPosts">//20</script>

<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Konfiguracja?alt=json-in-script&callback=countPosts">//21</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/APACHE2_htaccess?alt=json-in-script&callback=countPosts">//22</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/APACHE2_rewrite?alt=json-in-script&callback=countPosts">//23</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/APACHE2_vhosts?alt=json-in-script&callback=countPosts">//24</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/APACHE2_auth?alt=json-in-script&callback=countPosts">//25</script>

<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/MySQL?alt=json-in-script&callback=countPosts">//26</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/SQL_zaawansowane?alt=json-in-script&callback=countPosts">//27</script>

<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/XML?alt=json-in-script&callback=countPosts">//28</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/JSON?alt=json-in-script&callback=countPosts">//29</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/SOAP?alt=json-in-script&callback=countPosts">//30</script>

<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/GIT?alt=json-in-script&callback=countPosts">//31</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/SVN?alt=json-in-script&callback=countPosts">//32</script>

<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/API_Facebook?alt=json-in-script&callback=countPosts">//33</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/API_Google?alt=json-in-script&callback=countPosts">//34</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/API_Allegro?alt=json-in-script&callback=countPosts">//35</script>

<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/Blogger?alt=json-in-script&callback=countPosts">//36</script>

<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/OTHER?alt=json-in-script&callback=countPosts">//37</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/QUICKTIPS?alt=json-in-script&callback=countPosts">//38</script>
<script src="http://phpmajster.blogspot.com/feeds/posts/summary/-/QUICKLINKS?alt=json-in-script&callback=countPosts">//39</script>[/code]

Po pobraniu wszystkich feedów mamy już informacje o ilości postów w kategoriach i podkategoriach.

Liczbę postów w kategoriach zapisaną mamy w tablicy:
[code]categories['NAZWA_ETYKIETY'] = new Array('TYTUŁ_ETYKIETY', ŁĄCZNIE POSTÓW); //7[/code]

Liczbę postów w podkategoriach w tablicy:
[code]counter[INDEX_ETYKIETY];[/code]

gdzie INDEX_ETYKIETY = liczba porządkowa w tablicy, liczona od 0, np. subcategories['HTML5'] posiada INDEX = 16.
Dla poglądu wartości indexu dla danej etykiety podane są powyzej w komentarzu przez znacznikiem </script>.

Następna funkcja - addActive() dopisuje do znacznika <ul> w menu klasę wyróżniającą aktywny element. Jako parametr przyjmuje NAZWĘ_ETYKIETY, następnie porównuje, czy zmienna globalna actualLabel równa się obecnie wyświetlanej.
[code]
function addActive(labelId)
{
 var activeClass = 'active';
 var actuaLabel = 'PHP';

 if(labelId == actualLabel)
 {
  document.write(' class=' + activeClass);
 }
}[/code]

Dodatkowe funkcje

Poniżej deklaracje funkcji, które pomogą nam w pracy, w większości są to odpowiedniki tych samych funkcji dostępnych w PHP:

Rozbudowa funkcji replace() - za parametry przyjmuje tablicę:
[code]
String.prototype.replaceArray = function(find, replace) {
  var replaceString = this;
  for (var i = 0; i < find.length; i++) {
    replaceString = replaceString.replace(find[i], replace[i]);
  }
  return replaceString;
};[/code]

Rozbudowa funkcji replace() - za parametry przyjmuje tablicę - wersja oparta na wyrażeniach regularnych:
[code]
String.prototype.replaceArrayReg = function(find, replace) {
  var replaceString = this;
  var regex;
  for (var i = 0; i < find.length; i++) {
    regex = new RegExp(find[i]);
    replaceString = replaceString.replace(regex, replace[i]);
  }
  return replaceString;
};[/code]

Rozbudowa funkcji replace() - za parametry przyjmuje tablicę:
[code]
String.prototype.replaceAll = function( token, newToken, ignoreCase ) {
    var _token;
    var str = this + "";
    var i = -1;

    if ( typeof token === "string" ) {

        if ( ignoreCase ) {

            _token = token.toLowerCase();

            while( (
                i = str.toLowerCase().indexOf(
                    token, i >= 0 ? i + newToken.length : 0
                ) ) !== -1
            ) {
                str = str.substring( 0, i ) +
                    newToken +
                    str.substring( i + token.length );
            }

        } else {
            return this.split( token ).join( newToken );
        }

    }
 return str;
};[/code]

Poniższa funkcja usuwa tagi HTML z ciągu:
[code]
function strip_tags(input, allowed) {
  allowed = (((allowed || '') + '')
    .toLowerCase()
    .match(/<[a-z][a-z0-9]*>/g) || [])
    .join('');
  var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>/gi,
    commentsAndPhpTags = /<!--[\s\S]*?-->|<\?(?:php)?[\s\S]*?\?>/gi;
  return input.replace(commentsAndPhpTags, '')
    .replace(tags, function($0, $1) {
      return allowed.indexOf('<' + $1.toLowerCase() + '>') > -1 ? $0 : '';
    });
}[/code]

Poniższa funkcja zamienia znaczniki <br /> na znak nowej linii \r:
[code]
function br2nl(t) {
 return t.replace(/<br \/>/g, "\r");
}[/code]

Poniższa funkcja zwracająca losową liczbę INT z przedziału <min, max>:
[code]
function getRandomArbitary (min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}[/code]

Poniższa funkcja sprawdza, czy dany ciąg (needle) jest częścią innego ciągu (haystack):
[code]
function strstr(haystack, needle, bool) {
    var pos = 0;
    haystack += "";
    pos = haystack.indexOf(needle); if (pos == -1) {
        return false;
    } else {
        if (bool) {
            return haystack.substr(0, pos);
        } else {
            return haystack.slice(pos);
        }
    }
}[/code]

poniedziałek, 18 maja 2015

[UPGRADE][Blogger] Podstawy rozbudowy Bloggera

TRUE
1644964982246149070
Blogger jak wiadomo nie oferuje dostępu do kodu uruchamianego po stronie serwera, co jest zresztą logiczne, lecz tym samym blokuje nam to możliwość jego rozbudowy jeśli chodzi o nowe funkcjonalności. Mamy za to jednak dostęp do trzech elementów, które nam na jako takie modyfikacje kodu pozwolą. Pierwszym z elementów jest kod samego szablonu, który możemy według własnych potrzeb dowolnie modyfikować, drugim jest dostęp do kanałów RSS generowanych przez Blogggera, z których to kanałów możemy pobierać dane w formacie JSON, trzecim natomiast jest widźet o nazwie HTML/Javascript. Zestawienie tych trzech możliwości pozwoli nam na co nieco zabawy z upgradem Bloggera. Na początek jednak przeprowadzić będziemy musieli kilka modyfikacji.

jQuery

1) Do bloga dołączyć musimy bibliotekę jQuery, o ile oczywiście jeszcze jej nie dołączyliśmy.
Wchodzimy w panelu w Szablon --> Edytuj kod HTML i otwieramy okno wyszukiwania CTRL - F.

Wpisujemy frazę:
[code]</head>[/code]
następnie zaraz przed </head> wklejamy poniższy kod:
[code]<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js' />[/code]
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji