SlideShare une entreprise Scribd logo
1  sur  38
Building a Simple, Responsive
Website with ExpressionEngine
Nick Benson
Senior Front-end Developer, PressEnter
What We’ll Cover…
• Introduction to Templates & Channels
• TwinCities-EE.com Project Overview
• Building a Blog
• Creating RSS Feeds
• Managing Pages
• Metadata Management
• Including Tweets
• Responsive Requirements
Getting Started: Templates
• Templates are what produce the HTML/CSS/RSS
code that is served by ExpressionEngine
• Templates are organized within template groups
• They can be accessed directly via a URL:
example.com/[template group]/[template name]
• They can be embedded within other templates:
{embed=“site/header”}
<h1>Hello World!</h1>
{embed=“site/footer”}
Getting Started: Templates
• Create a template group called “site” to
contain templates that are used across the
site, for things like the header and footer.
• Most projects start with something like this:
– Index (the site’s homepage)
– Page (for “static” pages, like “About Us”)
– Header
– Footer
– Aside
Getting Started: Channels
• Content in ExpressionEngine is organized into
channels (e.g. Presidents)
• Each bit of content is stored within a channel
entry (e.g. Abraham Lincoln)
• Different channel fields can be assigned to a
channel (e.g. birthday, favorite type of hat)
• Fields have different types (e.g. date, text)
• There are loads and loads of add-ons for
different field types (e.g. tags, lists, map
coordinates)
Template + Channel Example
This Template will display all of the channel
entries in our hypothetical presidents channel:
{exp:channel:entries channel=“presidents”}
<h2>{title}</h2>
<h3>Fun Facts</h3>
<ul>
<li>Born in {birthday format=“%y”}</li>
<li>Enjoyed wearing {favorite_hat}</li>
</ul>
{/exp:channel:entries}
Project: TwinCities-EE.com
The Twin Cities ExpressionEngine User Group
needed a website to publish news, event
announcements / summaries, and other
group information in a geek friendly format.
Users are technically savvy and like things like
RSS and iCalendar feeds.
Project: Design Overview
• Navigation
• Side Column
• Main Content
• Tweets
• Sponsors
• Copyright
• Responsive
Blog: Requirements
• Blog will be used to…
– Share Organizational News
– Announce / Summarize Events
• Features
– Tags, Categories, Author Profiles
– Generate RSS & iCalendar Feeds
Blog: Channel Field Setup
Field Label Short Name Field Type Notes
Summary {news_summary} Wyvern WYSIWYG add-on
from Bold Minded
Story {news_story} Wyvern WYSIWYG add-on
from Bold Minded
Author {news_author} Relationship Selects an entry in
another channel.
Tags {news_tags} Tagger Free add-on from
DevDemon.
Revision {news_revision} Reevision Needed to update
iCal feed; Free.
Location {news_location} Text Input Street Address for
iCal feed.
Event Start Date
Event End Date
{news_event_time_start}
{news_event_time_end}
Date One field for start,
another for end.
Blog: Template Setup
• Index
– Display five blog entry summaries per page, paginated
• Category
– Display five blog entry summaries per page, paginated
• Tag
– Display five blog entry summaries per page, paginated
• Entry
– Display a single blog entry, with comments
• News-RSS
– Display all blog entries in RSS format
• Events-RSS
– Display blog entries in “upcoming events” category in RSS format
Blog: Index Template
Template Group: news Template: index
URL: TwinCities-EE.com/news/
{embed="site/.header"}
<section>
{exp:channel:entries channel="news" limit="5" dynamic="no"
paginate="bottom" disable="member_data”}
{snippet_news_summary}
{snippet_news_paginate}
{/exp:channel:entries}
</section>
{embed="site/.aside"}
{embed="site/.footer"}
Blog: Index Template
Template Group: news Template: index
URL: TwinCities-EE.com/news/
{embed="site/.header"}
<section>
{exp:channel:entries channel="news" limit="5" dynamic="no"
paginate="bottom" disable="member_data”}
{snippet_news_summary}
{snippet_news_paginate}
{/exp:channel:entries}
</section>
{embed="site/.aside"}
{embed="site/.footer"}
Blog: Template Setup
• Index
– Display five blog entry summaries per page
• Category
– Display category’s five blog entry summaries per page
• Tag
– Display tag’s five blog entry summaries per page
• Entry
– Display a single blog entry, with comments
• News-RSS
– Display all blog entries in RSS format
• Events-RSS
– Display blog entries in “upcoming events” category in RSS format
Blog: Snippet Summary Setup
Snippet Name: {snippet_news_summary}
<article>
<header>
<h1>{title}</h1>
(a bunch of other tags for date, author, etc…)
</header>
{news_summary}
<p><a href=“{path=“news/{url_title}”}”>Read More</a></p>
</article>
Blog: Index Template
Template Group: news Template: index
URL: TwinCities-EE.com/news/
{embed="site/.header"}
<section>
{exp:channel:entries channel="news" limit="5" dynamic="no"
paginate="bottom" disable="member_data”}
{snippet_news_summary}
{snippet_news_paginate}
{/exp:channel:entries}
</section>
{embed="site/.aside"}
{embed="site/.footer"}
Blog: Index Template
Blog: Category Template
Template Group: news Template: category
URL: TwinCities-EE.com/news/category/example-category-name-here/
{embed="site/.header" meta_title="Category:
{segment_3_category_name}"}
<section>
{exp:channel:entries channel="news" limit="5" paginate="bottom"
category="{segment_3_category_id}" disable="member_data”}
{snippet_news_summary}
{snippet_news_paginate}
{/exp:channel:entries}
</section>
{embed="site/.aside"}
{embed="site/.footer"}
Blog: Category Template
• Categories are natively supported by
ExpressionEngine
• In this case they’re used to classify blog
entries:
– News
– Upcoming Event Announcements
– Past Event Recaps
• Seg2Cat add-on makes working with them
much easier.
Blog: Tag Template
Template Group: news Template: tag
URL: TwinCities-EE.com/news/tag/example-tag-name-here/
{embed="site/.header" meta_title="Tagged: {exp:tagger:tagname
tag="{segment_3}"}"}
<section>
{exp:tagger:entries_quick tag="{segment_3}"}
{exp:channel:entries entry_id="{tagger:entry_ids}" limit="5"
disable="member_data" paginate="bottom"}
{snippet_news_summary}
{snippet_news_paginate}
{/exp:channel:entries}
{/exp:tagger:entries_quick}
</section>
{embed="site/.aside"}
{embed="site/.footer"}
Blog: Tag Template
• Tags are not natively supported by
ExpressionEngine
• There are several add-ons for dealing with
tags; we’ve had good luck with Tagger by Dev
Demon.
Blog: Entry Template
Template Group: news Template: category
URL: TwinCities-EE.com/news/entry/url_title/
{exp:channel:entries disable="member_data,pagination" channel="news"
limit="1"}
{embed="site/.header"}
<section>
<article>
{!-- code you’ve already seen displaying the article --}
</article>
</section>
{embed="site/.aside"}
{embed="site/.footer"}
{/exp:channel:entries}
Blog: RSS Template
Template Group: news Template: news-rss
URL: TwinCities-EE.com/news/news-rss/
• Use ExpressionEngine’s {exp:rss:feed} tag
• Google will reveal several templates that you can modify for
your own use
• Tip: when building a feed, be sure the parameters passed to
{exp:rss:feed} and {exp:channel:entries} are the same.
Blog: Comments
• ExpressionEngine has a native commenting
system… but it’s pretty clunky
• We (and many others) use Disqus instead
– JS based
– Easy to setup
– Robust features
– Free for smaller sites
– Integrates itself pretty well without extra CSS
Blog: iCalendar Template
Template Group: news Template: ical
URL: TwinCities-EE.com/news/ical/
Use the nifty “Easy iCalendar” add-on:
{exp:easy_ical:calendar timezone="America/Chicago”}
{exp:channel:entries channel="news“ limit="20"}
{exp:easy_ical:event uid="{entry_id}"
start_time="{news_event_time_start}" end_time="{news_event_time_end}"
summary="{title}" location="{news_location}" sequence="{news_reevision}"
url=“{path=“/news/{url_title}”}"}
{news_story}
{/exp:easy_ical:event}
{/exp:channel:entries}
{/exp:easy_ical:calendar}
Page Management 101
• For a simple site like ours, we can get away
with a single template for “static” pages like
“About Us”
• Create a channel called “Pages” with a single
entry field, {pages_content}
• Each entry in the pages channel will be a page
• Use a nifty add-on like Wyvern for managing
text fields with a WYSIWYG interface
Attractive URLs
• EE’s normal URL structure is gross looking:
example.com/index.php/template_group/template/url_title
/
• Disable “index.php” with .htaccess
• Eliminate template_group and template by
using a module (pick one)
– Pages (included with ExpressionEngine)
– Structure ($65 add-on with a nifty interface)
Structure
• Donated a copy of their add-on to us, thanks!
• Has a really slick interface that clients like
• Allows nice URLs like: example.com/about
• Has tags for building breadcrumbs and site
navigation
• Allows page hierarchy: example.com/one/two
Structure
Structure
What About Metadata?
• We use the free SEO Lite add-on
• Allows us to set title / description / keywords
for each page and blog post
• If we don’t set title / description keywords for
an entry, it will insert default information per
our settings
• Easy to setup
• Prevents creating extra channel entry fields
SEO Lite + IfElse
Template Group: site Template: .header
{exp:ifelse parse="inward"}
{if "{embed:meta_title}"}
{exp:seo_lite title_override="{embed:meta_title}"}
{if:elseif "{embed:entry_id}"}
{exp:seo_lite entry_id="{embed:entry_id}"}
{if:else}
{exp:seo_lite use_last_segment="yes"}
{/if}
{/exp:ifelse}
Twitter Feeds
• ExpressionEngine has an official, first party
add-on for including tweets within a
template…
• … it doesn’t support twitter lists or multiple
users though…
• …and neither do any of the other add-ons I
investigated
Twitter Feeds
• Twitter offers an advanced search feature that
can retrieve tweets in RSS form that match
several criteria (multiple users, etc.)
• The AJW Feed Parser add-on can display
content from an RSS feed in a template
• The Tweetify add-on will turn URLs,
#hashtags, and @usernames into anchors
RSS + AJW Feed Parser +
Tweetify
Template Group: site Template: .footer-tweets
<article>
<h2><a href="{embed:url}">{embed:title}</a></h2>
{exp:ajw_feedparser url="http://search.twitter.com/search.atom?
q={embed:twitter-query}" cache_refresh="10" limit="1" parse="inward"}
<p>{exp:tweetify}{title}{/exp:tweetify}</p>
<h3>
<a href="{author/uri}">
<img src="{link#2@href}" alt="">
{author/name}
</a>
</h3>
{/exp:ajw_feedparser}
</article>
Make it Speedy
• Only install / enable add-ons that you actually
need and use
• Enable template caching on as many templates
as you can
• Use the Minimee add-on to minifiy and cache
your JS and CSS
• Enable gzip compression via .htaccess
• Use Switchee or IfElse add-ons to keep
conditional stuff from getting out of hand
• Use snippets instead of embeded templates
when possible
Make it Responsive
• Media Queries!
• Include css3-mediaqueries.js if lte IE 8
• Keep the aside markup in a separate template
(not within header or footer)
– Displayed above content on mobile homepage
– Displayed below content on mobile secondary
pages
Thank You!
Nick Benson
Senior Front-end Developer, PressEnter

Contenu connexe

Tendances

Introduction to Web Programming - first course
Introduction to Web Programming - first courseIntroduction to Web Programming - first course
Introduction to Web Programming - first course
Vlad Posea
 
Introduction to HTML5
Introduction to HTML5Introduction to HTML5
Introduction to HTML5
Terry Ryan
 

Tendances (20)

Html5
Html5Html5
Html5
 
JSLink for ITPros - SharePoint Saturday Jersey
JSLink for ITPros - SharePoint Saturday JerseyJSLink for ITPros - SharePoint Saturday Jersey
JSLink for ITPros - SharePoint Saturday Jersey
 
Images, lists and links
Images, lists and linksImages, lists and links
Images, lists and links
 
13 Things Developers Forget When Launching Public Websites
13 Things Developers Forget When Launching Public Websites13 Things Developers Forget When Launching Public Websites
13 Things Developers Forget When Launching Public Websites
 
Html 5
Html 5Html 5
Html 5
 
HTML5
HTML5 HTML5
HTML5
 
SharePoint Publishing 101
SharePoint Publishing 101SharePoint Publishing 101
SharePoint Publishing 101
 
Introduction to Web Programming - first course
Introduction to Web Programming - first courseIntroduction to Web Programming - first course
Introduction to Web Programming - first course
 
Face/Off: APEX Templates & Themes
Face/Off: APEX Templates & ThemesFace/Off: APEX Templates & Themes
Face/Off: APEX Templates & Themes
 
Understanding the Web Page Layout
Understanding the Web Page LayoutUnderstanding the Web Page Layout
Understanding the Web Page Layout
 
Getting to know WordPress
Getting to know WordPressGetting to know WordPress
Getting to know WordPress
 
Arizona WP - Building a WordPress Theme
Arizona WP - Building a WordPress ThemeArizona WP - Building a WordPress Theme
Arizona WP - Building a WordPress Theme
 
SharePoint 2013 Search Driven Sites - SPSHOU
SharePoint 2013 Search Driven Sites - SPSHOUSharePoint 2013 Search Driven Sites - SPSHOU
SharePoint 2013 Search Driven Sites - SPSHOU
 
Chapter 6 - Web Design
Chapter 6 - Web DesignChapter 6 - Web Design
Chapter 6 - Web Design
 
Wordpress SEO Featuring Dave Jesch
Wordpress SEO Featuring Dave JeschWordpress SEO Featuring Dave Jesch
Wordpress SEO Featuring Dave Jesch
 
Introduction to HTML5
Introduction to HTML5Introduction to HTML5
Introduction to HTML5
 
Seocheck
SeocheckSeocheck
Seocheck
 
Html5 Basic Structure
Html5 Basic StructureHtml5 Basic Structure
Html5 Basic Structure
 
HTML Semantic Tags
HTML Semantic TagsHTML Semantic Tags
HTML Semantic Tags
 
An Introduction To HTML5
An Introduction To HTML5An Introduction To HTML5
An Introduction To HTML5
 

En vedette

10 главных мифов об авторском праве
10 главных мифов об авторском праве10 главных мифов об авторском праве
10 главных мифов об авторском праве
hadgiewa
 
#5 inspirational scenes from films
#5 inspirational scenes from films#5 inspirational scenes from films
#5 inspirational scenes from films
debbie14
 
36kr no.94
36kr no.9436kr no.94
36kr no.94
Gina Gu
 
Study risk classification under bsa compliance (uab magazine- october 2012)
Study   risk classification under bsa compliance (uab magazine- october 2012)Study   risk classification under bsa compliance (uab magazine- october 2012)
Study risk classification under bsa compliance (uab magazine- october 2012)
Bachir El-Nakib, CAMS
 
مقرر مصادر التعلم والمعلومات 1435
مقرر مصادر التعلم والمعلومات 1435مقرر مصادر التعلم والمعلومات 1435
مقرر مصادر التعلم والمعلومات 1435
Abdullah Zahrani
 
Lu dina bite jauna
Lu dina bite jaunaLu dina bite jauna
Lu dina bite jauna
egilsdo
 
Asteroïde
AsteroïdeAsteroïde
Asteroïde
thijsp
 
2012 world label awards presentation
2012 world label awards presentation2012 world label awards presentation
2012 world label awards presentation
TLMI
 
Myths[1]final
Myths[1]finalMyths[1]final
Myths[1]final
csosa311
 

En vedette (20)

Track Report & Optimize Your Web Creations
Track Report & Optimize Your Web CreationsTrack Report & Optimize Your Web Creations
Track Report & Optimize Your Web Creations
 
βιβλιογραφία του κ
βιβλιογραφία του κβιβλιογραφία του κ
βιβλιογραφία του κ
 
10 главных мифов об авторском праве
10 главных мифов об авторском праве10 главных мифов об авторском праве
10 главных мифов об авторском праве
 
Marketing project safegard
Marketing project safegardMarketing project safegard
Marketing project safegard
 
βιβλιογραφία του κ
βιβλιογραφία του κβιβλιογραφία του κ
βιβλιογραφία του κ
 
#5 inspirational scenes from films
#5 inspirational scenes from films#5 inspirational scenes from films
#5 inspirational scenes from films
 
36kr no.94
36kr no.9436kr no.94
36kr no.94
 
Study risk classification under bsa compliance (uab magazine- october 2012)
Study   risk classification under bsa compliance (uab magazine- october 2012)Study   risk classification under bsa compliance (uab magazine- october 2012)
Study risk classification under bsa compliance (uab magazine- october 2012)
 
DLIS Versión Final SLSH
DLIS Versión Final SLSHDLIS Versión Final SLSH
DLIS Versión Final SLSH
 
مقرر مصادر التعلم والمعلومات 1435
مقرر مصادر التعلم والمعلومات 1435مقرر مصادر التعلم والمعلومات 1435
مقرر مصادر التعلم والمعلومات 1435
 
Lu dina bite jauna
Lu dina bite jaunaLu dina bite jauna
Lu dina bite jauna
 
Asteroïde
AsteroïdeAsteroïde
Asteroïde
 
UNIZO Lokaal Economisch beleid voor burgemeesters en schepen lokale Economie
UNIZO Lokaal Economisch beleid voor burgemeesters en schepen lokale EconomieUNIZO Lokaal Economisch beleid voor burgemeesters en schepen lokale Economie
UNIZO Lokaal Economisch beleid voor burgemeesters en schepen lokale Economie
 
Corporate Presentation May 2013
Corporate Presentation May 2013Corporate Presentation May 2013
Corporate Presentation May 2013
 
PEPs identification_by_bachir_el_nakib
PEPs identification_by_bachir_el_nakibPEPs identification_by_bachir_el_nakib
PEPs identification_by_bachir_el_nakib
 
The BIG Event - Canadian Mining Expo
The BIG Event - Canadian Mining ExpoThe BIG Event - Canadian Mining Expo
The BIG Event - Canadian Mining Expo
 
2012 world label awards presentation
2012 world label awards presentation2012 world label awards presentation
2012 world label awards presentation
 
Myths[1]final
Myths[1]finalMyths[1]final
Myths[1]final
 
CETPA Winter Training Slides
CETPA Winter Training SlidesCETPA Winter Training Slides
CETPA Winter Training Slides
 
Teknik sampling normalitas data statistika
Teknik sampling normalitas data statistikaTeknik sampling normalitas data statistika
Teknik sampling normalitas data statistika
 

Similaire à Building a Simple, Responsive Website with ExpressionEngine

SharePoint Saturday Belgium 2014 - Using JSLink and Display Templates with th...
SharePoint Saturday Belgium 2014 - Using JSLink and Display Templates with th...SharePoint Saturday Belgium 2014 - Using JSLink and Display Templates with th...
SharePoint Saturday Belgium 2014 - Using JSLink and Display Templates with th...
BIWUG
 

Similaire à Building a Simple, Responsive Website with ExpressionEngine (20)

Working with the Latest Tendenci Modules
Working with the Latest Tendenci ModulesWorking with the Latest Tendenci Modules
Working with the Latest Tendenci Modules
 
Getting a Quick Start with Visualforce
Getting a Quick Start with Visualforce Getting a Quick Start with Visualforce
Getting a Quick Start with Visualforce
 
WordPress Webinar Training Presentation
WordPress Webinar Training PresentationWordPress Webinar Training Presentation
WordPress Webinar Training Presentation
 
WordPress Complete Tutorial
WordPress Complete TutorialWordPress Complete Tutorial
WordPress Complete Tutorial
 
Using WordPress Blogging Features to Build a Website
Using WordPress Blogging Features to Build a WebsiteUsing WordPress Blogging Features to Build a Website
Using WordPress Blogging Features to Build a Website
 
Blog creationguide forestview
Blog creationguide forestviewBlog creationguide forestview
Blog creationguide forestview
 
SUGUK Cambridge - Display Templates & JSLink for IT Pros
SUGUK Cambridge - Display Templates & JSLink for IT ProsSUGUK Cambridge - Display Templates & JSLink for IT Pros
SUGUK Cambridge - Display Templates & JSLink for IT Pros
 
Modern_Site_Owner_M365_Ottawa.pdf
Modern_Site_Owner_M365_Ottawa.pdfModern_Site_Owner_M365_Ottawa.pdf
Modern_Site_Owner_M365_Ottawa.pdf
 
Using js link and display templates
Using js link and display templatesUsing js link and display templates
Using js link and display templates
 
Customizing the Appearance and HTML Output of Visualforce Pages
Customizing the Appearance and HTML Output of VisualforcePages Customizing the Appearance and HTML Output of VisualforcePages
Customizing the Appearance and HTML Output of Visualforce Pages
 
#SPSLondon - Session 2 JSLink for IT Pros
#SPSLondon - Session 2 JSLink for IT Pros#SPSLondon - Session 2 JSLink for IT Pros
#SPSLondon - Session 2 JSLink for IT Pros
 
SharePoint Saturday Belgium 2014 - Using JSLink and Display Templates with th...
SharePoint Saturday Belgium 2014 - Using JSLink and Display Templates with th...SharePoint Saturday Belgium 2014 - Using JSLink and Display Templates with th...
SharePoint Saturday Belgium 2014 - Using JSLink and Display Templates with th...
 
XCC Self Study Guide
XCC Self Study GuideXCC Self Study Guide
XCC Self Study Guide
 
SPSSTHLM - Using JSLink and Display Templates for ITPros
SPSSTHLM - Using JSLink and Display Templates for ITProsSPSSTHLM - Using JSLink and Display Templates for ITPros
SPSSTHLM - Using JSLink and Display Templates for ITPros
 
Spsbe using js-linkanddisplaytemplates
Spsbe   using js-linkanddisplaytemplatesSpsbe   using js-linkanddisplaytemplates
Spsbe using js-linkanddisplaytemplates
 
Wordpress beyond blogging
Wordpress beyond bloggingWordpress beyond blogging
Wordpress beyond blogging
 
Designyourownblog.com On-Site SEO Auidt
Designyourownblog.com On-Site SEO AuidtDesignyourownblog.com On-Site SEO Auidt
Designyourownblog.com On-Site SEO Auidt
 
Wordpress overview
Wordpress overviewWordpress overview
Wordpress overview
 
Creating Landing Pages and Layouts for Drupal 8 - DrupalCon Baltimore
Creating Landing Pages and Layouts for Drupal 8 - DrupalCon BaltimoreCreating Landing Pages and Layouts for Drupal 8 - DrupalCon Baltimore
Creating Landing Pages and Layouts for Drupal 8 - DrupalCon Baltimore
 
Open Source CMS
Open Source CMSOpen Source CMS
Open Source CMS
 

Dernier

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Dernier (20)

Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 

Building a Simple, Responsive Website with ExpressionEngine

  • 1. Building a Simple, Responsive Website with ExpressionEngine Nick Benson Senior Front-end Developer, PressEnter
  • 2. What We’ll Cover… • Introduction to Templates & Channels • TwinCities-EE.com Project Overview • Building a Blog • Creating RSS Feeds • Managing Pages • Metadata Management • Including Tweets • Responsive Requirements
  • 3. Getting Started: Templates • Templates are what produce the HTML/CSS/RSS code that is served by ExpressionEngine • Templates are organized within template groups • They can be accessed directly via a URL: example.com/[template group]/[template name] • They can be embedded within other templates: {embed=“site/header”} <h1>Hello World!</h1> {embed=“site/footer”}
  • 4. Getting Started: Templates • Create a template group called “site” to contain templates that are used across the site, for things like the header and footer. • Most projects start with something like this: – Index (the site’s homepage) – Page (for “static” pages, like “About Us”) – Header – Footer – Aside
  • 5. Getting Started: Channels • Content in ExpressionEngine is organized into channels (e.g. Presidents) • Each bit of content is stored within a channel entry (e.g. Abraham Lincoln) • Different channel fields can be assigned to a channel (e.g. birthday, favorite type of hat) • Fields have different types (e.g. date, text) • There are loads and loads of add-ons for different field types (e.g. tags, lists, map coordinates)
  • 6. Template + Channel Example This Template will display all of the channel entries in our hypothetical presidents channel: {exp:channel:entries channel=“presidents”} <h2>{title}</h2> <h3>Fun Facts</h3> <ul> <li>Born in {birthday format=“%y”}</li> <li>Enjoyed wearing {favorite_hat}</li> </ul> {/exp:channel:entries}
  • 7. Project: TwinCities-EE.com The Twin Cities ExpressionEngine User Group needed a website to publish news, event announcements / summaries, and other group information in a geek friendly format. Users are technically savvy and like things like RSS and iCalendar feeds.
  • 8. Project: Design Overview • Navigation • Side Column • Main Content • Tweets • Sponsors • Copyright • Responsive
  • 9. Blog: Requirements • Blog will be used to… – Share Organizational News – Announce / Summarize Events • Features – Tags, Categories, Author Profiles – Generate RSS & iCalendar Feeds
  • 10. Blog: Channel Field Setup Field Label Short Name Field Type Notes Summary {news_summary} Wyvern WYSIWYG add-on from Bold Minded Story {news_story} Wyvern WYSIWYG add-on from Bold Minded Author {news_author} Relationship Selects an entry in another channel. Tags {news_tags} Tagger Free add-on from DevDemon. Revision {news_revision} Reevision Needed to update iCal feed; Free. Location {news_location} Text Input Street Address for iCal feed. Event Start Date Event End Date {news_event_time_start} {news_event_time_end} Date One field for start, another for end.
  • 11. Blog: Template Setup • Index – Display five blog entry summaries per page, paginated • Category – Display five blog entry summaries per page, paginated • Tag – Display five blog entry summaries per page, paginated • Entry – Display a single blog entry, with comments • News-RSS – Display all blog entries in RSS format • Events-RSS – Display blog entries in “upcoming events” category in RSS format
  • 12. Blog: Index Template Template Group: news Template: index URL: TwinCities-EE.com/news/ {embed="site/.header"} <section> {exp:channel:entries channel="news" limit="5" dynamic="no" paginate="bottom" disable="member_data”} {snippet_news_summary} {snippet_news_paginate} {/exp:channel:entries} </section> {embed="site/.aside"} {embed="site/.footer"}
  • 13. Blog: Index Template Template Group: news Template: index URL: TwinCities-EE.com/news/ {embed="site/.header"} <section> {exp:channel:entries channel="news" limit="5" dynamic="no" paginate="bottom" disable="member_data”} {snippet_news_summary} {snippet_news_paginate} {/exp:channel:entries} </section> {embed="site/.aside"} {embed="site/.footer"}
  • 14. Blog: Template Setup • Index – Display five blog entry summaries per page • Category – Display category’s five blog entry summaries per page • Tag – Display tag’s five blog entry summaries per page • Entry – Display a single blog entry, with comments • News-RSS – Display all blog entries in RSS format • Events-RSS – Display blog entries in “upcoming events” category in RSS format
  • 15. Blog: Snippet Summary Setup Snippet Name: {snippet_news_summary} <article> <header> <h1>{title}</h1> (a bunch of other tags for date, author, etc…) </header> {news_summary} <p><a href=“{path=“news/{url_title}”}”>Read More</a></p> </article>
  • 16. Blog: Index Template Template Group: news Template: index URL: TwinCities-EE.com/news/ {embed="site/.header"} <section> {exp:channel:entries channel="news" limit="5" dynamic="no" paginate="bottom" disable="member_data”} {snippet_news_summary} {snippet_news_paginate} {/exp:channel:entries} </section> {embed="site/.aside"} {embed="site/.footer"}
  • 18. Blog: Category Template Template Group: news Template: category URL: TwinCities-EE.com/news/category/example-category-name-here/ {embed="site/.header" meta_title="Category: {segment_3_category_name}"} <section> {exp:channel:entries channel="news" limit="5" paginate="bottom" category="{segment_3_category_id}" disable="member_data”} {snippet_news_summary} {snippet_news_paginate} {/exp:channel:entries} </section> {embed="site/.aside"} {embed="site/.footer"}
  • 19. Blog: Category Template • Categories are natively supported by ExpressionEngine • In this case they’re used to classify blog entries: – News – Upcoming Event Announcements – Past Event Recaps • Seg2Cat add-on makes working with them much easier.
  • 20. Blog: Tag Template Template Group: news Template: tag URL: TwinCities-EE.com/news/tag/example-tag-name-here/ {embed="site/.header" meta_title="Tagged: {exp:tagger:tagname tag="{segment_3}"}"} <section> {exp:tagger:entries_quick tag="{segment_3}"} {exp:channel:entries entry_id="{tagger:entry_ids}" limit="5" disable="member_data" paginate="bottom"} {snippet_news_summary} {snippet_news_paginate} {/exp:channel:entries} {/exp:tagger:entries_quick} </section> {embed="site/.aside"} {embed="site/.footer"}
  • 21. Blog: Tag Template • Tags are not natively supported by ExpressionEngine • There are several add-ons for dealing with tags; we’ve had good luck with Tagger by Dev Demon.
  • 22. Blog: Entry Template Template Group: news Template: category URL: TwinCities-EE.com/news/entry/url_title/ {exp:channel:entries disable="member_data,pagination" channel="news" limit="1"} {embed="site/.header"} <section> <article> {!-- code you’ve already seen displaying the article --} </article> </section> {embed="site/.aside"} {embed="site/.footer"} {/exp:channel:entries}
  • 23. Blog: RSS Template Template Group: news Template: news-rss URL: TwinCities-EE.com/news/news-rss/ • Use ExpressionEngine’s {exp:rss:feed} tag • Google will reveal several templates that you can modify for your own use • Tip: when building a feed, be sure the parameters passed to {exp:rss:feed} and {exp:channel:entries} are the same.
  • 24. Blog: Comments • ExpressionEngine has a native commenting system… but it’s pretty clunky • We (and many others) use Disqus instead – JS based – Easy to setup – Robust features – Free for smaller sites – Integrates itself pretty well without extra CSS
  • 25. Blog: iCalendar Template Template Group: news Template: ical URL: TwinCities-EE.com/news/ical/ Use the nifty “Easy iCalendar” add-on: {exp:easy_ical:calendar timezone="America/Chicago”} {exp:channel:entries channel="news“ limit="20"} {exp:easy_ical:event uid="{entry_id}" start_time="{news_event_time_start}" end_time="{news_event_time_end}" summary="{title}" location="{news_location}" sequence="{news_reevision}" url=“{path=“/news/{url_title}”}"} {news_story} {/exp:easy_ical:event} {/exp:channel:entries} {/exp:easy_ical:calendar}
  • 26. Page Management 101 • For a simple site like ours, we can get away with a single template for “static” pages like “About Us” • Create a channel called “Pages” with a single entry field, {pages_content} • Each entry in the pages channel will be a page • Use a nifty add-on like Wyvern for managing text fields with a WYSIWYG interface
  • 27. Attractive URLs • EE’s normal URL structure is gross looking: example.com/index.php/template_group/template/url_title / • Disable “index.php” with .htaccess • Eliminate template_group and template by using a module (pick one) – Pages (included with ExpressionEngine) – Structure ($65 add-on with a nifty interface)
  • 28. Structure • Donated a copy of their add-on to us, thanks! • Has a really slick interface that clients like • Allows nice URLs like: example.com/about • Has tags for building breadcrumbs and site navigation • Allows page hierarchy: example.com/one/two
  • 31. What About Metadata? • We use the free SEO Lite add-on • Allows us to set title / description / keywords for each page and blog post • If we don’t set title / description keywords for an entry, it will insert default information per our settings • Easy to setup • Prevents creating extra channel entry fields
  • 32. SEO Lite + IfElse Template Group: site Template: .header {exp:ifelse parse="inward"} {if "{embed:meta_title}"} {exp:seo_lite title_override="{embed:meta_title}"} {if:elseif "{embed:entry_id}"} {exp:seo_lite entry_id="{embed:entry_id}"} {if:else} {exp:seo_lite use_last_segment="yes"} {/if} {/exp:ifelse}
  • 33. Twitter Feeds • ExpressionEngine has an official, first party add-on for including tweets within a template… • … it doesn’t support twitter lists or multiple users though… • …and neither do any of the other add-ons I investigated
  • 34. Twitter Feeds • Twitter offers an advanced search feature that can retrieve tweets in RSS form that match several criteria (multiple users, etc.) • The AJW Feed Parser add-on can display content from an RSS feed in a template • The Tweetify add-on will turn URLs, #hashtags, and @usernames into anchors
  • 35. RSS + AJW Feed Parser + Tweetify Template Group: site Template: .footer-tweets <article> <h2><a href="{embed:url}">{embed:title}</a></h2> {exp:ajw_feedparser url="http://search.twitter.com/search.atom? q={embed:twitter-query}" cache_refresh="10" limit="1" parse="inward"} <p>{exp:tweetify}{title}{/exp:tweetify}</p> <h3> <a href="{author/uri}"> <img src="{link#2@href}" alt=""> {author/name} </a> </h3> {/exp:ajw_feedparser} </article>
  • 36. Make it Speedy • Only install / enable add-ons that you actually need and use • Enable template caching on as many templates as you can • Use the Minimee add-on to minifiy and cache your JS and CSS • Enable gzip compression via .htaccess • Use Switchee or IfElse add-ons to keep conditional stuff from getting out of hand • Use snippets instead of embeded templates when possible
  • 37. Make it Responsive • Media Queries! • Include css3-mediaqueries.js if lte IE 8 • Keep the aside markup in a separate template (not within header or footer) – Displayed above content on mobile homepage – Displayed below content on mobile secondary pages
  • 38. Thank You! Nick Benson Senior Front-end Developer, PressEnter