Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TYPO3 CMS Website templates as an extension

TYPO3 CMS Website templates as an extension

Introduction into using TYPO3 CMS Extensions for Website Templates to provide a central location for code & configuration while integration with tools like Sass, Gulp, PostCSS, Imagemin & Webpack.

Morton Jonuschat

July 17, 2015
Tweet

More Decks by Morton Jonuschat

Other Decks in Programming

Transcript

  1. Morton  Jonuschat Full  Stack  Developer twi2er.com/yabawock github.com/yabawock Haltern  am  See,

     Germany Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 2
  2. Agenda Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 3

    Code Technical  stuff  and  best   prac?ces  from  daily  use. Integra+ons BaEeries  included… Basics Short  intro  to  TYPO3   Extension  structure
  3. What  problem  do  we  want  to  solve?   Websites  as

     a  TYPO3  CMS  extension Morton  Jonuschat 5
  4. Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 6 hEp:/

    /www.commitstrip.com/en/2015/04/13/coders-­‐are-­‐never-­‐sa?sfied/
  5. Simple  Times fileadmin └── template ├── index.html ├── logo.gif ├──

    main.html └── site.css Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 7
  6. Not  So  Simple  Times fileadmin └── template ├── index.html ├──

    index_2007.htm ├── logo.gif ├── logo_2007.gif ├── logo_small.gif ├── logo_wide.JPG ├── main_3cols.html ├── main.html ├── main_2cols.html ├── site.css └── site_2007.php Browser  dependent  CSS! Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 8
  7. Messy  Times fileadmin └── template ├── main │ ├── index.html

    │ ├── logo.jpg │ ├── main.html │ ├── site.css │ └── site.js └── site2 ├── index.html ├── logo.jpg ├── main_wide.html ├── site.js └── site2.css It  wasn’t  me!  I  only  worked     on  the  main  template! Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 9
  8. Structured  Chaos fileadmin └── templates ├── default │ ├── css

    │ ├── gfx │ ├── javascript │ ├── pages │ ├── plugins │ └── typoscript ├── site1 ├── ... └── site12 ├── css ├── gfx ├── javascript ├── pages ├── plugins └── typoscript Bigger  sites,  deeper  nes+ng,     more  problems! Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 10
  9. Preparing  to  fail! h-ps:/ /flic.kr/p/aJmvxc  -­‐  NZ  Defence  Force/Flickr,  CC-­‐BY

     2.0 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 11
  10. More  Reasons Extension fileadmin/ Accessible  through  file  module¹ No  access

     to  configura?on  for  users TYPO3  API  available File  based  configura?on Dependencies  (ext_emconf.php,  composer) Easy  deployment  &  distribu?on Version  control² Access  protec?on  for  config  files  (.htaccess)² Extensions  are  not  indexed  by  FAL ¹  Not  really  an  advantage   ²  Possible  but  difficult  for  fileadmin/ Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 12
  11. Basic  Structure site_package ├── Configuration │ ├── TypoScript │ └──

    .htaccess ├── Resources │ ├── Private │ │ ├── Layouts │ │ ├── Partials │ │ ├── Templates │ │ └── .htaccess │ └── Public │ ├── Images │ ├── JavaScripts │ └── StyleSheets ├── ext_emconf.php ├── ext_icon.png ├── ext_localconf.php └── ext_tables.php docs.typo3.org/typo3cms/CodingGuidelinesReference/FileSystemConven?ons/ExtensionDirectoryStructure/Index.html   Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 14
  12. Minimal  Boilerplate Define  extension  dependencies  (e.g.  css_styled_content) 1 Javascript 5

    Stylesheets 4 Page  Template  (using  FLUIDTEMPLATE) 3 Basic  TypoScript  setup  (Template  &  PageTS) 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 15
  13. Extension  Dependencies $EM_CONF[$_EXTKEY] = array( 'title' => 'Site Package Example',

    'description' => '', 'category' => 'templates', 'version' => '1.0.0', 'state' => 'stable', 'clearcacheonload' => 1, 'author' => 'Morton Jonuschat', 'author_email' => '[email protected]', 'author_company' => 'MoJo Code', 'constraints' => array( 'depends' => array( 'typo3' => '6.2.0-6.2.99', 'css_styled_content' => '6.2.0-6.2.99' ), 'conflicts' => array(), 'suggests' => array() ) ); sitepackage_starter/ext_emconf.php   Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 16
  14. PageTSconfig TCEFORM { pages { layout.disabled = 1 alias.disabled =

    1 } tt_content { header_layout { altLabels { 1 = H1 2 = H2 3 = H3 4 = H4 5 = H5 } removeItems = 0,6 } } } sitepackage_starter/Configura?on/PageTS/TCEFORM.txt   Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 17
  15. Register  Page  TSconfig if (!defined('TYPO3_MODE')) { die ('Access denied.'); }

    # \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPageTSConfig(
 # '<INCLUDE_TYPOSCRIPT: source="FILE:EXT:' . $_EXTKEY .
 # '/Configuration/PageTS/TCEFORM.txt">'
 # );
 sitepackage_starter/ext_localconf.php   Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 18
  16. Register  TypoScript  Template if (!defined('TYPO3_MODE')) { die ('Access denied.'); }

    \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile( $_EXTKEY, 'Configuration/TypoScript', 'Site Package' ); sitepackage_starter/ext_tables.php   Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 19
  17. TypoScript  Constants page.template { # cat=sitepackage_starter/file; type=string; label=Frontend templates templateRootPath

    = EXT:sitepackage_starter/Resources/Private/Templates/ # cat=sitepackage_starter/file; type=string; label=Frontend partials partialRootPath = EXT:sitepackage_starter/Resources/Private/Partials/ # cat=sitepackage_starter/file; type=string; label=Frontend layouts layoutRootPath = EXT:sitepackage_starter/Resources/Private/Layouts/ } sitepackage_starter/Configura?on/TypoScript/constants.txt   Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 20
  18. TypoScript  Setup # Require TypoScript from dependencies <INCLUDE_TYPOSCRIPT: source="FILE:EXT:css_styled_content/static/setup.txt"> #

    PAGE - Templates page {
 10 = FLUIDTEMPLATE
 10 {
 layoutRootPath = {$page.template.layoutRootPath}
 partialRootPath = {$page.template.partialRootPath}
 
 file.stdWrap.cObject = CASE
 file.stdWrap.cObject {
 key.data = levelfield:-1, backend_layout_next_level, slide
 key.override.field = backend_layout
 
 default = TEXT
 default.value = {$page.template.templateRootPath}/Pages/Index.html
 }
 }
 } sitepackage_starter/Configura?on/TypoScript/setup.txt   Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 21
  19. TypoScript  Setup # PAGE - Content page {
 10 {


    variables {
 contentNormal < styles.content.get
 contentLeft < styles.content.getLeft
 contentRight < styles.content.getRight
 }
 }
 } sitepackage_starter/Configura?on/TypoScript/setup.txt   Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 22
  20. Include  CSS # PAGE - CSS page {
 includeCSS {


    styles = EXT:sitepackage_starter/Resources/Public/Css/styles.css
 } } sitepackage_starter/Configura?on/TypoScript/setup.txt   Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 23
  21. Include  JavaScripts # PAGE - JavaScripts page {
 includeJSLibs {


    jQuery = //ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js
 jQuery { external = 1 excludeFromConcatenation = 1 disableCompression = 1 } } includeJSFooter {
 styles = EXT:sitepackage_starter/Resources/Public/JavaScript/site.js
 } } sitepackage_starter/Configura?on/TypoScript/setup.txt   Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 24
  22. Custom  ViewHelpers Need  a  dedicated  extension  for  autoloading  to  work

    1 Conven?on  is  to  put  them  into  Classes/ViewHelpers 3 A  site  package  is  a  TYPO3  CMS  extension 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 26
  23. Custom  ContentElements Try  to  re-­‐use  fields  provided  by  E_content  out

     of  the  box 1 Op?onally  add  them  to  the  New  Content  Element  Wizard 4 Avoid  instan?a?ng  a  full  Extbase  Controller  for  simple  elements       3 Can  use  custom  database  tables  if  required 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 27
  24. Backend  Layouts The  view  in  the  page  module  should  resemble

     the  Frontend  structure 1 Can  be  used  to  automa?cally  switch  the  Frontend  template 3 Need  a  „Provider“  to  avoid  requiring  a  database  record 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 28
  25. Grid  Elements Use  for  grid/columnar  output  when  Backend  Layouts  are

     not  flexible  enough 1 Grid  elements  can  be  configured  purely  by  TypoScript 3 Avoid  the  technical  debt,  see  if  custom  content  elements  or  backend  layouts  suffice 2 Watch  out  for  your  colPos  arguments! 4 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 29
  26. More  Components Hooks 1 Services 3 XClasses  for  other  Extensions

    2 User  Func?ons 4 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 30
  27. Best  PracXce Manage  and  version  all  front-­‐end  dependencies 1 Op?mize

     Images 5 Concatenate  and  minify  all  CSS/JS 4 Write  modular  Javascript 3 Pre-­‐  /  Postprocess  your  Stylesheets 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 32
  28. Integra5ng  the  tools  into  a  site  package… Websites  as  a

     TYPO3  CMS  extension Morton  Jonuschat 34
  29. The  SoluXon Bower Sass   +   PostCSS Webpack Imagemin

    Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 35
  30. Bowerize  Assets Keeping  frameworks,  libraries  and  assets  current  has  never

     been  easier 1 Copy  bowerized  assets  to  the  public  directory 4 Integrate  frameworks  and  libraries  into  the  processing  step 3 Don’t  use  bower  components  directly 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 36
  31. Pre-­‐Process  Stylesheets Lots  of  good  op?ons  besides  Sass 1 Define

     a  standard  and  s?ck  to  it 4 Choose  a  speedy  preprocessor 3 Choose  a  processor  that  supports  impor?ng  pure  CSS 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 37
  32. Post-­‐Process  Stylesheets Write  CSS  without  vendor  prefixes  -­‐  use  Autoprefixer

     to  add  them 1 Minify  CSS  for  produc?on 4 Include  source  maps  during  development 3 Inline  assets  using  base64  encoding 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 38
  33. Compile  JavaScripts Modern  JavaScript  consists  of  lots  of  modules  (and

     templates)    as  well  as  different  loaders 1 webpack  is  awesome  in  handling  this  mess   4 Some  dependencies  come  from  external  sources 3 Legacy  JavaScript  makes  a  lot  of  assump?ons  about  the  environment 2 …and  supports  babel  to  transpile  ES2015 5 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 39
  34. Minify  Images Lots  of  file  formats  to  take  into  account

    1 Performance  gains  can  be  HUGE! 4 Image  op?miza?on  is  SLOW! 3 Even  scalable  vector  graphics  need  op?miza?on 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 40
  35. Development  Mode Should  perform  minimum  amount  of  work  when  an

     asset  changes 1 …and  CONVENIENT 4 Needs  to  be  FAST… 3 Conven?on  over  Configura?on 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 42
  36. BrowserSync Effortless  integra?on  using  integrated  proxy 1 Remote  inspector 4

    Interac?on  sync 3 File  sync 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 43
  37. ProducXon  Mode Start  clean 1 Do  the  SLOW  stuff 4

    Fail  hard 3 Regenerate  every  asset 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 45
  38. Release  Procedure Bump  version 1 Create  ZIP  archive  for  extension

    3 Run  produc?on  build 2 Deploy 4 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 48
  39. $ gulp release One  final  command  (deploy  not  included) Websites

     as  a  TYPO3  CMS  extension Morton  Jonuschat 49
  40. Even  the  minimal  setup  is  a  win! Websites  as  a

     TYPO3  CMS  extension Morton  Jonuschat 52
  41. Resources File  system  conven?ons   hEp:/ /docs.typo3.org/typo3cms/CodingGuidelinesReference/FileSystemConven?ons/ 1 Bootstrap  Package

      hEps:/ /github.com/benjaminkoE/bootstrap_package 4 The  Anatomy  of  Sitepackages   hEps:/ /speakerdeck.com/benjaminkoE/the-­‐anatomy-­‐of-­‐typo3-­‐sitepackages 3 Extension  Architecture   hEp:/ /docs.typo3.org/typo3cms/CoreApiReference/ExtensionArchitecture/ 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 56 BackendLayout  Provider   hEps:/ /github.com/georgringer/belayout_fileprovider 5
  42. Licenses CC-­‐BY  2.0   hEps:/ /crea?vecommons.org/licenses/by/2.0/ 1 NASA  Copyright  Policy

      hEp:/ /www.jsc.nasa.gov/policies.html#Guidelines 3 CC-­‐BY-­‐SA  2.0   hEps:/ /crea?vecommons.org/licenses/by-­‐sa/2.0/ 2 Websites  as  a  TYPO3  CMS  extension Morton  Jonuschat 59 Entypo+  Icon  Package  (hEp:/ /www.entypo.com/),  licensed  CC-­‐BY-­‐SA  4.0   hEps:/ /crea?vecommons.org/licenses/by-­‐sa/4.0/ 4 Lato  Font  Family:  SIL  Open  Font  License  1.1   Source  Code  Pro  Font  Family:  Open  Font  License  (OFL) 5