SlideShare une entreprise Scribd logo
1  sur  101
Télécharger pour lire hors ligne
JSztuczkiTomasz Dziuda – JoomlaDay 2015
15
Sztuczki podstawowe
Dla początkujących
1/5 Nadpisywanie modułów
i elementów strony
By nie modyfikować core Joomla!
Widoki komponentów
Widoki komponentów
Wiadomości systemowe
Widoki komponentów
Widoki modułów
Wiadomości systemowe
Widoki komponentów
Widoki modułów
Wiadomości systemowe
Style modułów
Widoki komponentów
Widoki modułów
Wiadomości systemowe
Style modułów
Stronicowanie
2/5 Dodatkowe widoki
Formatowanie odpowiedzi serwera
https://mydomain.com/index.php?tmpl=special
https://mydomain.com/index.php?tmpl=special
special.php
w katalogu szablonu
https://mydomain.com/index.php?tmpl=special
special.php
w katalogu szablonu
Uwaga! Niektóre rozszerzenia, takie jakAdmin Tools mogą blokować niestandardowe
wywołania parametru tmpl. Należy wtedy taką wartość dodać do listy dozwolonych wywołań.
3/5 Ograniczone wyszukiwanie
Gdy potrzebujemy większej elastyki wyszukiwarki
com_finder i filtry wyszukiwania
com_finder i filtry wyszukiwania
com_finder i filtry wyszukiwania
com_finder i filtry wyszukiwania
com_finder i filtry wyszukiwania
4/5 Nadpisywanie fraz
językowych
Bez dotykania plików
1
1
2
1
1
2
1
1
2
1
2
3
5/5 Złożona składnia tytułów
wpisów i modułów
Bo czasem nie wystarczy zwykły tekst…
Podział na linie i wyróżnianie słów
Lorem[br]ipsum[br]dolor
Lorem __ipsum__ dolor
Lorem **ipsum** dolor
$title = str_replace('[br]', '<br />', $module->title);
Podział na linie i wyróżnianie słów
$title = str_replace('[br]', '<br />', $module->title);
$title = preg_replace('/__(.*?)__/i', ’<em>${1}</em>', $title);
Podział na linie i wyróżnianie słów
Sztuczki średnio-złożone
Dla biegłych użytkowników Joomla!
1/5 JLESS
Parser LESS-a jest w core Joomla!
$app = JFactory::getApplication();
$path = JPATH_THEMES . '/' . $this->template;
$app = JFactory::getApplication();
$path = JPATH_THEMES . '/' . $this->template;
$less = new JLess;
$less->setFormatter(new JLessFormatterJoomla);
$app = JFactory::getApplication();
$path = JPATH_THEMES . '/' . $this->template;
$less = new JLess;
$less->setFormatter(new JLessFormatterJoomla);
try {
$less->compileFile($path.'/main.less', $path.'/main.css');
}
$app = JFactory::getApplication();
$path = JPATH_THEMES . '/' . $this->template;
$less = new JLess;
$less->setFormatter(new JLessFormatterJoomla);
try {
$less->compileFile($path.'/main.less', $path.'/main.css');
} catch (Exception $e) {
$app->enqueueMessage($e->getMessage(), 'error');
}
2/5 JLayouts
Po co się powtarzać?
$layout = new JLayoutFile(‘path.param.x’);
echo $layout->render($data);
<?php $msgList = $displayData['msgList']; ?>
<div id="system-message-container">
<?php if (is_array($msgList) && !empty($msgList)) : ?>
<div id="system-message">
<?php foreach ($msgList as $type => $msgs) : ?>
<div class="alert alert-<?php echo $type; ?>">
<a class="close" data-dismiss="alert">×</a>
<?php if (!empty($msgs)) : ?>
<h4 class="alert-heading"><?php echo JText::_($type); ?></h4>
<div>
<?php foreach ($msgs as $msg) : ?>
<p class="alert-message"><?php echo $msg; ?></p>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
</div>
Plik: layouts/joomla/system/message.php
$layout = new JLayoutFile(
'joomla.content.tags',
null,
array('debug' => true)
);
echo $layout->render(null);
$layout = new JLayoutFile(
'joomla.content.tags',
null,
array('debug' => true)
);
echo $layout->render(null);
Layout: joomla.content.tags
Include Paths: Array (
[0] => /www/test/templates/gk_technews/html/layouts/com_content
[1] => /www/test/components/com_content/layouts
[2] => /www/test/templates/gk_technews/html/layouts
[3] => /www/test/layouts
)
Searching layout for: joomla/content/tags.php
Found layout: /www/test/layouts/joomla/content/tags.php
$layout = new JLayoutFile(
'joomla.content.tags',
JPATH_SITE . '/components/com_custom/layouts',
array('debug' => true)
);
$layout = new JLayoutFile(
'joomla.content.tags',
JPATH_SITE . '/components/com_custom/layouts',
array('debug' => true)
);
Layout: joomla.content.tags
Include Paths: Array (
[0] => /www/test/components/com_custom/layouts
[1] => /www/test/templates/gk_technews/html/layouts/com_content
[2] => /www/test/components/com_content/layouts
[3] => /www/test/templates/gk_technews/html/layouts
[4] => /www/test/jqi/layouts
)
Searching layout for: joomla/content/tags.php
Found layout: /www/test/layouts/joomla/content/tags.php
$layout = new JLayoutFile(
'joomla.content.tags',
null,
array(
'debug' => true,
'component' => ‘com_tags',
'client' => 1,
'suffixes' => array('rtl', 'j34')
)
);
$layout = new JLayoutFile(
'joomla.content.tags',
null,
array(
'debug' => true,
'component' => ‘com_tags',
'client' => 1,
'suffixes' => array('rtl', 'j34')
)
);
Layout: joomla.content.tags
Include Paths: Array (
[0] => /www/test/templates/gk_technews/html/layouts/com_tags
[1] => /www/test/administrator/components/com_tags/layouts
[2] => /www/test/templates/gk_technews/html/layouts
[3] => /www/test/layouts
)
Suffixes: Array (
[0] => rtl
[1] => j34
)
Searching layout for: joomla/content/tags.rtl.php
Searching layout for: joomla/content/tags.j34.php
Searching layout for: joomla/content/tags.php
Found layout: /www/test/layouts/joomla/content/tags.php
3/5 Dodatkowe pola
w edytorach
By nie udziwniać składni wpisów
class plgSystemPlg_Custom_Params extends JPlugin {
var $_pluginPath;
}
class plgSystemPlg_Custom_Params extends JPlugin {
var $_pluginPath;
function __construct($subject) {
parent::__construct($subject);
$this->_plugin = JPluginHelper::getPlugin('system', 'plg_custom_params');
$this->_pluginPath = JPATH_PLUGINS."/system/plg_custom_params/";
}
}
class plgSystemPlg_Custom_Params extends JPlugin {
var $_pluginPath;
function __construct($subject) {
parent::__construct($subject);
$this->_plugin = JPluginHelper::getPlugin('system', 'plg_custom_params');
$this->_pluginPath = JPATH_PLUGINS."/system/plg_custom_params/";
}
function onContentPrepareForm($form, $data) {
if ($form->getName()=='com_content.article') {
JForm::addFormPath($this->_pluginPath);
$form->loadFile('parameters', false);
return true;
}
}
}
class plgSystemPlg_Custom_Params extends JPlugin {
var $_pluginPath;
function __construct($subject) {
parent::__construct($subject);
$this->_plugin = JPluginHelper::getPlugin('system', 'plg_custom_params');
$this->_pluginPath = JPATH_PLUGINS."/system/plg_custom_params/";
}
function onContentPrepareForm($form, $data) {
if ($form->getName()=='com_content.article') {
JForm::addFormPath($this->_pluginPath);
$form->loadFile('parameters', false);
return true;
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<form>
<fields name="attribs">
<fieldset name="basic" label="Test">
<field name="custom_field1" type="text" default="" label="Field 1" />
<field name="custom_field2" type="text" default="" label="Field 2" />
</fieldset>
</fields>
</form>
<?xml version="1.0" encoding="utf-8"?>
<form>
<fields name="attribs">
<fieldset name=“test" label="Test">
<field name="custom_field1" type="text" default="" label="Field 1" />
<field name="custom_field2" type="text" default="" label="Field 2" />
</fieldset>
</fields>
</form>
$article_attribs = json_decode($this->item->attribs);
echo $article_attribs[’custom_field1'];
4/5 Avatary we wpisach
Bo ludzi pamięta się z twarzy…
https://pl.gravatar.com/
$author_obj = JFactory::getUser($this->item->created_by);
$author_email = $author_obj->email;
$author_obj = JFactory::getUser($this->item->created_by);
$author_email = $author_obj->email;
$avatar_hash = md5(strtolower(trim($author_email)));
$avatar_size = 120;
$author_obj = JFactory::getUser($this->item->created_by);
$author_email = $author_obj->email;
$avatar_hash = md5(strtolower(trim($author_email)));
$avatar_size = 120;
$avatar_url = ‘//www.gravatar.com/avatar/’.$avatar_hash .‘.jpg’;
$avatar_url .= ‘?s=‘ . $avatar_size;
5/5 Zmiana szablonu dla
wybranych podstron
Bez generowania złożonych struktur w menu…
public function onAfterRoute() {
$app = JFactory::getApplication();
if ($app instanceof JApplicationSite) {
$jinput = $app->input;
$option = $jinput->getCmd('option', '');
$view = $jinput->getCmd('view', '');
$params = new JRegistry();
$params->def('templateColor', '#f00');
$params->def('templateBackgroundColor', '#000');
if($option === 'com_content' && $view === 'article’)
{
$app->setTemplate('protostar', $params);
}
}
}
public function onAfterRoute() {
$app = JFactory::getApplication();
if ($app instanceof JApplicationSite) {
$jinput = $app->input;
$option = $jinput->getCmd('option', '');
$view = $jinput->getCmd('view', '');
$params = new JRegistry();
$params->def('templateColor', '#f00');
$params->def('templateBackgroundColor', '#000');
if($option === 'com_content' && $view === 'article’)
{
$app->setTemplate('protostar', $params);
}
}
}
public function onAfterRoute() {
$app = JFactory::getApplication();
if ($app instanceof JApplicationSite) {
$jinput = $app->input;
$option = $jinput->getCmd('option', '');
$view = $jinput->getCmd('view', '');
$params = new JRegistry();
$params->def('templateColor', '#f00');
$params->def('templateBackgroundColor', '#000');
if($option === 'com_content' && $view === 'article’) {
$app->setTemplate('protostar', $params);
}
}
}
public function onAfterRoute() {
$app = JFactory::getApplication();
if ($app instanceof JApplicationSite) {
$jinput = $app->input;
$option = $jinput->getCmd('option', '');
$view = $jinput->getCmd('view', '');
$params = new JRegistry();
$params->def('templateColor', '#f00');
$params->def('templateBackgroundColor', '#000');
if($option === 'com_content' && $view === 'article’) {
$app->setTemplate('protostar', $params);
}
}
}
Sztuczki zaawansowane
Coś dla koneserów
1/5 Wtyczki bez wtyczek
Po co instalować dodatkowe paczki?
$dispatcher = JEventDispatcher::getInstance();
$dispatcher = JEventDispatcher::getInstance();
$dispatcher->register('onAfterRender', 'CustomParser');
$dispatcher = JEventDispatcher::getInstance();
$dispatcher->register('onAfterRender', 'CustomParser');
function CustomParser(){
$body = JResponse::getBody();
JResponse::setBody($body);
}
$dispatcher = JEventDispatcher::getInstance();
$dispatcher->register('onAfterRender', 'CustomParser');
function CustomParser(){
$body = JResponse::getBody();
$body = str_replace('ABC', 'XYZ', $body);
JResponse::setBody($body);
}
2/5 JImage
Operacje na grafikach
$img = new JImage(__DIR__ . '/images/logo.png');
$img = new JImage(__DIR__ . '/images/logo.png');
$img->resize(320, 320, false, JImage::SCALE_FILL);
$img = new JImage(__DIR__ . '/images/logo.png');
$img->resize(320, 320, false, JImage::SCALE_FILL);
$img->crop(160, 160, 80, 80, false);
$img = new JImage(__DIR__ . '/images/logo.png');
$img->resize(320, 320, false, JImage::SCALE_FILL);
$img->crop(160, 160, 80, 80, false);
$img->rotate(45, 0x000000, false);
$img = new JImage(__DIR__ . '/images/logo.png');
$img->resize(320, 320, false, JImage::SCALE_FILL);
$img->crop(160, 160, 80, 80, false);
$img->rotate(45, 0x000000, false);
$img->filter('negate');
$img = new JImage(__DIR__ . '/images/logo.png');
$img->resize(320, 320, false, JImage::SCALE_FILL);
$img->crop(160, 160, 80, 80, false);
$img->rotate(45, 0x000000, false);
$img->filter('negate');
$img->toFile(__DIR__ . '/images/new.jpg', IMAGETYPE_JPEG);
3/5 Wykrywanie
administratora po
stronie front-endu
Może się zdarzyć, że musisz o tym wiedzieć
Front-end
Back-end
Wartość przechowywana
w plikach cookie
0 = front-end
1 = back-end
0 = zalogowany
1 = niezalogowany
Warto sprawdzić czy sesja nie wygasła
$config = JFactory::getConfig();
$session_lifetime = $config->get('lifetime’);
Dodatkowo można porównać
wartość ciągu user-agent
Dane użytkownika
4/5 Złożone kontrolki
Bo czasem pole tekstowe i color picker to za mało…
<input type=“hidden”>
<input type=“hidden”>
Zmiana ustawień
json_encode($config)
<input type=“hidden”>
Zmiana ustawień
json_encode($config)
Wczytanie ustawień
json_decode($config)
5/5 Własne sposoby
autoryzacji
Jak pragnę OAuth…
function onUserAuthenticate($credentials, $options, &$response) {
// kod obsługujący autoryzację
return $response;
}
$credentials[’username’] // Login użytkownika
$credentials['password’] // Hasło użytkownika
$user = JUser::getInstance($result->id);
$user = JUser::getInstance($result->id);
$response->email = $user->email;
$response->username = $user->username;
$response->fullname = $user->name;
$user = JUser::getInstance($result->id);
$response->email = $user->email;
$response->username = $user->username;
$response->fullname = $user->name;
if(JFactory::getApplication()->isAdmin()) {
$response->language = $user->getParam('admin_language');
} else {
$response->language = $user->getParam('language');
}
// Poprawne zalogowanie
$response->status = JAuthentication::STATUS_SUCCESS;
// Błędne zalogowanie
$response->status = JAuthenticaton::STATUS_FAILURE;
Pytania?

Contenu connexe

Tendances

Estandarizacion de macros
Estandarizacion de macrosEstandarizacion de macros
Estandarizacion de macrosgerariel
 
Documentacion edderson callpa_ortiz
Documentacion edderson callpa_ortizDocumentacion edderson callpa_ortiz
Documentacion edderson callpa_ortizEdderson J. Ortiz
 
Curso Symfony - Clase 1
Curso Symfony - Clase 1Curso Symfony - Clase 1
Curso Symfony - Clase 1Javier Eguiluz
 
Drupal Theming Hans Rossel
Drupal Theming Hans RosselDrupal Theming Hans Rossel
Drupal Theming Hans RosselHans Rossel
 
2km Workshop: Desenvolvimento ágil com o CakePHP
2km Workshop: Desenvolvimento ágil com o CakePHP2km Workshop: Desenvolvimento ágil com o CakePHP
2km Workshop: Desenvolvimento ágil com o CakePHPCarlos Pires
 
Quiz Component For Joomla
Quiz Component For JoomlaQuiz Component For Joomla
Quiz Component For Joomlaguestebb21a
 

Tendances (10)

Spring Capitulo 04
Spring Capitulo 04Spring Capitulo 04
Spring Capitulo 04
 
Estandarizacion de macros
Estandarizacion de macrosEstandarizacion de macros
Estandarizacion de macros
 
Documentacion edderson callpa_ortiz
Documentacion edderson callpa_ortizDocumentacion edderson callpa_ortiz
Documentacion edderson callpa_ortiz
 
A z railphp v1.0
A z railphp v1.0A z railphp v1.0
A z railphp v1.0
 
Curso Symfony - Clase 1
Curso Symfony - Clase 1Curso Symfony - Clase 1
Curso Symfony - Clase 1
 
Drupal Theming Hans Rossel
Drupal Theming Hans RosselDrupal Theming Hans Rossel
Drupal Theming Hans Rossel
 
2km Workshop: Desenvolvimento ágil com o CakePHP
2km Workshop: Desenvolvimento ágil com o CakePHP2km Workshop: Desenvolvimento ágil com o CakePHP
2km Workshop: Desenvolvimento ágil com o CakePHP
 
Quiz Component For Joomla
Quiz Component For JoomlaQuiz Component For Joomla
Quiz Component For Joomla
 
Jsoon
JsoonJsoon
Jsoon
 
Blospot
BlospotBlospot
Blospot
 

En vedette

Extend Joomla Forms Using Plugins
Extend Joomla Forms Using PluginsExtend Joomla Forms Using Plugins
Extend Joomla Forms Using PluginsYireo
 
10 things you are doing wrong in Joomla
10 things you are doing wrong in Joomla10 things you are doing wrong in Joomla
10 things you are doing wrong in JoomlaAshwin Date
 
Za darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp WrocławZa darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp WrocławTomasz Dziuda
 
Webinar: 5 Tricks for WordPress web administrators
Webinar: 5 Tricks for WordPress web administratorsWebinar: 5 Tricks for WordPress web administrators
Webinar: 5 Tricks for WordPress web administratorsTomasz Dziuda
 
WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistom
WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistomWordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistom
WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistomTomasz Dziuda
 
Wordpress - czyli ponad 17% wszystkich istniejących serwisów www
Wordpress - czyli ponad 17% wszystkich istniejących serwisów wwwWordpress - czyli ponad 17% wszystkich istniejących serwisów www
Wordpress - czyli ponad 17% wszystkich istniejących serwisów wwwB-MIND Software House
 
Wprowadzenie do WP-API
Wprowadzenie do WP-APIWprowadzenie do WP-API
Wprowadzenie do WP-APITomasz Dziuda
 
Jak nadążyć za światem front endu
Jak nadążyć za światem front enduJak nadążyć za światem front endu
Jak nadążyć za światem front enduTomasz Dziuda
 
Word up warszawa 2015
Word up warszawa 2015Word up warszawa 2015
Word up warszawa 2015Tomasz Dziuda
 
Jak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training DayJak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training DayTomasz Dziuda
 

En vedette (12)

Extend Joomla Forms Using Plugins
Extend Joomla Forms Using PluginsExtend Joomla Forms Using Plugins
Extend Joomla Forms Using Plugins
 
10 things you are doing wrong in Joomla
10 things you are doing wrong in Joomla10 things you are doing wrong in Joomla
10 things you are doing wrong in Joomla
 
Extreme Networks IdentiFi
Extreme Networks IdentiFiExtreme Networks IdentiFi
Extreme Networks IdentiFi
 
Daj się wyręczyć
Daj się wyręczyćDaj się wyręczyć
Daj się wyręczyć
 
Za darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp WrocławZa darmo nie umarło - WordCamp Wrocław
Za darmo nie umarło - WordCamp Wrocław
 
Webinar: 5 Tricks for WordPress web administrators
Webinar: 5 Tricks for WordPress web administratorsWebinar: 5 Tricks for WordPress web administrators
Webinar: 5 Tricks for WordPress web administrators
 
WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistom
WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistomWordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistom
WordUp Gdynia - Jak tworzyć motywy przyjazne użytkownikom i programistom
 
Wordpress - czyli ponad 17% wszystkich istniejących serwisów www
Wordpress - czyli ponad 17% wszystkich istniejących serwisów wwwWordpress - czyli ponad 17% wszystkich istniejących serwisów www
Wordpress - czyli ponad 17% wszystkich istniejących serwisów www
 
Wprowadzenie do WP-API
Wprowadzenie do WP-APIWprowadzenie do WP-API
Wprowadzenie do WP-API
 
Jak nadążyć za światem front endu
Jak nadążyć za światem front enduJak nadążyć za światem front endu
Jak nadążyć za światem front endu
 
Word up warszawa 2015
Word up warszawa 2015Word up warszawa 2015
Word up warszawa 2015
 
Jak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training DayJak nadążyć za światem front-endu - WordPress Training Day
Jak nadążyć za światem front-endu - WordPress Training Day
 

Plus de Tomasz Dziuda

Wtyczkowe kompendium - WordUp Warszawa
Wtyczkowe kompendium - WordUp WarszawaWtyczkowe kompendium - WordUp Warszawa
Wtyczkowe kompendium - WordUp WarszawaTomasz Dziuda
 
Wtyczkowe Kompendium - WordUp Łódź #12
Wtyczkowe Kompendium - WordUp Łódź #12Wtyczkowe Kompendium - WordUp Łódź #12
Wtyczkowe Kompendium - WordUp Łódź #12Tomasz Dziuda
 
Wtyczkowe Kompendium - WordUp Lublin
Wtyczkowe Kompendium - WordUp LublinWtyczkowe Kompendium - WordUp Lublin
Wtyczkowe Kompendium - WordUp LublinTomasz Dziuda
 
Wtyczkowe kompendium
Wtyczkowe kompendiumWtyczkowe kompendium
Wtyczkowe kompendiumTomasz Dziuda
 
Jak Twoja strona moze wygenerować niespodziewane koszta? WordUp Kraków
Jak Twoja strona moze wygenerować niespodziewane koszta? WordUp KrakówJak Twoja strona moze wygenerować niespodziewane koszta? WordUp Kraków
Jak Twoja strona moze wygenerować niespodziewane koszta? WordUp KrakówTomasz Dziuda
 
Jak Twoja strona może wygenerować niespodziewane koszta
Jak Twoja strona może wygenerować niespodziewane kosztaJak Twoja strona może wygenerować niespodziewane koszta
Jak Twoja strona może wygenerować niespodziewane kosztaTomasz Dziuda
 
REST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp TrójmiastoREST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp TrójmiastoTomasz Dziuda
 
REST API - teoria i praktyka - WordUp Warszawa
REST API - teoria i praktyka - WordUp WarszawaREST API - teoria i praktyka - WordUp Warszawa
REST API - teoria i praktyka - WordUp WarszawaTomasz Dziuda
 
Contributor Day - WordCamp Lublin 2017 - przegląd motywów
Contributor Day - WordCamp Lublin 2017 - przegląd motywówContributor Day - WordCamp Lublin 2017 - przegląd motywów
Contributor Day - WordCamp Lublin 2017 - przegląd motywówTomasz Dziuda
 
Electron + WordPress = ❤
Electron + WordPress = ❤Electron + WordPress = ❤
Electron + WordPress = ❤Tomasz Dziuda
 
Statycznie czy dynamicznie - infoMEET Wrocław
Statycznie czy dynamicznie - infoMEET WrocławStatycznie czy dynamicznie - infoMEET Wrocław
Statycznie czy dynamicznie - infoMEET WrocławTomasz Dziuda
 
Motywy dla WordPressa - historia prawdziwa - WordUp Katowice
Motywy dla WordPressa - historia prawdziwa - WordUp KatowiceMotywy dla WordPressa - historia prawdziwa - WordUp Katowice
Motywy dla WordPressa - historia prawdziwa - WordUp KatowiceTomasz Dziuda
 
Motywy dla WordPressa - historia prawdziwa - WordUp Warszawa
Motywy dla WordPressa - historia prawdziwa - WordUp WarszawaMotywy dla WordPressa - historia prawdziwa - WordUp Warszawa
Motywy dla WordPressa - historia prawdziwa - WordUp WarszawaTomasz Dziuda
 
Motywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia PrawdziwaMotywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia PrawdziwaTomasz Dziuda
 
Dokąd zmierza WordPress?
Dokąd zmierza WordPress?Dokąd zmierza WordPress?
Dokąd zmierza WordPress?Tomasz Dziuda
 
Statycznie czy dynamicznie? v.2.0
Statycznie czy dynamicznie? v.2.0Statycznie czy dynamicznie? v.2.0
Statycznie czy dynamicznie? v.2.0Tomasz Dziuda
 
Statycznie czy dynamicznie?
Statycznie czy dynamicznie?Statycznie czy dynamicznie?
Statycznie czy dynamicznie?Tomasz Dziuda
 
Jak nadążyć za światem front-endu?
Jak nadążyć za światem front-endu?Jak nadążyć za światem front-endu?
Jak nadążyć za światem front-endu?Tomasz Dziuda
 
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp Silesia
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp SilesiaJak tworzyć motywy przyjazne użytkownikom i programistom - WordUp Silesia
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp SilesiaTomasz Dziuda
 

Plus de Tomasz Dziuda (20)

Wtyczkowe kompendium - WordUp Warszawa
Wtyczkowe kompendium - WordUp WarszawaWtyczkowe kompendium - WordUp Warszawa
Wtyczkowe kompendium - WordUp Warszawa
 
Wtyczkowe Kompendium - WordUp Łódź #12
Wtyczkowe Kompendium - WordUp Łódź #12Wtyczkowe Kompendium - WordUp Łódź #12
Wtyczkowe Kompendium - WordUp Łódź #12
 
Trello w praktyce
Trello w praktyceTrello w praktyce
Trello w praktyce
 
Wtyczkowe Kompendium - WordUp Lublin
Wtyczkowe Kompendium - WordUp LublinWtyczkowe Kompendium - WordUp Lublin
Wtyczkowe Kompendium - WordUp Lublin
 
Wtyczkowe kompendium
Wtyczkowe kompendiumWtyczkowe kompendium
Wtyczkowe kompendium
 
Jak Twoja strona moze wygenerować niespodziewane koszta? WordUp Kraków
Jak Twoja strona moze wygenerować niespodziewane koszta? WordUp KrakówJak Twoja strona moze wygenerować niespodziewane koszta? WordUp Kraków
Jak Twoja strona moze wygenerować niespodziewane koszta? WordUp Kraków
 
Jak Twoja strona może wygenerować niespodziewane koszta
Jak Twoja strona może wygenerować niespodziewane kosztaJak Twoja strona może wygenerować niespodziewane koszta
Jak Twoja strona może wygenerować niespodziewane koszta
 
REST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp TrójmiastoREST API - teoria i praktyka - WordUp Trójmiasto
REST API - teoria i praktyka - WordUp Trójmiasto
 
REST API - teoria i praktyka - WordUp Warszawa
REST API - teoria i praktyka - WordUp WarszawaREST API - teoria i praktyka - WordUp Warszawa
REST API - teoria i praktyka - WordUp Warszawa
 
Contributor Day - WordCamp Lublin 2017 - przegląd motywów
Contributor Day - WordCamp Lublin 2017 - przegląd motywówContributor Day - WordCamp Lublin 2017 - przegląd motywów
Contributor Day - WordCamp Lublin 2017 - przegląd motywów
 
Electron + WordPress = ❤
Electron + WordPress = ❤Electron + WordPress = ❤
Electron + WordPress = ❤
 
Statycznie czy dynamicznie - infoMEET Wrocław
Statycznie czy dynamicznie - infoMEET WrocławStatycznie czy dynamicznie - infoMEET Wrocław
Statycznie czy dynamicznie - infoMEET Wrocław
 
Motywy dla WordPressa - historia prawdziwa - WordUp Katowice
Motywy dla WordPressa - historia prawdziwa - WordUp KatowiceMotywy dla WordPressa - historia prawdziwa - WordUp Katowice
Motywy dla WordPressa - historia prawdziwa - WordUp Katowice
 
Motywy dla WordPressa - historia prawdziwa - WordUp Warszawa
Motywy dla WordPressa - historia prawdziwa - WordUp WarszawaMotywy dla WordPressa - historia prawdziwa - WordUp Warszawa
Motywy dla WordPressa - historia prawdziwa - WordUp Warszawa
 
Motywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia PrawdziwaMotywy Wordpressa Historia Prawdziwa
Motywy Wordpressa Historia Prawdziwa
 
Dokąd zmierza WordPress?
Dokąd zmierza WordPress?Dokąd zmierza WordPress?
Dokąd zmierza WordPress?
 
Statycznie czy dynamicznie? v.2.0
Statycznie czy dynamicznie? v.2.0Statycznie czy dynamicznie? v.2.0
Statycznie czy dynamicznie? v.2.0
 
Statycznie czy dynamicznie?
Statycznie czy dynamicznie?Statycznie czy dynamicznie?
Statycznie czy dynamicznie?
 
Jak nadążyć za światem front-endu?
Jak nadążyć za światem front-endu?Jak nadążyć za światem front-endu?
Jak nadążyć za światem front-endu?
 
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp Silesia
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp SilesiaJak tworzyć motywy przyjazne użytkownikom i programistom - WordUp Silesia
Jak tworzyć motywy przyjazne użytkownikom i programistom - WordUp Silesia
 

JSztuczki