Best Practice: Joomla! templating

A presentation at Joomladagen in April 2017 in Zeist, Netherlands by Hans Kuijpers

Slide 1

Slide 1

Best Practice: Joomla Templating Hans Kuijpers

Slide 2

Slide 2

TIP 1 - de basis Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 2 of 56

Slide 3

Slide 3

Begin met een basis via Joomla.org meest recente versie downloaden installeren op hostingomgeving handige extensies downloaden en installeren tof template downloaden en installeren standaard instellingen wijzigen accounts aanmaken Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 3 of 56

Slide 4

Slide 4

Begin met een basis via Joomla.org meest recente versie downloaden installeren op hostingomgeving handige extensies downloaden en installeren tof template downloaden en installeren standaard instellingen wijzigen accounts aanmaken een boel tijd verloren en nu pas aan de slag Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 4 of 56

Slide 5

Slide 5

Begin met een goede basis Heb ergens een basis Joomla! site staan Rol die uit op je lokale ontwikkelomgeving En ga aan de slag Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 5 of 56

Slide 6

Slide 6

Eenmalig eigen basis opzetten Investeer eenmalig tijd in een goede basis Gebruik als kickstart voor ieder template-project Beheer basis via bijvoorbeeld een github-repo Maak bibliotheek van overrides, JavaScript, SCSS Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 6 of 56

Slide 7

Slide 7

Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 7 of 56

Slide 8

Slide 8

Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 8 of 56

Slide 9

Slide 9

Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 9 of 56

Slide 10

Slide 10

TIP 2 - automatiseer waar mogelijk Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 10 of 56

Slide 11

Slide 11

Building tools Zoveel mogelijk stappen automatiseren Snel en eenvoudig Performance verbeteren Fouten minimaliseren Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 11 of 56

Slide 12

Slide 12

Welke taken? LESS of SASS compileren naar CSS SASS source map aanmaken JavaScript samenvoegen CSS of JavaScript minifyen Git commits, pushen en pullen Afbeeldingen comprimeren Bestanden kopieren Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 12 of 56

Slide 13

Slide 13

Welke taken? LESS of SASS compileren naar CSS SASS source map aanmaken JavaScript samenvoegen CSS of JavaScript minifyen Git commits, pushen en pullen Afbeeldingen comprimeren Bestanden kopieren Bijvoorbeeld met Grunt Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 13 of 56

Slide 14

Slide 14

Grunt task sass compilatie SCSS => CSS ‘use strict’; // module.exports = { dist: { options: { includePaths: [ require(“bourbon”).includePaths, require(“bourbon-neat”).includePaths, require(“node-normalize-scss”).includePaths ] }, files: { ‘<%= paths.template %>/css/style.css’: ‘<%= paths.assets %>/scss/style.scss’, ‘<%= paths.template %>/css/grid.css’: ‘<%= paths.assets %>/scss/grid.scss’, ‘<%= paths.template %>/css/font.css’: ‘<%= paths.assets %>/scss/font.scss’ } } }; Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 14 of 56

Slide 15

Slide 15

TIP 3 - SCSS mixins for the win Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 15 of 56

Slide 16

Slide 16

Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 16 of 56

Slide 17

Slide 17

Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 17 of 56

Slide 18

Slide 18

Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 18 of 56

Slide 19

Slide 19

Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 19 of 56

Slide 20

Slide 20

Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 20 of 56

Slide 21

Slide 21

section/_heading.scss .section { @include e(‘heading’) { @include m(‘light’) { @include heading($quarter-spanish-white); } @include m(‘white’) { @include heading(white); } @include m(‘image’) { @include heading—clipart; } } } Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 21 of 56

Slide 22

Slide 22

@include heading -> mixin heading @mixin heading($bgcolor: white) { @include heading—base; @include arrow-bottom(2.5em, 50, transparent, $bgcolor); } @mixin heading—clipart { @include heading—base; @include arrow-bottom-clipart(50); } Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 22 of 56

Slide 23

Slide 23

@include arrow-button -> mixin arrow-button Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 23 of 56

Slide 24

Slide 24

Met css als resultaat scss -> css vendorprefix minified Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 24 of 56

Slide 25

Slide 25

TIP 4 - de templateHelper Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 25 of 56

Slide 26

Slide 26

Template - Protostar 126: <!DOCTYPE html> 127: <html lang=”<?php echo $this->language; ?>” dir=”<?php echo $this->direction; ?>”> 128: <head> 129:

<meta name=”viewport” content=”width=device-width, initial-scale=1.0” /> 130: <jdoc:include type=”head” /> 131: </head> 132: <body class=”site <?php echo $option 133: . ’ view-’ . $view 134: . ($layout ? ’ layout-’ . $layout : ’ no-layout’) 135: . ($task ? ’ task-’ . $task : ’ no-task’) 136: . ($itemid ? ’ itemid-’ . $itemid : ”) 137: . ($params->get(‘fluidContainer’) ? ’ fluid’ : ”); 138: echo ($this->direction === ‘rtl’ ? ’ rtl’ : ”); 139:?>”> Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 26 of 56

Slide 27

Slide 27

Template - Protostar 126: <!DOCTYPE html> 127: <html lang=”<?php echo $this->language; ?>” dir=”<?php echo $this->direction; ?>”> 128: <head> 129:

<meta name=”viewport” content=”width=device-width, initial-scale=1.0” /> 130: <jdoc:include type=”head” /> 131: </head> 132: <body class=”site <?php echo $option 133: . ’ view-’ . $view 134: . ($layout ? ’ layout-’ . $layout : ’ no-layout’) 135: . ($task ? ’ task-’ . $task : ’ no-task’) 136: . ($itemid ? ’ itemid-’ . $itemid : ”) 137: . ($params->get(‘fluidContainer’) ? ’ fluid’ : ”); 138: echo ($this->direction === ‘rtl’ ? ’ rtl’ : ”); 139:?>”> Pas op regel 126 begint de HTML pagina. Daarvoor alleen maar PHP functies Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 27 of 56

Slide 28

Slide 28

Nadelen foutgevoelig geen overzicht moeilijk herbruikbaar in overrides Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 28 of 56

Slide 29

Slide 29

Nadelen foutgevoelig geen overzicht moeilijk herbruikbaar in overrides Conflicten gegarandeerd! (en dus debug-uren) Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 29 of 56

Slide 30

Slide 30

Template - PerfectTemplate 24: <!DOCTYPE html> 25: <html class=”html no-js” lang=”<?php echo $this->language; ?>” dir=”<?php echo $this->directi on; ?>”> 26: <head> 27: <jdoc:include type=”head”/> 28: <noscript> 29:

<link href=”<?php echo $this->baseurl; ?>/templates/<?php echo $this->template; ?>/cs s/font.css” rel=”stylesheet” type=”text/css”/> 30: </noscript> 31: </head> 32: <body class=”<?php echo PWTTemplateHelper::getBodySuffix(); ?>”> 33: <?php echo PWTTemplateHelper::getAnalytics(2,’GTM-XXXXXX’)[‘script’]; ?> Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 30 of 56

Slide 31

Slide 31

Template - PerfectTemplate 24: <!DOCTYPE html> 25: <html class=”html no-js” lang=”<?php echo $this->language; ?>” dir=”<?php echo $this->directi on; ?>”> 26: <head> 27: <jdoc:include type=”head”/> 28: <noscript> 29:

<link href=”<?php echo $this->baseurl; ?>/templates/<?php echo $this->template; ?>/cs s/font.css” rel=”stylesheet” type=”text/css”/> 30: </noscript> 31: </head> 32: <body class=”<?php echo PWTTemplateHelper::getBodySuffix(); ?>”> 33: <?php echo PWTTemplateHelper::getAnalytics(2,’GTM-XXXXXX’)[‘script’]; ?> 100 regels eerder begint de HTML pagina De PHP functies zijn verplaatst Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 31 of 56

Slide 32

Slide 32

De eerste 25 regels code <?php /* * @package perfecttemplate

  • @copyright Copyright (c) Perfect Web Team / perfectwebteam.nl
  • @license GNU General Public License version 3 or later */ // No direct access. defined(‘_JEXEC’) or die; // Load Perfect Template Helper require_once JPATH_THEMES . ‘/’ . $this->template . ‘/helper.php’; require_once JPATH_THEMES . ‘/’ . $this->template . ‘/html/layouts/render.php’; PWTTemplateHelper::setMetadata(); PWTTemplateHelper::setFavicon(); PWTTemplateHelper::unloadCss(); PWTTemplateHelper::unloadJs(); PWTTemplateHelper::loadCss(); PWTTemplateHelper::loadJs(); PWTTemplateHelper::localstorageFont(); PWTTemplateHelper::ajaxSVG(); ?> Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 32 of 56

Slide 33

Slide 33

Bij fouten makkelijk uit te schakelen <?php /* * @package perfecttemplate

  • @copyright Copyright (c) Perfect Web Team / perfectwebteam.nl
  • @license GNU General Public License version 3 or later */ // No direct access. defined(‘_JEXEC’) or die; // Load Perfect Template Helper require_once JPATH_THEMES . ‘/’ . $this->template . ‘/helper.php’; require_once JPATH_THEMES . ‘/’ . $this->template . ‘/html/layouts/render.php’; PWTTemplateHelper::setMetadata(); PWTTemplateHelper::setFavicon(); //PWTTemplateHelper::unloadCss(); //PWTTemplateHelper::unloadJs(); //PWTTemplateHelper::loadCss(); //PWTTemplateHelper::loadJs(); //PWTTemplateHelper::localstorageFont(); //PWTTemplateHelper::ajaxSVG(); ?> Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 33 of 56

Slide 34

Slide 34

Helper.php - snippet class PWTTemplateHelper { static public function template() { return JFactory::getApplication()->getTemplate(); } static public function loadCss() { JFactory::getDocument()->addStyleSheet(‘templates/’ . self::template() . ‘/css/style.css’); } Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 34 of 56

Slide 35

Slide 35

Helper.php - snippet class PWTTemplateHelper { static public function template() { return JFactory::getApplication()->getTemplate(); } static public function loadCss() { JFactory::getDocument()->addStyleSheet(‘templates/’ . self::template() . ‘/css/style.css’); } Resulteert in <link href=”/templates/perfecttemplate/css/style.css” rel=”stylesheet” type=”text/css” /> Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 35 of 56

Slide 36

Slide 36

Body classes die de weg wijzen class PWTTemplateHelper { static public function getBodySuffix() { $classes = array(); $classes[] = ‘option-’ . self::getPageOption(); $classes[] = ‘view-’ . self::getPageView(); $classes[] = self::getPageLayout() ? ‘layout-’ . self::getPageLayout() : ‘no-layout’; $classes[] = self::getPageTask() ? ‘task-’ . self::getPageTask() : ‘no-task’; $classes[] = ‘itemid-’ . self::getItemId(); $classes[] = self::getPageClass(); $classes[] = self::isHome() ? ‘path-home’ : ‘path-’ . implode(‘-‘, self::getPath(‘array’)); $classes[] = ‘home-’ . (int) self::isHome(); return implode(’ ‘, $classes); } Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 36 of 56

Slide 37

Slide 37

Body classes die de weg wijzen class PWTTemplateHelper { static public function getBodySuffix() { $classes = array(); $classes[] = ‘option-’ . self::getPageOption(); $classes[] = ‘view-’ . self::getPageView(); $classes[] = self::getPageLayout() ? ‘layout-’ . self::getPageLayout() : ‘no-layout’; $classes[] = self::getPageTask() ? ‘task-’ . self::getPageTask() : ‘no-task’; $classes[] = ‘itemid-’ . self::getItemId(); $classes[] = self::getPageClass(); $classes[] = self::isHome() ? ‘path-home’ : ‘path-’ . implode(‘-‘, self::getPath(‘array’)); $classes[] = ‘home-’ . (int) self::isHome(); return implode(’ ‘, $classes); } Resulteert in <body class=”option-com-content view-category layout-blog no-task itemid-130 path-nieuws home-0”> Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 37 of 56

Slide 38

Slide 38

Eigen Meta data toevoegen functies aanmaken in helper.php functies oproepen in index.php frontend verversen en bekijk het resultaat Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 38 of 56

Slide 39

Slide 39

Eigen Meta data toevoegen helper.php class PWTTemplateHelper { static public function setGenerator($generator) { JFactory::getDocument()->setGenerator($generator); } static public function setMetadata() { $doc = JFactory::getDocument(); $doc->setCharset(‘utf8’); $doc->setMetaData(‘X-UA-Compatible’, ‘IE=edge’, true); $doc->setMetaData(‘viewport’, ‘width=device-width, initial-scale=1.0’); } static public function getSitename() { return JFactory::getConfig()->get(‘sitename’); } Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 39 of 56

Slide 40

Slide 40

Eigen Meta data toevoegen index.php // Load Perfect Template Helper require_once JPATH_THEMES . ‘/’ . $this->template . ‘/helper.php’; PWTTemplateHelper::setMetadata(); PWTTemplateHelper::setGenerator(PWTTemplateHelper::getSitename()); Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 40 of 56

Slide 41

Slide 41

Eigen Meta data toevoegen het resultaat <meta http-equiv=”content-type” content=”text/html; charset=utf-8” /> <meta http-equiv=”X-UA-Compatible” content=”IE=edge” /> <meta name=”viewport” content=”width=device-width, initial-scale=1.0” /> <meta name=”generator” content=”Custom Management” /> Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 41 of 56

Slide 42

Slide 42

Eigen Meta data toevoegen het resultaat <meta http-equiv=”content-type” content=”text/html; charset=utf-8” /> <meta http-equiv=”X-UA-Compatible” content=”IE=edge” /> <meta name=”viewport” content=”width=device-width, initial-scale=1.0” /> <meta name=”generator” content=”Custom Management” /> Controle over de head Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 42 of 56

Slide 43

Slide 43

TIP 5 - gebruik JLayout(s) Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 43 of 56

Slide 44

Slide 44

JLayout?, nog even herhalen aub. manier om (klein stukje) weergave op te bouwen enkel layout bestand met specifieke output data variabel meesturen zit in layouts/joomla Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 44 of 56

Slide 45

Slide 45

Voordelen gebruik JLayout herbruikbaar door gehele site (template en extensies) aanpassingen één keer doorvoeren in plaats op diverse plekken niet langer copy/pasten van code in template overrides Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 45 of 56

Slide 46

Slide 46

Voordelen gebruik JLayout herbruikbaar door gehele site (template en extensies) aanpassingen één keer doorvoeren in plaats op diverse plekken niet langer copy/pasten van code in template overrides herbruikbaar in verschillende projecten Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 46 of 56

Slide 47

Slide 47

Eigen JLayouts functie html/layouts/render.php class Jlayouts { public static function render($type, $data = ”) { $template = JFactory::getApplication()->getTemplate(); $jlayout = new JLayoutFile($type, JPATH_THEMES . ‘/’ . $template . ‘/html/layouts/templa te’); return $jlayout->render($data); } Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 47 of 56

Slide 48

Slide 48

Eigen JLayouts functie html/layouts/render.php class Jlayouts { public static function render($type, $data = ”) { $template = JFactory::getApplication()->getTemplate(); $jlayout = new JLayoutFile($type, JPATH_THEMES . ‘/’ . $template . ‘/html/layouts/templa te’); return $jlayout->render($data); } Zorgt er voor dat eigen JLayouts vanuit html/layouts/template/ opgeroepen kunnen worden. Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 48 of 56

Slide 49

Slide 49

Eigen JLayouts voor datum notatie toegepast in html/categories/blog_item.php if ($params->get(‘show_publish_date’)) : echo JLayoutHelper::render(‘template.content.create_date’, array(‘date’ => $this->item->creat ed, ‘format’ => ‘DATE_FORMAT_CC1’)); endif; vraagt om html/layouts/template/content/create_date.php Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 49 of 56

Slide 50

Slide 50

Eigen JLayouts voor datum notatie toegepast in html/categories/blog_item.php if ($params->get(‘show_publish_date’)) : echo JLayoutHelper::render(‘template.content.create_date’, array(‘date’ => $this->item->creat ed, ‘format’ => ‘DATE_FORMAT_CC1’)); endif; vraagt om html/layouts/template/content/create_date.php Datum is taalstring override in language/overrides/nl-NL-override.ini DATE_FORMAT_CC1=”F Y” output: maand jaar Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 50 of 56

Slide 51

Slide 51

Eigen JLayouts - inhoud html/layouts/template/content/create_date.php <?php defined(‘JPATH_BASE’) or die; $date = $displayData[‘date’]; $class = isset($displayData[‘class’]) ? $displayData[‘class’] : ‘content’; $format = JText::($displayData[‘format’]); echo ‘<span class=”’ . $class . ‘__create”>’; echo ‘<time datetime=”’ . JHtml::_(‘date’, $date, ‘c’) . ‘” itemprop = “dateCreated” >’; echo JHtml::(‘date’, $date, $format); echo ‘</time>’; echo ‘</span>’; Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 51 of 56

Slide 52

Slide 52

Eigen JLayouts - inhoud html/layouts/template/content/create_date.php <?php defined(‘JPATH_BASE’) or die; $date = $displayData[‘date’]; $class = isset($displayData[‘class’]) ? $displayData[‘class’] : ‘content’; $format = JText::($displayData[‘format’]); echo ‘<span class=”’ . $class . ‘__create”>’; echo ‘<time datetime=”’ . JHtml::_(‘date’, $date, ‘c’) . ‘” itemprop = “dateCreated” >’; echo JHtml::(‘date’, $date, $format); echo ‘</time>’; echo ‘</span>’; Resulteert in <span class=”content__create”><time datetime=”2017-02-17T10:31:00+01:00” itemprop=”dateCreated”>f ebruari 2017</time></span> Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 52 of 56

Slide 53

Slide 53

Eigen JLayouts - Google Maps html/layouts/template/blocks/gmap.php op te roepen via: <?php echo Jlayouts::render(‘block-gmap’); ?> Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 53 of 56

Slide 54

Slide 54

Eigen JLayouts - Google Maps Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 54 of 56

Slide 55

Slide 55

Eigen JLayouts - Gmap Best Practise: Joomla! templating - Hans Kuijpers - Joomla!dagen 2017 - 55 of 56

Slide 56

Slide 56

Bedankt! Hans Kuijpers @hans2103