drupalcamp leuven 2013 - display suite, the future of your display

82
Display suite “The future of your display” Bram “aspilicious” Goffings

Upload: bram-goffings

Post on 24-May-2015

241 views

Category:

Technology


2 download

DESCRIPTION

Improved version of my talk in Hungary.

TRANSCRIPT

Page 1: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Display  suite  “The  future  of  your  display”  

Bram  “aspilicious”  Goffings  

Page 2: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Bram  Goffings  Drupal  developer  @  Nascom  Twi?er:  @aspilicious  D.o:  @aspilicious  Co-­‐maintainer  Display  Suite  Play  a  mean  game  of  table  tennis  

About  me  

Page 3: Drupalcamp Leuven 2013 - Display Suite, the future of your display

What  is  part  of  this  session?  

•  Short  introducJon  to  Display  Suite    •  Demo  

•  Display  Suite  in  D8  

•  How  did  we  manage  to  port  Display  Suite  

•  Which  API’s  did  we  use  

Page 4: Drupalcamp Leuven 2013 - Display Suite, the future of your display

What  is  NOT  part  of  this  session?  

•  40  minute  Display  Suite  tutorial  for  site  builders  

•  Best  pracJces  

Page 5: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Display  Suite?  

Page 6: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Display  Suite!  •  Display  Suite  allows  you  to  take  full  control  over  how  your  content  is  

displayed  using  a  drag  and  drop  interface.    

Page 7: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Display  Suite!  •  Display  Suite  allows  you  to  take  full  control  over  how  your  content  is  

displayed  using  a  drag  and  drop  interface.      •  Allow  developers  to  easily  add  new  elements  to  their  enJty  displays  

Page 8: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Display  Suite!  •  Display  Suite  allows  you  to  take  full  control  over  how  your  content  is  

displayed  using  a  drag  and  drop  interface.      •  Allow  developers  to  easily  add  new  elements  to  their  enJty  displays  

•  Take  full  control  over  the  generated  html  on  enJty  AND  field  level  

Page 9: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Display  Suite!  •  Display  Suite  allows  you  to  take  full  control  over  how  your  content  is  

displayed  using  a  drag  and  drop  interface.      •  Allow  developers  to  easily  add  new  elements  to  their  enJty  displays  

•  Take  full  control  over  the  generated  html  on  enJty  AND  field  level.  Without  wriJng  custom  templates.  

Page 10: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Demo  

Page 11: Drupalcamp Leuven 2013 - Display Suite, the future of your display

What  has  changed?  (code  wise)  

Page 12: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)    

•  Display  Suite  seWngs  are  stored  in  configuraJon  files  

•  Custom  fields  made  in  the  UI  are  saved  in  configuraJon  files    

•  Custom  field  and  region  classes  are  saved  in  configuraJon  files    •  …  

Page 13: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)  

 Example  1:  ds.seWngs.yml  

   #  ds.config.yml    field_template:  '0'    .-­‐default:  theme_field    .-­‐kill-­‐colon:  '0’  

 

Page 14: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)  

Example  2:  fields  made  in  the  UI    

 #  ds.field.test.yml    proper:es:        code:            value:  test            format:  ds_code          use_token:  0    field:  test    label:  test    ui_limit:  ''    en::es:        node:  node    field_type:  code_field  

 

Page 15: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)  

•  ConfiguraJon  schema’s  added  for  each  config  file  

Page 16: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)  

•  ConfiguraJon  schema’s  added  for  each  config  file  

•  Helps  the  mulJlingual  iniJaJve  

Page 17: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)  Example:  config.schema.yml  

ds.seWngs:      type:  mapping      label:  'Display  Suite  seWngs'      mapping:          disable:              type:  boolean              label:  'Disable  Display  Suite  a?aching  fields'          addiJonal_seWngs__acJve_tab:              label:  'AcJve  tab'          field_template:              type:  boolean              label:  'Uses  field  templates'          a-­‐default:              label:  'The  default  template'          a-­‐kill-­‐colon:              type:  boolean              label:  'Kill  the  label  colon'      

Page 18: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)  Example:  config.schema.yml  

ds.seWngs:      type:  mapping      label:  'Display  Suite  seWngs'      mapping:          disable:              type:  boolean              label:  'Disable  Display  Suite  a?aching  fields'          addiJonal_seWngs__acJve_tab:              label:  'AcJve  tab'          field_template:              type:  boolean              label:  'Uses  field  templates'          a-­‐default:              label:  'The  default  template'          a-­‐kill-­‐colon:              type:  boolean              label:  'Kill  the  label  colon'      

Page 19: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)  

h?ps://drupal.org/project/config_inspector  

Page 20: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)  

   

Gains  for  Display  Suite?      

Page 21: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)  

 Everything  is  exportable!  

 

Page 22: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)  

 Everything  is  exportable!  

 ConfiguraJon  is  translatable!  

 

Page 23: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ConfiguraJon  management  (cmi)  

 Everything  is  exportable!  

 ConfiguraJon  is  translatable!  

 ConfiguraJon  schema’s  add  useful  metadata!  

 

Page 24: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Twig  

     

Drupal  8  uses  twig!    

 

Page 25: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Twig  

 Drupal  8  uses  twig!  

   

Display  Suite  uses  twig!    

 

Page 26: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Twig    Display  Suite  one-­‐col  layout  

{#  /**    *  @file    *  Display  Suite  1  column  template.    *    *  Available  variables:    *  -­‐  ds_content_wrapper:  @todo    *  -­‐  a?ributes:  @todo    *  -­‐  Jtle_suffix:  @todo    *  -­‐  ds_content:  @todo    */  #}  <{{  ds_content_wrapper  }}  class="ds-­‐1col  {{  a?ributes.class  }}  clearfix"  {{  a?ributes  }}  >            {%  if  Jtle_suffix.contextual_links  is  not  null  %}          {{  Jtle_suffix.contextual_links  }}      {%  endif  %}        {{  ds_content  }}  </{{  ds_content_wrapper  }}>    {%  if  drupal_render_children  is  not  null  %}      {{  drupal_render_children  }}  {%  endif  %}  

Page 27: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Twig    Display  Suite  one-­‐col  layout  

{#  /**    *  @file    *  Display  Suite  1  column  template.    *    *  Available  variables:    *  -­‐  ds_content_wrapper:  @todo    *  -­‐  a?ributes:  @todo    *  -­‐  Jtle_suffix:  @todo    *  -­‐  ds_content:  @todo    */  #}  <{{  ds_content_wrapper  }}  class="ds-­‐1col  {{  a?ributes.class  }}  clearfix"  {{  a?ributes  }}  >            {%  if  Jtle_suffix.contextual_links  is  not  null  %}          {{  Jtle_suffix.contextual_links  }}      {%  endif  %}        {{  ds_content  }}  </{{  ds_content_wrapper  }}>    {%  if  drupal_render_children  is  not  null  %}      {{  drupal_render_children  }}  {%  endif  %}  

ç  comments  

Page 28: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Twig    Display  Suite  one-­‐col  layout  

{#  /**    *  @file    *  Display  Suite  1  column  template.    *    *  Available  variables:    *  -­‐  ds_content_wrapper:  @todo    *  -­‐  a?ributes:  @todo    *  -­‐  Jtle_suffix:  @todo    *  -­‐  ds_content:  @todo    */  #}  <{{  ds_content_wrapper  }}  class="ds-­‐1col  {{  a?ributes.class  }}  clearfix"  {{  a?ributes  }}  >            {%  if  Jtle_suffix.contextual_links  is  not  null  %}          {{  Jtle_suffix.contextual_links  }}      {%  endif  %}        {{  ds_content  }}  </{{  ds_content_wrapper  }}>    {%  if  drupal_render_children  is  not  null  %}      {{  drupal_render_children  }}  {%  endif  %}  

ç  Contextual  links  support  

Page 29: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Twig    Display  Suite  one-­‐col  layout  

{#  /**    *  @file    *  Display  Suite  1  column  template.    *    *  Available  variables:    *  -­‐  ds_content_wrapper:  @todo    *  -­‐  a?ributes:  @todo    *  -­‐  Jtle_suffix:  @todo    *  -­‐  ds_content:  @todo    */  #}  <{{  ds_content_wrapper  }}  class="ds-­‐1col  {{  a?ributes.class  }}  clearfix"  {{  a?ributes  }}  >            {%  if  Jtle_suffix.contextual_links  is  not  null  %}          {{  Jtle_suffix.contextual_links  }}      {%  endif  %}        {{  ds_content  }}  </{{  ds_content_wrapper  }}>    {%  if  drupal_render_children  is  not  null  %}      {{  drupal_render_children  }}  {%  endif  %}  

ç  DS  form  support  

Page 30: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Twig    Display  Suite  one-­‐col  layout  

{#  /**    *  @file    *  Display  Suite  1  column  template.    *    *  Available  variables:    *  -­‐  ds_content_wrapper:  @todo    *  -­‐  a?ributes:  @todo    *  -­‐  Jtle_suffix:  @todo    *  -­‐  ds_content:  @todo    */  #}  <{{  ds_content_wrapper  }}  class="ds-­‐1col  {{  a?ributes.class  }}  clearfix"  {{  a?ributes  }}  >            {%  if  Jtle_suffix.contextual_links  is  not  null  %}          {{  Jtle_suffix.contextual_links  }}      {%  endif  %}        {{  ds_content  }}  </{{  ds_content_wrapper  }}>    {%  if  drupal_render_children  is  not  null  %}      {{  drupal_render_children  }}  {%  endif  %}  

Actual  template!  

Page 31: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Twig  

     

Drush  layout  script  is  working!      

Page 32: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Twig  

   

Example:  drush  ds-­‐build  "My  layout  name"  

   

Page 33: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Twig  

   

Gains  for  Display  Suite?      

Page 34: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Twig  

 Not  much,  but  core  won’t  render  PHP  templates  

 Templates  are  “cleaner”  

 We  can  please  the  frontend  people!  

 

Page 35: Drupalcamp Leuven 2013 - Display Suite, the future of your display

RouJng,  controllers  and  Symfony    •  Converted  hook_menu  to  the  new  rouJng  system  •  Converted  procedural  callbacks  to  controller  classes  •  Converted  form  callbacks  to  form  classes  •  Made  use  of  the  symfony  request  objects.  •  …  

Page 36: Drupalcamp Leuven 2013 - Display Suite, the future of your display

RouJng,  controllers  and  Symfony    

 I  need  a  few  hours  to  go  through  all  the  changes.  

Page 37: Drupalcamp Leuven 2013 - Display Suite, the future of your display

RouJng,  controllers  and  Symfony    

 I  need  a  few  hours  to  go  through  all  the  changes.  

 Browse  through  the  Display  Suite  UI  module  source  code  if  you’re  curious  how  the  rouJng  system  is  working  in  D8  now.  

Page 38: Drupalcamp Leuven 2013 - Display Suite, the future of your display

RouJng,  controllers  and  Symfony    

 I  need  a  few  hours  to  go  through  all  the  changes.  

 Browse  through  the  Display  Suite  UI  module  source  code  if  you’re  curious  how  the  rouJng  system  is  working  in  D8  now.  

 The  router  stuff  will  sJll  change  a  lot  before  Drupal  8  is  released.  

Page 39: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Plugins  

Page 40: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Plugins      

Display  suite  uses  plugins  for  custom  fields  wri?en  in  code    

Page 41: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Plugins      

Display  suite  uses  plugins  for  custom  fields  wri?en  in  code    

Plugins  replace  hook_ds_fields_info    

Page 42: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Plugins      

Display  suite  uses  plugins  for  custom  fields  wri?en  in  code    

Plugins  replace  hook_ds_fields_info    

Hook_ds_fields_info_alter  sJll  exists    

Page 43: Drupalcamp Leuven 2013 - Display Suite, the future of your display

What  is  a  DS  field  plugin?  

Page 44: Drupalcamp Leuven 2013 - Display Suite, the future of your display

What  is  a  DS  field  plugin?      

A  class  that  implements  the  DsFieldInterface  interface  

Page 45: Drupalcamp Leuven 2013 - Display Suite, the future of your display

What  is  a  DS  field  plugin?      

A  class  that  implements  the  DsFieldInterface  interface  

 Placed  in  the  DsField  namespace  

 

namespace  Drupal\<module>\Plugin\DsField;  

Page 46: Drupalcamp Leuven 2013 - Display Suite, the future of your display

What  is  a  DS  field  plugin?      

A  class  that  implements  the  DsFieldInterface  interface  

 Placed  in  the  DsField  namespace  

 

namespace  Drupal\<module>\Plugin\DsField;      

What  does  that  mean???  

Page 47: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Let’s  build  an  example  module  to  find  out!!  

Page 48: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ds_example.info.yml  name:  'Display  Suite  example'  descripJon:  'My  first  awesome  field  plugin'  type:  module  core:  8.x  package:  'Display  Suite'  

 

Page 49: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ds_example.info.yml  name:  'Display  Suite  example'  descripJon:  'My  first  awesome  field  plugin'  type:  module  core:  8.x  package:  'Display  Suite'  

 

Page 50: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ds_example.module  <?php  

 

Page 51: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ds_example.module  <?php  

 

Seriously?  

Page 52: Drupalcamp Leuven 2013 - Display Suite, the future of your display

ds_example.module  <?php  

 

Seriously?      

Yeah…  ;-­‐(    But  hopefully  we  can  make  this  file  opJonal  soon.  

Page 53: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  

Page 54: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  •  A  field  that  prints  hello  

Page 55: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  •  A  field  that  prints  hello  •  Place  inside  the  Drupal\<module>\Plugin\DsField  namespace  

Page 56: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  •  A  field  that  prints  hello  •  Place  inside  the  Drupal\ds_example\Plugin\DsField  namespace  

Page 57: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  •  A  field  that  prints  hello  •  Place  inside  the  Drupal\ds_example\Plugin\DsField  namespace  

Page 58: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  •  A  field  that  prints  hello  •  Place  inside  the  Drupal\ds_example\Plugin\DsField  namespace  

That  are  a  lot  of  directories!!  

Page 59: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  •  A  field  that  prints  hello  •  Place  inside  the  Drupal\ds_example\Plugin\DsField  namespace  

That  are  a  lot  of  directories!!    

Get  used  to  it  J  

Page 60: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  <?php    namespace  Drupal\ds_example\Plugin\DsField;    use  Drupal\Core\AnnotaJon\TranslaJon;  use  Drupal\ds\AnnotaJon\DsField;  use  Drupal\ds\Plugin\DsField\DsFieldBase;    /**    *  @DsField(    *      id  =  "hello",    *      Jtle  =  @TranslaJon("Hello"),    *      enJty_type  =  "node”    *  )    */  class  Hello  extends  DsFieldBase  {        public  funcJon  render($field)  {          return  "hello";      }    }    

Page 61: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  <?php    namespace  Drupal\ds_example\Plugin\DsField;    use  Drupal\Core\AnnotaJon\TranslaJon;  use  Drupal\ds\AnnotaJon\DsField;  use  Drupal\ds\Plugin\DsField\DsFieldBase;    /**    *  @DsField(    *      id  =  "hello",    *      Jtle  =  @TranslaJon("Hello"),    *      enJty_type  =  "node”    *  )    */  class  Hello  extends  DsFieldBase  {        public  funcJon  render($field)  {          return  "hello";      }    }    

Page 62: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  <?php    namespace  Drupal\ds_example\Plugin\DsField;    use  Drupal\Core\AnnotaJon\TranslaJon;  use  Drupal\ds\AnnotaJon\DsField;  use  Drupal\ds\Plugin\DsField\DsFieldBase;    /**    *  @DsField(    *      id  =  "hello",    *      Jtle  =  @TranslaJon("Hello"),    *      enJty_type  =  "node”    *  )    */  class  Hello  extends  DsFieldBase  {        public  funcJon  render($field)  {          return  "hello";      }    }    

Page 63: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  <?php    namespace  Drupal\ds_example\Plugin\DsField;    use  Drupal\Core\AnnotaJon\TranslaJon;  use  Drupal\ds\AnnotaJon\DsField;  use  Drupal\ds\Plugin\DsField\DsFieldBase;    /**    *  @DsField(    *      id  =  "hello",    *      Jtle  =  @TranslaJon("Hello"),    *      enJty_type  =  "node”    *  )    */  class  Hello  extends  DsFieldBase  {        public  funcJon  render($field)  {          return  "hello";      }    }    

Page 64: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  <?php    namespace  Drupal\ds_example\Plugin\DsField;    use  Drupal\Core\AnnotaJon\TranslaJon;  use  Drupal\ds\AnnotaJon\DsField;  use  Drupal\ds\Plugin\DsField\DsFieldBase;    /**    *  @DsField(    *      id  =  "hello",    *      Jtle  =  @TranslaJon("Hello"),    *      enJty_type  =  "node”    *  )    */  class  Hello  extends  DsFieldBase  {        public  funcJon  render($field)  {          return  "hello";      }    }    

Page 65: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  <?php    namespace  Drupal\ds_example\Plugin\DsField;    use  Drupal\Core\AnnotaJon\TranslaJon;  use  Drupal\ds\AnnotaJon\DsField;  use  Drupal\ds\Plugin\DsField\DsFieldBase;    /**    *  @DsField(    *      id  =  "hello",    *      Jtle  =  @TranslaJon("Hello"),    *      enJty_type  =  "node”    *  )    */  class  Hello  extends  DsFieldBase  {        public  funcJon  render($field)  {          return  "hello";      }    }    

Page 66: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Hello  plugin  <?php    namespace  Drupal\ds_example\Plugin\DsField;    use  Drupal\Core\AnnotaJon\TranslaJon;  use  Drupal\ds\AnnotaJon\DsField;  use  Drupal\ds\Plugin\DsField\DsFieldBase;    /**    *  @DsField(    *      id  =  "hello",    *      Jtle  =  @TranslaJon("Hello"),    *      enJty_type  =  "node”    *  )    */  class  Hello  extends  DsFieldBase  {        public  funcJon  render($field)  {          return  "hello";      }    }    

Page 67: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Plugins  

   

Gains  for  Display  Suite?  

Page 68: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Plugins  

 DX++  

Page 69: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Plugins  

 DX++    

Reusable  plugins  

Page 70: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Plugins  

 DX++    

Reusable  plugins    

Easy  to  write  dynamic  ds  fields  

Page 71: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Drush  plugin  generator  

 Lots  of  boilerplate  code!  

Page 72: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Drush  plugin  generator  

 Lots  of  boilerplate  code!  

 Prone  to  copy  paste  errors!  

Page 73: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Drush  plugin  generator  

 Lots  of  boilerplate  code!  

 Prone  to  copy  paste  errors!  

 Drush  to  the  recue!  

 

Page 74: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Drush  plugin  generator  

   

Example:  drush  ds-­‐field  "MyField"  

Page 75: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Other  funcJonal  changes?  

Page 76: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Other  funcJonal  changes?  

     

Display  Suite  PHP  code  forma?er…  

Page 77: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Other  funcJonal  changes?  

     

Display  Suite  PHP  code  forma?er…  

Page 78: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Other  funcJonal  changes?  

     

Display  Suite  token  forma?er!      

(work  in  progress)  

Page 79: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Demo  (part  2)  

Page 80: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Please  test  it!    

and  file  a  bug  report  when  it  fails*  

*  When  filing  a  bug  report,  be  sure  it  isn’t  filed  yet.  Try  to  be  as  specific  as  possible.  Don’t  run  Display  Suite  on  a  “real”  drupal  8  site  yet  (if  they  exist).  Stuff  could  break.  We  are  not  responsible  for  the  mental  pain  a  broken  Display  Suite  module  causes  when  there  isn’t  an  official  release  yet.  Not  everything  is  converted  yet,  you  can  ask  us  in  irc  if  you’re  in  doubt.  

Page 81: Drupalcamp Leuven 2013 - Display Suite, the future of your display

 “Keeping  up  with  D8  core    takes  10  minutes  a  week    

once  the  iniJal  port  is  done!    So  start  porJng  your  modules  now!”  

Page 82: Drupalcamp Leuven 2013 - Display Suite, the future of your display

Your  quesJons?!