<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MGdevelop &#187; CMSy</title>
	<atom:link href="http://mgdevelop.pl/index.php/kategoria/cmsy/feed/" rel="self" type="application/rss+xml" />
	<link>http://mgdevelop.pl</link>
	<description>Programming is an art form that fights back</description>
	<lastBuildDate>Thu, 07 Jul 2011 16:59:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Dodawanie tagów do MediaWiki</title>
		<link>http://mgdevelop.pl/index.php/2010/09/dodawanie-tagow-do-mediawiki/</link>
		<comments>http://mgdevelop.pl/index.php/2010/09/dodawanie-tagow-do-mediawiki/#comments</comments>
		<pubDate>Tue, 28 Sep 2010 14:48:47 +0000</pubDate>
		<dc:creator>Elektryk</dc:creator>
				<category><![CDATA[MediaWiki]]></category>
		<category><![CDATA[parser]]></category>
		<category><![CDATA[rozszerzenie]]></category>
		<category><![CDATA[tag]]></category>
		<category><![CDATA[usability]]></category>

		<guid isPermaLink="false">http://mgdevelop.pl/?p=507</guid>
		<description><![CDATA[Jeśli posiadamy własną encyklopedię na silniku MediaWiki to zapewne chcemy aby naszym redaktorom pisanie stron sprawiało jak najmniej problemów ale... <a href="http://mgdevelop.pl/index.php/2010/09/dodawanie-tagow-do-mediawiki/">Czytaj dalej&#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Jeśli posiadamy własną encyklopedię na silniku MediaWiki to zapewne chcemy aby naszym redaktorom pisanie stron sprawiało jak najmniej problemów ale jednocześnie aby tworzona przez nas wiki wyglądała jak najładniej. Pchanie htmla w kod stron mija się z celem. Szablony? Sprawdzą się. Ale co jeśli chcemy dać więcej możliwości edytującym np. automatyczne generowanie obrazka? Składnia MW na to nie pozwala ale PHP już tak. Musimy wiec dodać własne tagi do składni wiki za pomocą rozszerzenia!</p>
<p><span id="more-507"></span></p>
<h1>Przygotowanie</h1>
<p>Na początek ustalmy jaki mamy cel w naszej pracy. W tym poradniku chciałbym pokazać jak dodać tag &lt;ramka&gt; który pozwoli na szybkie tworzenie rameczek z obrazkowym tłem i treścią w środku. Jako tło będzie można ustawić dowolną grafikę spośród zuploadowanych na serwer wpisując jej nazwę jako wartość atrybutu <em>grafika</em>.</p>
<p>Teraz czas na napisanie rozszerzenia. Zaczniemy od stworzenia pliku z rozszerzeniem php. Musimy ten plik umieścić w folderze extensions naszej instalacji MW. U mnie będzie to <em>extensions/nowetagi.php</em>. Tak przygotowany plik musimy podpiąć do skryptu. W tym celu otwieramy plik LocalSettings i mniej więcej po środku dopisujemy linijkę:</p>
<pre class="brush: php">require_once("extensions/nowetagi.php");</pre>
<h1>Włączanie parsowania</h1>
<p>Kolejnym krokiem w naszej pracy będzie otwarcie pliku <em>nowetagi.php</em> i dodanie odpowiedniego zdarzenia wewnątrz znaczników php:</p>
<pre class="brush: php">$wgHooks['ParserFirstCallInit'][] = 'mojParser';</pre>
<p>Powyższa linijka spowoduje, że w momencie jak MediaWiki będzie parsował artykuł to wywoła funkcję mojParser by dowiedzieć się jak parsować tagi obsługiwane przez nasze rozszerzenie. Poniżej tej linijki umieszczamy ciało wspomnianej funkcji:</p>
<pre class="brush: php">function mojParser( &amp;$parser ) {
   $parser-&gt;setHook( 'ramka', 'parsowanieRamka');
   return true;
}</pre>
<p>W podanym przykładzie poinformowaliśmy parser, że tag &lt;ramka&gt; ma być obsługiwany za pomocą funkcji <em>parsowanieRamka()</em>. W obrębie jednej funkcji mojParser możemy dodać nielimitowaną liczbę nowych tagów. Ważne jest tylko aby na końcu zwrócić <em>true</em>.</p>
<h1>Funkcja parsująca</h1>
<p>Teraz zdefiniujmy funkcję <em>parsowanieRamka().</em></p>
<pre class="brush: php">function parsowanieRamka( $input, $args, $parser, $frame ) {
}</pre>
<p>Póki co ciało funkcji jest puste. Musimy bowiem najpierw wyjaśnić co zawierają przekazane argumenty. Jak wiadomo tagi dzielą się na dwuelementowe (&lt;ramka&gt;&lt;/ramka&gt;) i jednoelementowe (&lt;cytat /&gt;). Jeśli parsowany tag składa się z otwarcia i zamknięcia to zmienna $input będzie zawierała to co znajduje się pomiędzy czyli inaczej mówiąc zawartość tagu. Zmienna $args jest zaś tablicą o indeksach identycznych jak atrybuty parsowanego tagu i z wartościami równymi wartościom tych atrybutów. Dla przykładu tag <em>&lt;ramka grafika=&#8221;tlo.jpg&#8221;&gt;Dowolny tekst&lt;/ramka&gt;</em> zostanie podzielony na zmienną <em>$input</em> o wartości <em>Dowolny tekst</em> oraz na jednoelementową tablicę <em>$args</em> gdzie $args['grafika']=&#8217;tlo.jpg&#8217;. Pozostałe argumenty przekazane funkcji <em>parsowanieRamka()</em> nie są dla nas istotne.</p>
<p>Uzbrojeni w powyższą wiedzę możemy zacząć pisać skrypt który zwróci kod html w miejsce tagu w artykule. Musimy jeszcze tylko pobrać adres URL do grafiki której nazwa została przekazana w atrybucie <em>grafika</em>.</p>
<pre class="brush: php">if(!empty($args['grafika'])){
   $file = wfFindFile($args['grafika']);
   $url = $file-&gt;getFullUrl();
}</pre>
<p>Powyższa instrukcja sprawi, że jeśli zdefiniowano wartość atrybutu grafika to zmienna $url będzie przechowywała bezwzględny adres do tego pliku. Możemy ją teraz użyć przy generowaniu pierwszej części kodu wynikowegoi ustawić obrazek jako tło bloku:</p>
<pre class="brush: php">$output = '&lt;div class="ramka" style="background-image: url('.$url.');"&gt;';</pre>
<p>Teraz trzeba dołączyć do tego treść spomiędzy znaczników. Ale tu należy pamiętać o jednej rzeczy, że tam również może zostać użyta składania wiki i inne tagi. Dlatego też zmienną $input należy jeszcze raz przepuścić przez parser za pomocą specjalnej funkcji:</p>
<pre class="brush: php">$output .= $parser-&gt;recursiveTagParse( $input, $frame );</pre>
<p>Argumentami tej funkcji jest treść do ponownego sparsowania oraz zmienna <em>$frame</em> którą otrzymaliśmy wcześniej jako czwarty argument funkcji <em>parsowanieRamka</em>. Gdy to już mamy możemy zamknąć blok i zwrócić gotowy kod html:</p>
<pre class="brush: php">$output .= '&lt;/div&gt;';
return $output;</pre>
<p>Pełny kod naszego rozszerzenia wygląda tak:</p>
<pre class="brush: php">&lt;?php
$wgHooks['ParserFirstCallInit'][] = 'mojParser';

function mojParser( &amp;$parser ) {
   $parser-&gt;setHook( 'ramka', 'parsowanieRamka');
   return true;
}

function parsowanieRamka( $input, $args, $parser, $frame ) {
   if(!empty($args['grafika'])){
      $file = wfFindFile($args['grafika']);
      $url = $file-&gt;getFullUrl();
   }
   $output = '&lt;div class="ramka" style="background-image: url('.$url.');"&gt;';
   $output .= $parser-&gt;recursiveTagParse( $input, $frame );
   $output .= '&lt;/div&gt;';
   return $output;
}
?&gt;</pre>
<h1>Nieco więcej o parsowaniu</h1>
<p>W powyższym przykładowym rozszerzeniu użyliśmy funkcji $parser-&gt;recursiveTagParse();. Jak już pisałem służy ona do tego by sparsować składnię wiki i dodatkowe tagi wewnątrz jakiegoś tekstu. Należy jednak pamiętać, że nie zostaną wtedy podmienione podpisy (~~~~). Tym zajmuję się tzw parser wstępny ale on także w tym wypadku nam nie pomoże. Jest to związane z tym, że tekst wewnątrz tagów dodawanych przez rozszerzenia jest parsowany przy każdym wyświetleniu strony na nowo a w bazie danych ląduje niezmieniony. Z tego też powodu własne tagi nie sprawdzą się w miejscach gdzie użytkownicy będą się podpisywać za pomoca 4 tyld.</p>
<p>Inną sprawą jest to, że należy uważać by nie parsować znaczników html które nie działają na stronach MediaWiki. Np. próba sparsowania tekstu <em>&lt;img src=&#8221;adres.png&#8221;&gt; </em>spowoduje, że ten kod pojawi się na stronie w formie tekstu a nie obrazka. Można jednak bezpiecznie parsować kod obrazka zapisany w wikiskładni tzn <em>[[Grafika:Plik.png]]</em>. Identyczna sytuacja zachodzi przy odnośnikach. Dlatego należy uważać by nie wrzucać do parsera przypadkowego kodu html a jedynie parsować to co można.</p>
<h1>Inny przykład: tag &lt;cytat&gt;</h1>
<p>Na koniec zamieszczę jeszcze jeden kod parsowania tagu. Jego składnia wygląda tak:<em> &lt;cytat autor=&#8221;Imię Nazwisko&#8221;&gt;&lt;/cytat&gt;</em> a skrypt który go parsuje przedstawia się następująco:</p>
<pre class="brush: php">function parsowanieCytat($input, $args, $parser, $frame ) {
   $output = '&lt;blockquote&gt;'.$input.'&lt;div&gt;'.$args['autor'].'&lt;/div&gt;&lt;/blockquote&gt;&lt;br style="clear: left;" /&gt;';
   return $parser-&gt;recursiveTagParse( $output, $frame );
}</pre>
<p>Do tego dochodzi jeszcze krótki kod CSS:</p>
<pre class="brush: css">blockquote{
  padding-left: 50px;
  background: url('quote.png') left 5px no-repeat;
  margin: 0px 20px 10px 0px;
  font-family: Georgia;
  font-style: italic;
  min-height: 27px;
  float: left;
  color: #333;
  max-width: 500px;
}
blockquote div{
  text-align: right;
  color: #666;
  font-style: normal;
  font-size: 10px;
  font-family: Arial;
  margin-right: 10px;
}</pre>
<p>Całość w akcji można zobaczyć na górze<a title="Dodatkowy tag Cytat w akcji" href="http://borealis.net.pl/index.php/Zombine"> tej strony</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgdevelop.pl/index.php/2010/09/dodawanie-tagow-do-mediawiki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WPEngine &#8211; hosting stworzony pod WordPressa</title>
		<link>http://mgdevelop.pl/index.php/2010/07/wpengine-hosting-stworzony-pod-wordpressa/</link>
		<comments>http://mgdevelop.pl/index.php/2010/07/wpengine-hosting-stworzony-pod-wordpressa/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 10:05:26 +0000</pubDate>
		<dc:creator>Elektryk</dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Wydarzenia]]></category>
		<category><![CDATA[hosting]]></category>
		<category><![CDATA[serwis]]></category>
		<category><![CDATA[usługa]]></category>
		<category><![CDATA[WPEngine]]></category>

		<guid isPermaLink="false">http://mgdevelop.pl/?p=463</guid>
		<description><![CDATA[W chwili obecnej istnieją dwie możliwości tworzenia serwisu na systemie WordPress. Pierwsza to założenie strony w serwisie WordPress.com. Otrzymujemy tam... <a href="http://mgdevelop.pl/index.php/2010/07/wpengine-hosting-stworzony-pod-wordpressa/">Czytaj dalej&#187;</a>]]></description>
			<content:encoded><![CDATA[<p>W chwili obecnej istnieją dwie możliwości tworzenia serwisu na systemie WordPress. Pierwsza to założenie strony w serwisie WordPress.com. Otrzymujemy tam gotową instalację, nie musimy się martwić o transfer ani o odpowiednią konfigurację. Wadą tego rozwiązania jest jednak to, że nie możemy instalować własnych wtyczek i motywów bez dodatkowych opłat. Alternatywą jest własna instalacja WP na opłaconym serwerze. Tu jednak musimy zmierzyć się z ręcznym dostosowaniem skryptu oraz wydajnością całego systemu. Niedługo jednak do tych dwóch opcji dołączy trzecia możliwość.<span id="more-463"></span></p>
<h1>WPEngine &#8211; o co chodzi?</h1>
<p>Opisywana <a title="WPEngine" href="http://wpengine.com">platforma WPEngine</a> ma być połączeniem zalet obecnych dwóch rozwiązań. Za dosyć wysoką cenę 50$ miesięcznie otrzymamy możliwość utworzenia swojego serwisu internetowego z użyciem WordPressa na hostingu idealnie zoptymalizowanym pod tą platformę. Autorzy pomysłu kusza nas  ogromną galerią gotowych wtyczek i skórek. Co więcej możemy także instalować własne rozszerzenia i motywy. Ponadto oto by nasza strona nie padła w okresie wzmożonego ruchu będą dbać odpowiednie narzędzia odpowiedzialne za cachowanie treści, minimalizowanie plików oraz kompresję grafik. Zaś developerzy będą mieli pełny dostęp do logów serwera PHP.</p>
<h1>&#8222;It&#8217;s safer here&#8221;</h1>
<p><a title="WPEngine" href="http://wpengine.com">Platforma WPEngine</a> w przeciwieństwie do typowych hostingów będzie dbało o to czy wszystkie pliki mają dobrze nadane prawa dostępu. Dzięki temu nie ma  możliwości, że przez źle ustawione chmody ktoś usunie nam zdalnie plik. Ponadto będzie można uruchamiać wszystkie wtyczki i skórki w trybie piaskownicy. To znaczy, że możemy sprawdzić działania nowego składnika na swoim blogu ale internauci nie zobaczą od razu efektów tych eksperymentów. Dopiero gdy stwierdzimy, że wszystko działa prawidłowo będziemy mogli zatwierdzić zmiany i oddać nowe funkcjonalności w ręce użytkowników. Taki sposób pracy chroni nas przed uszkodzeniem instalacji WP przez złośliwą wtyczkę. Co więcej wszystkie konta na serwerze są od siebie odseparowane przez co nie ma możliwości ataku na nasz serwis przez innego klienta WPEngine.</p>
<h1>Gdzie to można dostać?</h1>
<p>Aktualnie aby móc skorzystać z platformy trzeba <a href="http://wpengine.com/waiting-list/">otrzymać zaproszenie</a>. Na pełne otwarcie usługi przyjdzie nam pewnie jeszcze poczekać. Niemniej już teraz wydaje się, że będzie to doskonałe rozwiązanie dla wszelkich stron firmowych i dużych blogów. Jak to wyjdzie w praniu to się okaże. W każdej chwili można opuścić szeregi klientów WPEngine ale przenoszenie swojego istniejącego serwisu to i tak poważny krok.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgdevelop.pl/index.php/2010/07/wpengine-hosting-stworzony-pod-wordpressa/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Baner z ilością artykułów w MediaWiki</title>
		<link>http://mgdevelop.pl/index.php/2010/07/baner-z-iloscia-artykulow-w-mediawiki/</link>
		<comments>http://mgdevelop.pl/index.php/2010/07/baner-z-iloscia-artykulow-w-mediawiki/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 15:59:49 +0000</pubDate>
		<dc:creator>Elektryk</dc:creator>
				<category><![CDATA[MediaWiki]]></category>
		<category><![CDATA[artykuły]]></category>
		<category><![CDATA[baza danych]]></category>
		<category><![CDATA[php GD]]></category>
		<category><![CDATA[reklama]]></category>

		<guid isPermaLink="false">http://mgdevelop.pl/?p=431</guid>
		<description><![CDATA[O świetności danej encyklopedii internetowej świadczy ilość i jakość znajdujących się tam artykułów. Dlatego nie ma powodu by wstydzić się... <a href="http://mgdevelop.pl/index.php/2010/07/baner-z-iloscia-artykulow-w-mediawiki/">Czytaj dalej&#187;</a>]]></description>
			<content:encoded><![CDATA[<p>O świetności danej encyklopedii internetowej świadczy ilość i jakość znajdujących się tam artykułów. Dlatego nie ma powodu by wstydzić się numerka reprezentującego ile jest stron w naszej wiki. Przeciwnie! Należy się z tym obnosić. A jeszcze lepiej jak robią to nasi użytkownicy. Dlatego w tym poradniku nauczymy się tworzyć dynamiczny obrazkowy banerek, na którym będzie wypisana ilość artykułów na naszej stronie w MediaWiki.</p>
<h1><span id="more-431"></span>Nasze miejsce pracy</h1>
<p>Dla naszych banerków najlepiej przygotować osobny folder. W nim umieśćmy obrazek który będzie podstawą naszego dzieła. Ja dla banerka mojej encyklopedii o grach firmy Valve  przygotowałem coś takiego:</p>
<p><a href="http://mgdevelop.pl/mgdevelop/wp-content/uploads/2010/07/dynamicsignature1.png"><img class="alignnone size-full wp-image-434" title="dynamicsignature1" src="http://mgdevelop.pl/mgdevelop/wp-content/uploads/2010/07/dynamicsignature1.png" alt="" width="468" height="60" /></a></p>
<p>Plan jest taki aby pod tytułem strony znajdował się napis <em>n artykuły(ów) o grach Valve</em> gdzie n jest oczywiście liczbą stron. Przed napisaniem tego skryptu musimy jednak zadbać jeszcze o jedną rzecz. Nasz baner będzie generowany w PHP przy każdym zapytaniu. Link do naszego obrazka nie może być jednak linkiem do pliku php, gdyż wtedy nie będzie się wyświetlał w podpisach na forach internetowych. Musimy skorzystać z możliwości jakie daje nam plik <em>.htaccess. </em>Po utworzeniu go w folderze z naszym banerem umieszczaniu w nim poniższy kod:</p>
<pre class="brush:shell">RewriteEngine On
RewriteRule ^baner.png$ generator.php [L]</pre>
<p>Ta instrukcja spowoduje, że chociaż adres będzie prowadził do pliku baner.png to serwer będzie zwracał treść z pliku generator.php.</p>
<h1>Generowanie obrazka</h1>
<p>Teraz możemy przystąpić do pisania skryptu PHP. Tworzymy więc nasz plik generator.php i na samym jego początku łączymy się z bazą naszej wiki</p>
<pre class="brush:php">$serverdb='localhost'; //adres serwera bazy danych
$dbuser='user'; //uzytkownik bazy danych
$dbuserpass='password'; //haslo uzytkownika
$db='database'; //nazwa bazy danych

$link = mysql_connect ($serverdb, $dbuser, $dbuserpass)
   or die (mysql_error());
mysql_select_db ($db);</pre>
<p>Gdy jesteśmy już połączeni z bazą możemy pobrać informacje o ilości artykułów. Wyciągniemy ta informację ze specjalnych tabel gdzie są przechowywane tego typu statystyki.</p>
<pre class="brush: js">$uchwyt = mysql_query ('SELECT ss_good_articles from wiki_site_stats');
$rekord = mysql_fetch_array($uchwyt);
$ilosc = $rekord['ss_good_articles'];</pre>
<p>Teraz, gdy ilość artykułów mamy już w w zmiennej <em>$ilosc</em> możemy napisać część kodu, która odmieni wyraz <em>artykuły</em> na potrzeby naszego napisu i złoży cały tekst w całość.</p>
<pre class="brush: js">$jednostki = substr($ilosc, strlen($ilosc)-1, 1);
if($jednostki == 2 || $jednostki == 3 || $jednostki == 4) $art = 'arykuły';
   else $art = 'arykułów';
$tekst = "$ilosc $art o grach Valve";</pre>
<p>Gdy to już mamy gotowe nic nie stoi na przeszkodzie by rozpocząć generowanie grafiki.</p>
<pre class="brush: js">$image = imagecreatefrompng("baner.png");
$black = imagecolorallocate($image, 0, 0, 0);
imagettftext($image, 10, 0, 250, 45, $black, 'calibri.ttf', $tekst);</pre>
<p>Podany kod kolejno wczytuje obrazek <em>baner.png</em>, tworzy indeks koloru czarnego i na końcu nakłada tekst na załadowaną grafikę. Użyta przy ostatniej operacji funkcja imagettftext przyjmuje kolejno jako argumenty zmienną z obrazkiem, rozmiar czcionki, pochylenie fontu w stopniach, współrzędne umieszczenia napisu, link do pliku z czcionką oraz na końcu treść napisu. W tym przykładzie użyliśmy czcionki <em>calibri.ttf, </em>której plik należy również umieścić w folderze z banerem.</p>
<h1>W stronę przeglądarki</h1>
<p>Aktualnie w zmiennej <em>$image</em> przechowujemy gotowy obrazek. Przed jego wyświetleniem musimy jednak zamienić co najmniej jedną informację w nagłówku wysyłanym do przeglądarki. Wersja minimalistyczna kodu odpowiedzialnego za wyświetlanie baneru wygląda tak:</p>
<pre class="brush: js">header("Content-type: image/jpeg");
imagejpeg($image);</pre>
<p>W tym przypadku informujemy tylko, że przesyłana treść jest grafiką, a nie tekstem jak wskazywałoby jego pochodzenie z pliku .php. Później przesyłamy sam obrazek. Jeśli zaś chcemy aby informacje wyświetlane na banerze były zawsze aktualne, musimy wymusić na przeglądarce by za każdym razem na nowo go pobierała z serwera. Użyjemy do tego tricku polegającego na wyłączeniu cachowania grafiki oraz ustawieniu przeszłej daty wygaśnięcia jej ważności.</p>
<pre class="brush: js">header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Content-type: image/jpeg");
imagejpeg($image);</pre>
<h1>Podsumowanie</h1>
<p>Oto gotowy efekt nasze pracy:</p>
<p><a href="http://www.borealis.x-12.pl"><img class=" alignnone" title="Baner Borealis" src="http://borealis.net.pl/dynamic/combine/baner.png" alt="Baner Borealis" /></a></p>
<p>Fajnie wygląda i co najważniejsze spełnia swoje zadania. Należy jednak pamiętać by nie nadużywać opcji wyłączania cachowania przy dużych serwisach by nie obciążyć bazy danych. A przy naprawdę dużych encyklopediach internetowych zalecane jest napisanie skryptu cachującego liczbę artykułów.</p>
<p>Na koniec załączam <a title="Pliki baneru" href="http://mgdevelop.pl/mgdevelop/wp-content/uploads/2010/07/banermediawiki.zip">paczkę z wszystkimi plikami powyższego baneru</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgdevelop.pl/index.php/2010/07/baner-z-iloscia-artykulow-w-mediawiki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dołączanie skryptów JS do WordPressa</title>
		<link>http://mgdevelop.pl/index.php/2010/07/dolaczanie-skryptow-js-do-wordpressa/</link>
		<comments>http://mgdevelop.pl/index.php/2010/07/dolaczanie-skryptow-js-do-wordpressa/#comments</comments>
		<pubDate>Mon, 19 Jul 2010 14:07:35 +0000</pubDate>
		<dc:creator>Elektryk</dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[plik]]></category>
		<category><![CDATA[rotator]]></category>
		<category><![CDATA[skrypt]]></category>
		<category><![CDATA[wp_head()]]></category>

		<guid isPermaLink="false">http://mgdevelop.pl/?p=409</guid>
		<description><![CDATA[Tworząc skórkę do WordPressa warto wzbogacić ją o ciekawe efekty. Najłatwiej osiągnąć je za pomocą skryptów JavaScript np. tworząc rotator... <a href="http://mgdevelop.pl/index.php/2010/07/dolaczanie-skryptow-js-do-wordpressa/">Czytaj dalej&#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Tworząc skórkę do WordPressa warto wzbogacić ją o ciekawe efekty. Najłatwiej osiągnąć je za pomocą skryptów JavaScript np. tworząc rotator zdjęć przy użyciu <a title="Strona Tiny Carousel" href="http://www.baijs.nl/tinycarousel/">Tiny Carousel</a>. Może się jednak zrodzić pytanie czy można tak wprost dołączać własne skrypty do WP? Zwłaszcza, że np. wyżej wymieniony rotator wymaga biblioteki jQuery która jest często, choć nie zawsze automatycznie dołączana przez WordPressa. W tym poradniku wyjaśnimy tą kwestię.<span id="more-409"></span></p>
<h1>Podstawy dołączania skryptów</h1>
<p>Aby dołączyć zewnętrzny skrypt do naszego WP musimy w w skórce naszej witryny odszukać intrukcję <em>wp_head()</em>. Najczęściej można ją odnaleźć w pliku <em>header.php</em>. Tuż przed nią trzeba dopisać dwie funkcję: pierwszą która zarejestruje nowy skrypt, drugą która go dołączy do strony. Schamtycznie wygląda to tak:</p>
<pre class="brush: php">wp_register_script($nazwa, $sciezka, $biblioteki, $wersja);
wp_enqueue_script($nazwa);
wp_head();</pre>
<p>Teraz wyjaśnię pokrótce co należy wstawiać w miejsce kolejnych zmiennych. $nazwa to wewnętrzna nazwa dołączanego skryptu. Nie ma znaczenia co tam wpiszemy. Ważne tylko by w obu miejscach, przy rejestracji i dołączaniu skryptu, wpisany wyraz był taki sam. $sciezka to jak łatwo się domyślić adres do pliku z naszym kodem. Można tu wykorzystać funkcję <em><a title="o get_bloginfo() w codexie WP" href="http://codex.wordpress.org/Function_Reference/get_bloginfo">get_bloginfo()</a></em> aby WP sam wstawił aktualny adres strony lub ścieżkę do folderu z skórką. <em>$biblioteki</em> to parametr który musi być tablicą zawierającą listę bibliotek wykorzystywanych przez nasz kod. Dzięki temu WordPress kontroluje kiedy i jakie skrypty są podpinane do strony i nigdy nie zdarzy się, że np. jQuery będzie ładowane dwa razy. Listę dostępnych bibliotek i ich nazw kodowych można sprawdzić <a title="lista bibliotek dostępnych w WP" href="http://codex.wordpress.org/Function_Reference/wp_enqueue_script#Default_scripts_included_with_WordPress">tutaj</a>. Ostatni parametr to zmienna $wersja. Po każdorazowej modyfikacji skryptu musimy obowiązkowo zmienić tą liczbę by wymusić na przeglądarkach ponowne pobranie pliku zamiast korzystania z starej wersji z cachu.</p>
<p>Przykładowy pełny kod wygląda tak:</p>
<pre class="brush: php">wp_register_script('tinycarousel', get_bloginfo('template_directory') . '/js/jquery.tinycarousel.min.js', array('jquery'), '1.0' );
wp_enqueue_script('tinycarousel');</pre>
<p>W powyższym przykładzie zarejestrowaliśmy wtyczkę<em> tinycarousel</em> której plik znajduje się w folderze z skórką i która wymaga biblioteki jQuery. Następnie dołączyliśmy ją do kodu.</p>
<h1>Dołączanie warunkowe</h1>
<p>Jeśli z naszego skryptu korzystamy tylko na niektórych stronach to nie ma potrzeby dołączania plików przy każdym wyświetleniu witryny. Warto więc dopisać instrukcję warunkową która spowoduje, że nasz kod będzie dołączany jedynie na wybranych stronach. Poniższy przykłąd będzie dołączał dodatkowe pliki tylko na stronie głównej:</p>
<pre class="brush: php">if(is_home){
   wp_register_script('tinycarousel', get_bloginfo('template_directory') . '/js/jquery.tinycarousel.min.js', array('jquery'), '1.0' );
   wp_enqueue_script('tinycarousel');
}</pre>
<p>Zaś ten kod spowoduje załadowanie skryptu JS jedynie na stronie z <em>id</em> równym 29:</p>
<pre class="brush: php">if(is_page('29')){
   wp_register_script('tinycarousel', get_bloginfo('template_directory') . '/js/jquery.tinycarousel.min.js', array('jquery'), '1.0' );
   wp_enqueue_script('tinycarousel');
}</pre>
<p>Jako argument w funkcji <em>if</em> podajemy odpowiedni tag warunkowy. Więcej informacji o nich można znaleźć <a title="O tagach warunkowych w dokumentacji WP" href="http://codex.wordpress.org/Conditional_Tags">pod tym linkiem</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://mgdevelop.pl/index.php/2010/07/dolaczanie-skryptow-js-do-wordpressa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Menu nawigacyjne w motywach</title>
		<link>http://mgdevelop.pl/index.php/2010/07/obsluga-menu-nawigacyjnych/</link>
		<comments>http://mgdevelop.pl/index.php/2010/07/obsluga-menu-nawigacyjnych/#comments</comments>
		<pubDate>Fri, 02 Jul 2010 19:01:49 +0000</pubDate>
		<dc:creator>Elektryk</dc:creator>
				<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://mgdevelop.pl/?p=259</guid>
		<description><![CDATA[Wraz z wyjściem wersji 3.0 system WordPress wzbogacił się o nową opcję, możliwość tworzenia wielopoziomowych menu z dowolnych elementów: linków... <a href="http://mgdevelop.pl/index.php/2010/07/obsluga-menu-nawigacyjnych/">Czytaj dalej&#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Wraz z wyjściem wersji 3.0 system WordPress wzbogacił się o nową opcję, możliwość tworzenia wielopoziomowych menu z dowolnych elementów: linków do kategorii, stron czy odnośników zewnętrznych. Ten tutorial pokaże jak wzbogacić naszą skórkę do WordPressa o możliwość obsługi tej opcji oraz jak to wszystko dobrze skonfigurować.</p>
<p><span id="more-259"></span></p>
<h1>Rejestracja menu</h1>
<p>Zaczynamy od edycji pliku <em>functions.php </em>który znajdziemy w folderze <em>wp-content/themes/(nazwa skórki)</em>. Musimy w tym pliku zainicjować menu. Robi się to dosyć prosto. Wystarczy na jego końcu tuż przed znacznikiem ?&gt; dopisać taki krótki skrypt:</p>
<pre class="brush: php">add_action( 'init', 'rejestracja_menu' );
function rejestracja_menu(){
   register_nav_menus( array(
      'topmenu' =&gt; __('Menu górne'),
      'bocznemenu' =&gt; __('Menu główne'),
   ));
}</pre>
<p>W powyższym kodzie najpierw dodaliśmy zdarzenie polegające na wywołaniu funkcji rejestracja_menu podczas generowania strony a następnie zdefiniowaliśmy ciało tej funkcji. Użyliśmy w niej funkcji register_nav_menus() która rejestruje jedno lub więcej menu na podstawie przekazanej jej tablicy. W tablicy umieściliśmy dwa menu. Pierwsze o nazwie kodowej topmenu i drugie bocznemenu. Użytkownikowi będą się one wyświetlać kolejno jako Menu górne i Menu główne. Nazwy kodowe istnieją po to by uniknąć problematycznych polskich ogonków i białych znaków. Jeśli chcielibyśmy zdefiniować tylko jedno menu możemy także skorzystać z funkcji register_nav_menu której używa się tak:</p>
<pre class="brush: php">register_nav_menu( 'moje-menu', __( 'Menu na stronie' ) );</pre>
<h1>Umieszczanie menu w skórce</h1>
<p>Aby wyświetlić menu na stronie wstawiamy w odpowiednie miejsce w kodzie krótką instrukcję</p>
<pre class="brush: php">&lt;?php wp_nav_menu('bocznemenu'); ?&gt;</pre>
<p>Jako argument wystarczy podać nazwę kodową wcześniej zdefiniowanego menu. Chętni mogą się jednak pobawić dodatkowymi opcjami. Można np. ustawić w jaki element ma być włożone menu (domyślnie jest wewnątrz diva) oraz jaką ma mieć klasę. Poniższy kod ustawia je tak by było ono wyświetlane bez kontenera a element ul będzie miał klasę<em> mojemenu</em>. Należy pamiętać, że po dodaniu dodatkowych ustawień inaczej definiuje się które menu ma być wyświetlane w tym miejscu.</p>
<pre class="brush: php">&lt;?php wp_nav_menu( 'menu=bocznemenu&amp;container=&amp;menu_class=mojemenu' ); ?&gt;</pre>
<p>Oczywiście opcji jest o wiele, wiele więcej. Wszystkie do przejrzenia w <a title="Opis wp_nav_menu w dokumentacji WordPressa" href="http://codex.wordpress.org/Function_Reference/wp_nav_menu">dokumentacji tej funkcji</a>.</p>
<h1>Kompatybilność wsteczna</h1>
<p>Na koniec zajmijmy się problemem kompatybilności. Może się on pojawić gdy nie wiemy czy nasza skórka będzie uruchamiana także na wersjach WordPressa wcześniejszych niż 3.0 gdzie funkcje takie jak wp_nav_menu zwyczajnie nie działają. Wtedy przydałoby się by zamiast menu nawigacyjnego pojawiła się zwyczajnie lista stron w danym serwisie. Na szczęście łatwo takie coś wykonać. Wystarczy jedna instrukcja warunkowa w części odpowiedzialnej za wyświetlanie menu:</p>
<pre class="brush: php">if ( function_exists( 'wp_nav_menu' ) )
    wp_nav_menu( 'topemenu' );
else
    wp_page_menu( 'show_home=Strona główna&amp;menu_class=pagemenu' );
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://mgdevelop.pl/index.php/2010/07/obsluga-menu-nawigacyjnych/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

