dominate the theme layer

95
DOMINATE THE THEME LAYER August 21st.

Upload: jesper-woldiche

Post on 25-Dec-2014

1.045 views

Category:

Technology


0 download

DESCRIPTION

Drupal's theming layer is a powerful and beautiful beast, but it requires a firm hand to really behave. New themers often start out trying to control it with a light touch and gentle strokes of CSS. Only too late do they realize their error… All too often the result of this misguided approach is bloated and inefficient CSS and JavaScript and site out of control. By the time the themer realizes what the beast have done, it might be too late to fix. Don't let Contrib bully you around. Grab the reins, create a frontend architecture and teach the theming layer to produce lean, extendable, high performance markup and CSS that is easy and cost-efficient to maintain. This session is about learning to take charge.

TRANSCRIPT

Page 1: Dominate The Theme Layer

DOMINATE THE THEME LAYER August 21st.

Page 2: Dominate The Theme Layer

Jesper Wøldiche Rahkonen

Themer / architect at Bysted. Markup Marine / Journalist / Frontend United /

@woeldiche

Page 3: Dominate The Theme Layer

BEFORE WE GET STARTED… Last chance to run.

Page 4: Dominate The Theme Layer

Focus on the themer.

Page 5: Dominate The Theme Layer

It’s just OOCSS. Or smacss.

Page 6: Dominate The Theme Layer

There will be slides with code.

Page 7: Dominate The Theme Layer

There will be (more) slides without code.

Page 8: Dominate The Theme Layer

Presenter will be opinionated.

Page 9: Dominate The Theme Layer

Code available on Github.

Page 10: Dominate The Theme Layer

IN THIS SESSION. A quick outline.

Page 11: Dominate The Theme Layer

A beautiful beast. But a still a beast.

Page 12: Dominate The Theme Layer

Submissive markup is efficient markup.

Page 13: Dominate The Theme Layer

Overview of the session.

1 - The gentle way.

2 - The dominating way.

3 - Submissive markup in four easy steps.

4 - Tools of domination.

Page 14: Dominate The Theme Layer

DANGERS OF A GENTLE TOUCH. A common approach.

Page 15: Dominate The Theme Layer

Don’t let contrib trick you.

Page 16: Dominate The Theme Layer

Results

> Bloated css

Page 17: Dominate The Theme Layer

Results

> Bloated css

> Tied to markup

Page 18: Dominate The Theme Layer

Results

> Bloated css

> Tied to markup

> Low extensibility

Page 19: Dominate The Theme Layer

Results

> Bloated css

> Tied to markup

> Low extensibility

> High maintenance

Page 20: Dominate The Theme Layer

COMMON PITFALLS Stuff you don’t want to do, really.

Page 21: Dominate The Theme Layer

Style by Drupal module

#form-­‐campaignmonitor-­‐signup  h2  {      Styles  don’t  go  here…  }    

Page 22: Dominate The Theme Layer

Style by Drupal module #form-­‐campaignmonitor-­‐signup  h2  a  {      Styles  don’t  go  here…  }  

 

Low extensibility.

Page 23: Dominate The Theme Layer

Style by Drupal module #form-­‐campaignmonitor-­‐signup  h2  a  {      Styles  don’t  go  here…  }  

 

Low extensibility.

Same block, different visuals.

Page 24: Dominate The Theme Layer

Style by page or content type

body.page-­‐article  h2  a  {      Styles  don’t  go  here…  }  

#maincontent  .meta  a  {      Styles  don’t  go  here…  }  

Page 25: Dominate The Theme Layer

Style by page or content type body.page-­‐article  h2  a  {      Styles  don’t  go  here…  }  

#maincontent  .meta  a  {      Styles  don’t  go  here…  }  

Redundant code.

Page 26: Dominate The Theme Layer

Style by page or content type body.page-­‐article  h2  a  {      Styles  don’t  go  here…  }  

#maincontent  .meta  a  {      Styles  don’t  go  here…  }  

Redundant code.

Expensive to maintain.

Page 27: Dominate The Theme Layer

Using tags as selectors

.node  .node-­‐meta  span  {      Styles  don’t  go  here…  }  

Page 28: Dominate The Theme Layer

Using tags as selectors .node  .node-­‐meta  span  {      Styles  don’t  go  here…  }  

Ties styles to markup. Harder to re-use.

Page 29: Dominate The Theme Layer

Using tags as selectors .node  .node-­‐meta  span  {      Styles  don’t  go  here…  }  

Ties styles to markup. Harder to re-use.

Sometimes the date is <p>, sometimes <span>,  sometimes <data>  

Page 30: Dominate The Theme Layer

Using tags as selectors .node  .node-­‐meta  span  {      Styles  don’t  go  here…  }  

Ties styles to markup. Harder to re-use.

Sometimes the date is <p>, sometimes <span>, sometimes <data>

<a>, <img>  etc. are the exceptions.

Page 31: Dominate The Theme Layer

Styling headings by tag

h1  {  Styles  don’t  go  here…  }  

h2  {  Styles  don’t  go  here…  }  

h3  {  Styles  don’t  go  here…  }

Page 32: Dominate The Theme Layer

Styling headings by tag h1  {  Styles  don’t  go  here…  }  h2  {  Styles  don’t  go  here…  }  h3  {  Styles  don’t  go  here…  }  

Visual hierarchy will not always match outline

Page 33: Dominate The Theme Layer

Styling headings by tag h1  {  Styles  don’t  go  here…  }  h2  {  Styles  don’t  go  here…  }  h3  {  Styles  don’t  go  here…  }  

Visual hierarchy will not always match outline

Low portability

Page 34: Dominate The Theme Layer

Styling headings by tag h1  {  Styles  don’t  go  here…  }  h2  {  Styles  don’t  go  here…  }  h3  {  Styles  don’t  go  here…  }  

Visual hierarchy will not always match outline

Low portability

All your headings might be <h1>  

Page 35: Dominate The Theme Layer

DOMINATE YOUR MARKUP! Trust me, it wants a firm hand…

Page 36: Dominate The Theme Layer

Create architecture based on design and business logic.

Page 37: Dominate The Theme Layer

Build web systems. extensible, robust, portable.

Page 38: Dominate The Theme Layer

Style objects, not elements and pages.

Page 39: Dominate The Theme Layer

Invest time for domination.

Page 40: Dominate The Theme Layer

It pays off.

Page 41: Dominate The Theme Layer

It pays off

Lower maintenance,

Page 42: Dominate The Theme Layer

It pays off

Lower maintenance,

Cheaper introduction of new features.

Page 43: Dominate The Theme Layer

It pays off

Lower maintenance,

Cheaper introduction of new features.

Leaner css and faster front-end.

Page 44: Dominate The Theme Layer

Submissive markup in four easy steps.

Analyze design and specs.

Streamline and feedback with designer/client.

Define objects and layout.

Dominate and add styling hooks to markup.

Page 45: Dominate The Theme Layer

ANALYZE Analyze design and specification.

Page 46: Dominate The Theme Layer

Look beyond the markup and modules.

Page 47: Dominate The Theme Layer
Page 48: Dominate The Theme Layer
Page 49: Dominate The Theme Layer

Identify recurring patterns.

Page 50: Dominate The Theme Layer
Page 51: Dominate The Theme Layer
Page 52: Dominate The Theme Layer
Page 53: Dominate The Theme Layer
Page 54: Dominate The Theme Layer

Structural patterns.

Page 55: Dominate The Theme Layer
Page 56: Dominate The Theme Layer

Visual patterns.

Page 57: Dominate The Theme Layer
Page 58: Dominate The Theme Layer

Variations.

Page 59: Dominate The Theme Layer
Page 60: Dominate The Theme Layer

Bring the designer onboard. And strategist.

Page 61: Dominate The Theme Layer

STREAMLINE Time to make your mark.

Page 62: Dominate The Theme Layer

Streamline variations of common objects.

Page 63: Dominate The Theme Layer

Option 1: Unify.

Page 64: Dominate The Theme Layer

Option 2: Define rules for the variations.

Page 65: Dominate The Theme Layer

DEFINE Define objects and structure.

Page 66: Dominate The Theme Layer

Define objects from patterns.

Page 67: Dominate The Theme Layer
Page 68: Dominate The Theme Layer

SMACSS.

Page 69: Dominate The Theme Layer

A suggested system

Variations.

Style.

Typography.

Structure.

Grids.

Page 70: Dominate The Theme Layer

[Photo: Print with handwritten notes.]

Page 71: Dominate The Theme Layer
Page 72: Dominate The Theme Layer
Page 73: Dominate The Theme Layer

DOMINATE Let there be code…

Page 74: Dominate The Theme Layer

Go with classes for web systems.

Page 75: Dominate The Theme Layer

Use low specificity

Page 76: Dominate The Theme Layer

Layer your objects. <aside  class=“block-­‐sec  st-­‐alternate  grid-­‐2”>      <h1  class=“title-­‐block”>Title</h1>      <div  class=“text-­‐sec”>          Content  goes  here.      </div>      </aside>      

Page 77: Dominate The Theme Layer

So… Analyze Streamline Define Dominate!

Page 78: Dominate The Theme Layer

TOOLS OF DOMINATION Let’s sink those styling hooks in.

Page 79: Dominate The Theme Layer

It’s a matter of class.

Page 80: Dominate The Theme Layer

Back to Views.

Get it right to begin with.

Page 81: Dominate The Theme Layer

The scary render arrays.

Page 82: Dominate The Theme Layer

All-in-three tools for domination $vars['classes_array']  $vars['title_attributes_array']['class']  $vars[’content_attributes_array']['class']      

Page 83: Dominate The Theme Layer

The result. <aside  class=“$vars['classes_array']”>      <h1  $vars['title_attributes_array']>Title</h1>      <div  $vars['content_attributes_array']>          Content  goes  here.      </div>      </aside>      

Page 84: Dominate The Theme Layer

function  MYTHEME_preprocess_field  (&$vars,$hook)  {      //add  class  to  a  specific  field      switch  ($vars['element']['#field_name'])  {          case  'field_summary':              $vars['classes_array'][]  =  'text-­‐teaser';              break;            case  'field_location':          case  'field_date':          case  'field_price’:          case  'field_website’:              $vars['classes_array'][]  =  'list-­‐definition’;            case  'field_deadline':                  case  'body':              $vars['classes_array'][]  =  'text-­‐content';              break;      }  }  

Page 85: Dominate The Theme Layer

Conditions. function  MYTHEME_preprocess_panels_pane  (&$vars)  {      //  Add  styling  classes  to  fields  as  panes.      if  ($vars['pane']-­‐>type  ==  'entity_field')  {            //  Switch  by  field  name.          switch  ($vars['content']['#field_name'])  {              case  ‘field_name’:                  $vars['title_attributes_array']['class'][]  =  ’key’;                  …  

       }      }  }    

Page 86: Dominate The Theme Layer

What makes you switch? Field name Block name Defining module View mode Region Path Combinations

Page 87: Dominate The Theme Layer

Pick a function, any function. template_preprocess_page, template_preprocess_html, template_preprocess_block, template_preprocess_region, template_preprocess_field, template_preprocess_panels_pane.

Page 88: Dominate The Theme Layer

THE ODD THREES OUT. Someone’s special.

Page 89: Dominate The Theme Layer

Menus. function  theme_menu_tree__MENU_NAME  ($vars)  {      return  '<ul  class=”CUSTOM_CLASS">'  .  $vars['tree']  .  '</ul>';  }  

Page 90: Dominate The Theme Layer

Multi fields.

Page 91: Dominate The Theme Layer

Forms.

Only thing* scarier than ordinary render arrays.

Page 92: Dominate The Theme Layer

CONCLUSION. So…

Page 93: Dominate The Theme Layer

Thank you!

Slides bit.ly/dominate-theme

Tools for domination github.com/woeldiche/domination_tools

Fireworks stencils github.com/woeldiche/markup_stencils

Page 94: Dominate The Theme Layer

Tell me what you think. bit.ly/dominate-theme munich2012.drupal.org /program /sessions /dominate-theme-layer @woeldiche

Page 95: Dominate The Theme Layer

Images

Chain http://commons.wikimedia.org/wiki/File:Twisted_link_chain.jpg