Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

JSztuczki

774 views

Published on

15 sztuczek dla Joomla od podstaw do zaawansowanych

Published in: Technology
  • Be the first to comment

  • Be the first to like this

JSztuczki

  1. 1. JSztuczkiTomasz Dziuda – JoomlaDay 2015
  2. 2. 15
  3. 3. Sztuczki podstawowe Dla początkujących
  4. 4. 1/5 Nadpisywanie modułów i elementów strony By nie modyfikować core Joomla!
  5. 5. Widoki komponentów
  6. 6. Widoki komponentów Wiadomości systemowe
  7. 7. Widoki komponentów Widoki modułów Wiadomości systemowe
  8. 8. Widoki komponentów Widoki modułów Wiadomości systemowe Style modułów
  9. 9. Widoki komponentów Widoki modułów Wiadomości systemowe Style modułów Stronicowanie
  10. 10. 2/5 Dodatkowe widoki Formatowanie odpowiedzi serwera
  11. 11. https://mydomain.com/index.php?tmpl=special
  12. 12. https://mydomain.com/index.php?tmpl=special special.php w katalogu szablonu
  13. 13. 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ń.
  14. 14. 3/5 Ograniczone wyszukiwanie Gdy potrzebujemy większej elastyki wyszukiwarki
  15. 15. com_finder i filtry wyszukiwania
  16. 16. com_finder i filtry wyszukiwania
  17. 17. com_finder i filtry wyszukiwania
  18. 18. com_finder i filtry wyszukiwania
  19. 19. com_finder i filtry wyszukiwania
  20. 20. 4/5 Nadpisywanie fraz językowych Bez dotykania plików
  21. 21. 1
  22. 22. 1 2
  23. 23. 1
  24. 24. 1 2
  25. 25. 1
  26. 26. 1 2
  27. 27. 1 2 3
  28. 28. 5/5 Złożona składnia tytułów wpisów i modułów Bo czasem nie wystarczy zwykły tekst…
  29. 29. Podział na linie i wyróżnianie słów Lorem[br]ipsum[br]dolor Lorem __ipsum__ dolor Lorem **ipsum** dolor
  30. 30. $title = str_replace('[br]', '<br />', $module->title); Podział na linie i wyróżnianie słów
  31. 31. $title = str_replace('[br]', '<br />', $module->title); $title = preg_replace('/__(.*?)__/i', ’<em>${1}</em>', $title); Podział na linie i wyróżnianie słów
  32. 32. Sztuczki średnio-złożone Dla biegłych użytkowników Joomla!
  33. 33. 1/5 JLESS Parser LESS-a jest w core Joomla!
  34. 34. $app = JFactory::getApplication(); $path = JPATH_THEMES . '/' . $this->template;
  35. 35. $app = JFactory::getApplication(); $path = JPATH_THEMES . '/' . $this->template; $less = new JLess; $less->setFormatter(new JLessFormatterJoomla);
  36. 36. $app = JFactory::getApplication(); $path = JPATH_THEMES . '/' . $this->template; $less = new JLess; $less->setFormatter(new JLessFormatterJoomla); try { $less->compileFile($path.'/main.less', $path.'/main.css'); }
  37. 37. $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'); }
  38. 38. 2/5 JLayouts Po co się powtarzać?
  39. 39. $layout = new JLayoutFile(‘path.param.x’); echo $layout->render($data);
  40. 40. <?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
  41. 41. $layout = new JLayoutFile( 'joomla.content.tags', null, array('debug' => true) ); echo $layout->render(null);
  42. 42. $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
  43. 43. $layout = new JLayoutFile( 'joomla.content.tags', JPATH_SITE . '/components/com_custom/layouts', array('debug' => true) );
  44. 44. $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
  45. 45. $layout = new JLayoutFile( 'joomla.content.tags', null, array( 'debug' => true, 'component' => ‘com_tags', 'client' => 1, 'suffixes' => array('rtl', 'j34') ) );
  46. 46. $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
  47. 47. 3/5 Dodatkowe pola w edytorach By nie udziwniać składni wpisów
  48. 48. class plgSystemPlg_Custom_Params extends JPlugin { var $_pluginPath; }
  49. 49. 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/"; } }
  50. 50. 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; } } }
  51. 51. 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; } } }
  52. 52. <?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>
  53. 53. <?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>
  54. 54. $article_attribs = json_decode($this->item->attribs); echo $article_attribs[’custom_field1'];
  55. 55. 4/5 Avatary we wpisach Bo ludzi pamięta się z twarzy…
  56. 56. https://pl.gravatar.com/
  57. 57. $author_obj = JFactory::getUser($this->item->created_by); $author_email = $author_obj->email;
  58. 58. $author_obj = JFactory::getUser($this->item->created_by); $author_email = $author_obj->email; $avatar_hash = md5(strtolower(trim($author_email))); $avatar_size = 120;
  59. 59. $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;
  60. 60. 5/5 Zmiana szablonu dla wybranych podstron Bez generowania złożonych struktur w menu…
  61. 61. 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); } } }
  62. 62. 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); } } }
  63. 63. 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); } } }
  64. 64. 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); } } }
  65. 65. Sztuczki zaawansowane Coś dla koneserów
  66. 66. 1/5 Wtyczki bez wtyczek Po co instalować dodatkowe paczki?
  67. 67. $dispatcher = JEventDispatcher::getInstance();
  68. 68. $dispatcher = JEventDispatcher::getInstance(); $dispatcher->register('onAfterRender', 'CustomParser');
  69. 69. $dispatcher = JEventDispatcher::getInstance(); $dispatcher->register('onAfterRender', 'CustomParser'); function CustomParser(){ $body = JResponse::getBody(); JResponse::setBody($body); }
  70. 70. $dispatcher = JEventDispatcher::getInstance(); $dispatcher->register('onAfterRender', 'CustomParser'); function CustomParser(){ $body = JResponse::getBody(); $body = str_replace('ABC', 'XYZ', $body); JResponse::setBody($body); }
  71. 71. 2/5 JImage Operacje na grafikach
  72. 72. $img = new JImage(__DIR__ . '/images/logo.png');
  73. 73. $img = new JImage(__DIR__ . '/images/logo.png'); $img->resize(320, 320, false, JImage::SCALE_FILL);
  74. 74. $img = new JImage(__DIR__ . '/images/logo.png'); $img->resize(320, 320, false, JImage::SCALE_FILL); $img->crop(160, 160, 80, 80, false);
  75. 75. $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);
  76. 76. $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');
  77. 77. $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);
  78. 78. 3/5 Wykrywanie administratora po stronie front-endu Może się zdarzyć, że musisz o tym wiedzieć
  79. 79. Front-end Back-end
  80. 80. Wartość przechowywana w plikach cookie
  81. 81. 0 = front-end 1 = back-end
  82. 82. 0 = zalogowany 1 = niezalogowany
  83. 83. Warto sprawdzić czy sesja nie wygasła $config = JFactory::getConfig(); $session_lifetime = $config->get('lifetime’);
  84. 84. Dodatkowo można porównać wartość ciągu user-agent
  85. 85. Dane użytkownika
  86. 86. 4/5 Złożone kontrolki Bo czasem pole tekstowe i color picker to za mało…
  87. 87. <input type=“hidden”>
  88. 88. <input type=“hidden”> Zmiana ustawień json_encode($config)
  89. 89. <input type=“hidden”> Zmiana ustawień json_encode($config) Wczytanie ustawień json_decode($config)
  90. 90. 5/5 Własne sposoby autoryzacji Jak pragnę OAuth…
  91. 91. function onUserAuthenticate($credentials, $options, &$response) { // kod obsługujący autoryzację return $response; }
  92. 92. $credentials[’username’] // Login użytkownika $credentials['password’] // Hasło użytkownika
  93. 93. $user = JUser::getInstance($result->id);
  94. 94. $user = JUser::getInstance($result->id); $response->email = $user->email; $response->username = $user->username; $response->fullname = $user->name;
  95. 95. $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'); }
  96. 96. // Poprawne zalogowanie $response->status = JAuthentication::STATUS_SUCCESS; // Błędne zalogowanie $response->status = JAuthenticaton::STATUS_FAILURE;
  97. 97. Pytania?

×