add-on development: ee expects that every developer will do his duty

86
Add-On Development: EE Expects that Every Developer will do his Duty Paul Burdick, Lead Developer solspace http://solspace.com/downloads/eeci2009/presentation.txt

Upload: leslie-doherty

Post on 14-Jul-2015

2.696 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Add-On Development: EE Expects that Every Developer will do his Duty

Add-On Development:EE Expects that Every

Developer will do his Duty

Paul Burdick, Lead Developer

solspace

http://solspace.com/downloads/eeci2009/presentation.txt

Page 2: Add-On Development: EE Expects that Every Developer will do his Duty

Summary of Talk

• What are Add-Ons?

• The Three Types of Add-Ons in EE

• Overview of Accessories in EE 2.x

• Add-On Development Skills

• Developing Add-Ons in ExpressionEngine

• Writing Code

• Debugging & Improving Performance

Page 3: Add-On Development: EE Expects that Every Developer will do his Duty

Summary of Talk

• What are Add-Ons?

• The Three Types of Add-Ons in EE

• Overview of Accessories in EE 2.x

• Add-On Development Skills

• Developing Add-Ons in ExpressionEngine

• Writing Code

• Debugging & Improving Performance

Page 4: Add-On Development: EE Expects that Every Developer will do his Duty

I.What are Add-Ons?

Page 5: Add-On Development: EE Expects that Every Developer will do his Duty

Three Types of Add-Ons in EE 1.x and 2.x

• Extensions

• Modules

• Plugins

Page 6: Add-On Development: EE Expects that Every Developer will do his Duty

Extensions

Page 7: Add-On Development: EE Expects that Every Developer will do his Duty

• Extends the base functionality of ExpressionEngine

• Allows developers to interpose their own code into EE's codebase.

• Restrained by where hooks are placed in the code and what arguments are sent with the extension call

Page 8: Add-On Development: EE Expects that Every Developer will do his Duty

• More and more Third Party developers are adding hooks to their own code, allowing extensions for Third Party Add-Ons. Pretty darn cool.

• Typically no DB tables, but there are always exceptions

• Settings Form CP

Page 9: Add-On Development: EE Expects that Every Developer will do his Duty

function settings(){ $settings = array(); $settings['butter'] = "Quite Tasty"; $settings['buttery'] = array('r', array('yes' => "yes", 'no' => "no"), 'no'); // Complex: // [variable_name] => array(type, values, default value) // variable_name => short name for setting and key for language file variable // types: t - textarea // r - radio buttons // s - select // ms - multiselect // f - function calls // values: can be array (r, s, ms), string (t), function name (f) // default: name of array member, string, nothing // // Simple: // [variable_name] => 'Butter' // Text input, with 'Butter' as the default. return $settings;}

Page 10: Add-On Development: EE Expects that Every Developer will do his Duty
Page 11: Add-On Development: EE Expects that Every Developer will do his Duty

Modules

Page 12: Add-On Development: EE Expects that Every Developer will do his Duty

• The Mighty Workhorses of EE

• Complete and expansive Control Panels.

• Database Tables

• Template Tags

• Own extensions possible

Page 13: Add-On Development: EE Expects that Every Developer will do his Duty

Plugins

Page 14: Add-On Development: EE Expects that Every Developer will do his Duty

• No settings, no tables, no CP, no install

• Text manipulation either via Template Tags or Custom Fields

• Or, functionality "plugged" into your Templates.

Page 15: Add-On Development: EE Expects that Every Developer will do his Duty

Add-On Quantities @ devot-ee.com18 October 2009

Extensions:Modules:Plugins:

17073248

Page 16: Add-On Development: EE Expects that Every Developer will do his Duty

Examples of Extensions

• Edit Tab AJAX - AJAX enabled search for Control Panel's Edit area

• FieldFrame - Easily create new custom field types for ExpressionEngine.

• LG Add Sitename - Site Label in upper left of your CP

Page 17: Add-On Development: EE Expects that Every Developer will do his Duty

Examples of Modules

• Structure - Create Static and Listing pages, editable via a tree sitemap

• Tag - Folksonomy functionality for Weblog and Gallery Entries

• User - EE's Member Functionality in Templates

Page 18: Add-On Development: EE Expects that Every Developer will do his Duty

Examples of Plugins

• EE Gravatar - Global Avatars for site members

• Image Sizer - Resizes and caches images on the fly

• Markdown - Markdown formatting in EE Custom Weblog Fields

Page 19: Add-On Development: EE Expects that Every Developer will do his Duty

Accessoriesin EE 2.0

Page 20: Add-On Development: EE Expects that Every Developer will do his Duty

• Accessories provide tools, references, or abilities at the bottom of your EE Control Panel in ExpressionEngine 2.0

• No CP page for each Accessory

• Can have own DB tables

• View files! Lovely lovely View files!

Page 21: Add-On Development: EE Expects that Every Developer will do his Duty
Page 22: Add-On Development: EE Expects that Every Developer will do his Duty

II.Add-On

Development Skills

Page 23: Add-On Development: EE Expects that Every Developer will do his Duty

PHP

Page 24: Add-On Development: EE Expects that Every Developer will do his Duty

• Duh...

• PHP: Hypertext Preprocessor. You really have to love recursive acronyms.

• Server side programming language. Processed at runtime.

• No Compiling! Viewable Source!

Page 25: Add-On Development: EE Expects that Every Developer will do his Duty

• PHP files contain code, but they can also have HTML, JS, XML, et cetera inside them.

• Extremely widespread on hosting environments.

Page 26: Add-On Development: EE Expects that Every Developer will do his Duty

PHP Learning References

PHP Docs: http://php.net/manual/

W3C Tutorial: http://www.w3schools.com/PHP/php_intro.asp

Zend Tutorial: http://devzone.zend.com/article/627

Page 27: Add-On Development: EE Expects that Every Developer will do his Duty

SQL

Page 28: Add-On Development: EE Expects that Every Developer will do his Duty

• Required for advanced Add-On development

• Active Record only *helps* build queries

Page 29: Add-On Development: EE Expects that Every Developer will do his Duty

MySQL

• Popular, open-source, relational database.

• Simple to setup and administrate.

• Fast for reading, decent for writing

• Dominant on hosted environments

Page 30: Add-On Development: EE Expects that Every Developer will do his Duty

MySQL Learning References

• MySQL Docs: http://dev.mysql.com/doc/

• Buy a book. ( O'Reilly Books are well done )

• Learn JOINs

• http://www.informit.com/articles/article.aspx?p=30875&seqNum=5

• http://en.wikipedia.org/wiki/Join_(SQL)

Page 31: Add-On Development: EE Expects that Every Developer will do his Duty

HTML/CSS

Page 32: Add-On Development: EE Expects that Every Developer will do his Duty

View Files

• Essentially HTML files with PHP inside for outputting data

• Part of ExpressionEngine 2.0 by default

• Available in ExpressionEngine1.x using Hermes or custom include code

Page 33: Add-On Development: EE Expects that Every Developer will do his Duty

<?php echo $this->view('header.html');?><h4 class="alertHeadingCenter"><?php echo $LANG->line('error');?></h4>

<div class='defaultCenter' > <div class="box"> <strong><?=$error_message?></strong> <br /><br /> <strong> <a href='javascript:history.go(-1)'>&#171; <?=$LANG->line('back')?></a> </strong> </div></div><?php echo $this->view('footer.html'); ?>

Page 34: Add-On Development: EE Expects that Every Developer will do his Duty

User Interfaces

• Build in static HTML, CSS, JS files before converting to View files.

• Easier development.

• Easier bug testing.

• No need to create data variables/objects first.

• UI developer does not need to understand PHP.

Page 35: Add-On Development: EE Expects that Every Developer will do his Duty

jQuery/JavaScript

Page 36: Add-On Development: EE Expects that Every Developer will do his Duty

• jQuery available in EE 1.x via an extension (not enabled by default)

• jQuery available in EE 2.x with no additional work

• Relatively easy to add other libraries or custom JS if need be.

Page 37: Add-On Development: EE Expects that Every Developer will do his Duty

global $EXT;

if ( ! isset($EXT->version_numbers['Cp_jquery'])){ return $OUT->show_user_error('general', $LANG->line('cp_jquery_requred')));}

Page 38: Add-On Development: EE Expects that Every Developer will do his Duty

III.Developing Add-Ons in ExpressionEngine

Page 39: Add-On Development: EE Expects that Every Developer will do his Duty

Never, Ever Just Start Coding!

Page 40: Add-On Development: EE Expects that Every Developer will do his Duty
Page 41: Add-On Development: EE Expects that Every Developer will do his Duty

• Previous Approaches

• Required Features

• Alternative Approach in ExpressionEngine?

• Can this be done in EE in any other way?

• Is a Module required? Could an Extension do it?

• Could a Plugin output weblog data in the way you need?

Research

Page 42: Add-On Development: EE Expects that Every Developer will do his Duty

Tell a Story

• How will Person A do Task 1?

• Question Previous Approaches.

• Is X Really the BEST way to do it?

• What Would Apple Do?

• Eliminate Steps, Make Process Intuitive.

• Follow your instincts.

Page 43: Add-On Development: EE Expects that Every Developer will do his Duty

Map Out Features

• Major• Functionality required for module to serve

its market/purpose

• Minor• Not Necessarily Required.

• Features are cuttable for a 1.0 release.

• Icing• For specific clients or users

• Think and consider them

Page 44: Add-On Development: EE Expects that Every Developer will do his Duty

Database Structure

• Tables for your Major and Minor Features

• Normalization: Eliminate Data Duplication

• http://en.wikipedia.org/wiki/Database_normalization

• Indexes!

• Specific, Sensical Field Names

• 'event_title' vs 'event'

• 'event_short_name' vs 'name'

Page 45: Add-On Development: EE Expects that Every Developer will do his Duty

Tags Structure

• The Naming and Functionality of Template tags

• For Each Tag

• Describe

• Name

• Parameters

• Variable Pairs and Single Variables

• Consider this a precursor to your documentation

Page 46: Add-On Development: EE Expects that Every Developer will do his Duty

Tags Structure: Describe

• Descriptions for each Tag, Parameter, and Variable.

• Explain what each one does.

Page 47: Add-On Development: EE Expects that Every Developer will do his Duty

Tags Structure: Tag Name

• Simple and Obvious

• No Abbreviations, No Ambiguity

• {exp:module:g_entries} vs {exp:module:gallery_entries}

Page 48: Add-On Development: EE Expects that Every Developer will do his Duty

Tags Structure: Parameters

• Prefix?

• form:id="" or form_id=""

• Use prefixes to break up parameters into "groups" of functionality.

• notify:admin_email=""

• notify:user_email=""

Page 49: Add-On Development: EE Expects that Every Developer will do his Duty

Tags Structure: Variables

• No Ambiguity, No Abbreviations

• {group}{/group} vs {category_group}{/category_group}

• {title} vs {event_title}

• Prevent collisions in nested tags

• Underscores recommended

Page 50: Add-On Development: EE Expects that Every Developer will do his Duty

Tags Structure:Show to Other People

• Get Feedback

• Revise until the Spec feels solid.

Page 51: Add-On Development: EE Expects that Every Developer will do his Duty

Building a Control Panel

Page 52: Add-On Development: EE Expects that Every Developer will do his Duty

Workflow Module’s CP

Page 53: Add-On Development: EE Expects that Every Developer will do his Duty

Control Panel: Break Up into Sections

• Data Adding, Deleting, and Manipulation

• Create/Modify/Delete Items

• Ex: Calendar, Wiki, Forum

• Build only one main interface

• Preferences/Settings/Permissions

• Per Site, Per Weblog, Per Member Group, Per X

• Actions

• Ex: Recount, Re-Cache, Clear Caches

• Version Number and Documentation Link

Page 54: Add-On Development: EE Expects that Every Developer will do his Duty

KISS: Keep It Simple, Stupid

Page 55: Add-On Development: EE Expects that Every Developer will do his Duty

Control Panel: Design• Build an HTML/CSS/JS mockup first

• Put into a View file

• PHP into HTML, Not HTML into PHP

• documentDOM in Hermes - Builds HTML in PHP, specifically form fields

• Ignore IE6

• EE 2.x no longer supports it

• Solspace no longer supports it

• Neither should you.

Page 56: Add-On Development: EE Expects that Every Developer will do his Duty

Making Software Support IE6 Upgrading Users

Time Wasted on IE6

vs.

Page 57: Add-On Development: EE Expects that Every Developer will do his Duty

8%92%

Making Software Support IE6 Upgrading Users

Time Wasted on IE6

vs.

Page 58: Add-On Development: EE Expects that Every Developer will do his Duty

Have Goals,Even Milestones,Never Deadlines

Page 59: Add-On Development: EE Expects that Every Developer will do his Duty

IV.Writing Code

Page 60: Add-On Development: EE Expects that Every Developer will do his Duty

Follow the EllisLab Development Guidelines!

http://expressionengine.com/docs/development/guidelines/index.html

Page 61: Add-On Development: EE Expects that Every Developer will do his Duty

"Prolific and informative commenting using proper comment style"

• We want to know your thinking! Why this way?

• Expect people to learn from your code.

• Helps you understand your *own* logic

Page 62: Add-On Development: EE Expects that Every Developer will do his Duty

• Be Paranoid! Nothing is Immune! Constant Vigilance!

• If you DID NOT set or get data yourself, assume it is tainted, even EE variables

• If you DID set or get yourself, but not within ten lines of code, assume it is tainted.

• Sanitize and Escape at the Query

• No Security Exceptions for SuperAdmins

Sanitize and Escape Everything

Page 63: Add-On Development: EE Expects that Every Developer will do his Duty

Abstraction

• Use Twice, Write Once

• Create Libraries!

• Reduces Work and Mistakes

• Purpose of Hermes

Page 64: Add-On Development: EE Expects that Every Developer will do his Duty

Simplify, Simplify,Simplify

Page 65: Add-On Development: EE Expects that Every Developer will do his Duty

Simplify: Reduce Code Work• Do the Least Amount of Effort to produce results

• Bail Out First, Work Second

• Invalid variable type? Bail.

• No Permissions? Bail.

• Error? Bail.

• Don’t Do Serious Work Until You Know You Have Work To Do

Page 66: Add-On Development: EE Expects that Every Developer will do his Duty

Simplify: Reduce DB Work

• Performing Multiple Queries are OK.

• Validate, Check Pagination, Then Retrieve Data

Page 67: Add-On Development: EE Expects that Every Developer will do his Duty

Simplify: Models

• Abstract common SELECTs into separate methods

• INSERTs/UPDATEs for a DB Table in one method

• Hermes has per Add-On model caching caching built into it.

• Speaking of caching...

Page 68: Add-On Development: EE Expects that Every Developer will do his Duty

Per Page Load Caching

• Use $SESS->cache

• Suggested:

• $SESS->cache['modules']['module_name']['some_cache'] = array();

• Alternative:

• $SESS->cache['Solspace']['module_name']['some_cache'] = array()

• Try a Reference!

• $this->cache =& $SESS->cache['modules']['module_name'];

• $this->cache[‘some_cache’] = array();

Page 69: Add-On Development: EE Expects that Every Developer will do his Duty

Weblog Module Class

• Very powerful code, no need to write your own.

• Code was written so that it could be used elsewhere.

• Returns Results based on tag parameters

• You can modify $TMPL->tagparams!

Page 70: Add-On Development: EE Expects that Every Developer will do his Duty

require_once PATH_CORE.'core.typography'.EXT;require_once PATH_MOD.'/weblog/mod.weblog'.EXT;

$TMPL->tagparams['entry_id'] = '1|2|3|4';$TMPL->tagparams['dynamic'] = 'off';

$TMPL->tagdata = $TMPL->assign_relationship_data( $TMPL->tagdata );$TMPL->var_single = array_merge( $TMPL->var_single, $TMPL->related_markers );

$weblog_object = new Weblog;

$weblog_object->fetch_custom_weblog_fields();$weblog_object->fetch_custom_member_fields();$weblog_object->fetch_pagination_data();$weblog_object->create_pagination();$weblog_object->build_sql_query();

if ($weblog_object->sql == '') return $this->return_data = $TMPL->no_results();

$weblog_object->query = $DB->query($weblog_object->sql);

if ($weblog_object->query->num_rows == 0) return $this->return_data = $TMPL->no_results();

$weblog_object->TYPE = new Typography;

$weblog_object->fetch_categories();$weblog_object->parse_weblog_entries();$weblog_object->add_pagination_data();

return $this->return_data = $weblog_object->return_data;

Page 71: Add-On Development: EE Expects that Every Developer will do his Duty

Provide Tools for Keeping Things Tidy

• Removal of Old Data.

• Removal of Old Caches

• Optimize Tables - Reduce DB Overhead

Page 72: Add-On Development: EE Expects that Every Developer will do his Duty

V.Debugging and

Improving Performance

Page 73: Add-On Development: EE Expects that Every Developer will do his Duty

Consider Performance an Aspect of Add-On

Debugging

Page 74: Add-On Development: EE Expects that Every Developer will do his Duty

Turn on PHP Debugging

• Insure Display Errors Setting is On in php.ini

• Error Reporting is E_ALL

• No PHP Errors! Ever!

• Remove All Deprecated PHP Functions.

Page 75: Add-On Development: EE Expects that Every Developer will do his Duty

Turn on SQL Queries

• Admin => System Preferences => Output and Debugging

• Queries appear on both CP and User side of EE

• Review Queries

• Check the Add-On's CP

• Extensions: Check areas of usage in CP

• Check EVERY single tag in a Template.

• Eliminate Duplicates!

Page 76: Add-On Development: EE Expects that Every Developer will do his Duty

Turn on SQL Queries• Are Certain Queries Necessary on EVERY load?

• Settings/Preferences

• Caching (Checks, Re-caching, Emptying)

• Statistics

• Evaluate Queries for Performance

• Run in phpMyAdmin or similar

• Try Making the Query More Efficient

• Add a WHERE clause on indexed field

• Remove Extraneous JOINs when possible

Page 77: Add-On Development: EE Expects that Every Developer will do his Duty

Turn on SQL Queries

• De-Normalization.

• Duplicating Data or Grouping It to Reduce Work

• http://en.wikipedia.org/wiki/Denormalization

• Best example? Statistics: Hit count.

• Abstract methods for data consistency (i.e. correct values)

• Learn About Optimizing MySQL

• MySQL Performance Blog

• http://mysqlperformanceblog.com

Page 78: Add-On Development: EE Expects that Every Developer will do his Duty

SuperSearch SQL Queries

Page 79: Add-On Development: EE Expects that Every Developer will do his Duty

Turn on Template Debugging• Admin => System Preferences => Output and Debugging

• Outputs Elapsed Time during Add-On processing

• What Code is Taking the Longest to Process?

• $TMPL->log_item()

• $TMPL->log_item('Freeform Module: Run Query');

• Disable Processing

• Disable Parameter ( disable="feng_shui" )

• Auto-detect Variables and Remove Queries and Processing

Page 80: Add-On Development: EE Expects that Every Developer will do his Duty

Vanilla Template Log

Page 81: Add-On Development: EE Expects that Every Developer will do his Duty

SuperSearch Processing

Page 82: Add-On Development: EE Expects that Every Developer will do his Duty

Knowing is Half the Battle!

Page 83: Add-On Development: EE Expects that Every Developer will do his Duty

Automated Actions• Example: Caching or Retrieving Remote Data

• Can Seriously Slow Down an Add-On

• Try AJAX

Page 84: Add-On Development: EE Expects that Every Developer will do his Duty

Deprecated Code• Consider using trigger_error()

• trigger_error('Favorites Module: The Favorites Count tag has been deprecated. Use the Entry Count tag instead');

• Don't Leave It Around Forever, Discontinue Support, Then Remove It

Page 85: Add-On Development: EE Expects that Every Developer will do his Duty

Ask for Help

• Plenty of EE, PHP, SQL Knowledge out there. Use it.

• Often just discussing a problem will lead to a solution.

Page 86: Add-On Development: EE Expects that Every Developer will do his Duty

V.Presentation Over, So

Let's Talk