Your SlideShare is downloading. ×
Add-On Development: EE Expects that Every Developer will do his Duty
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

2,680
views

Published on

A presentation on Add-On Development: EE Expects that Every Developer will do his Duty as given at the EECI2009 conference in Leiden by Paul Burdick, lead developer at Solspace.

A presentation on Add-On Development: EE Expects that Every Developer will do his Duty as given at the EECI2009 conference in Leiden by Paul Burdick, lead developer at Solspace.

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,680
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
11
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Add-On Development: EE Expects that Every Developer will do his Duty Paul Burdick, Lead Developer solspace http://solspace.com/downloads/eeci2009/presentation.txt
  • 2. 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
  • 3. 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
  • 4. I. What are Add-Ons?
  • 5. Three Types of Add-Ons in EE 1.x and 2.x • Extensions • Modules • Plugins
  • 6. Extensions
  • 7. • 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
  • 8. • 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
  • 9. 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; }
  • 10. Modules
  • 11. • The Mighty Workhorses of EE • Complete and expansive Control Panels. • Database Tables • Template Tags • Own extensions possible
  • 12. Plugins
  • 13. • No settings, no tables, no CP, no install • Text manipulation either via Template Tags or Custom Fields • Or, functionality "plugged" into your Templates.
  • 14. Add-On Quantities @ devot-ee.com 18 October 2009 Extensions: 170 Modules: 73 Plugins: 248
  • 15. 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
  • 16. 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
  • 17. 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
  • 18. Accessories in EE 2.0
  • 19. • 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!
  • 20. II. Add-On Development Skills
  • 21. PHP
  • 22. • Duh... • PHP: Hypertext Preprocessor. You really have to love recursive acronyms. • Server side programming language. Processed at runtime. • No Compiling! Viewable Source!
  • 23. • PHP files contain code, but they can also have HTML, JS, XML, et cetera inside them. • Extremely widespread on hosting environments.
  • 24. 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
  • 25. SQL
  • 26. • Required for advanced Add-On development • Active Record only *helps* build queries
  • 27. MySQL • Popular, open-source, relational database. • Simple to setup and administrate. • Fast for reading, decent for writing • Dominant on hosted environments
  • 28. 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)
  • 29. HTML/CSS
  • 30. 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
  • 31. <?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'); ?>
  • 32. 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.
  • 33. jQuery/JavaScript
  • 34. • 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.
  • 35. global $EXT; if ( ! isset($EXT->version_numbers['Cp_jquery'])) { return $OUT->show_user_error('general', $LANG->line('cp_jquery_requred'))); }
  • 36. III. Developing Add-Ons in ExpressionEngine
  • 37. Never, Ever Just Start Coding!
  • 38. Research • 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?
  • 39. 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.
  • 40. 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
  • 41. 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'
  • 42. 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
  • 43. Tags Structure: Describe • Descriptions for each Tag, Parameter, and Variable. • Explain what each one does.
  • 44. Tags Structure: Tag Name • Simple and Obvious • No Abbreviations, No Ambiguity • {exp:module:g_entries} vs {exp:module:gallery_entries}
  • 45. 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=""
  • 46. 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
  • 47. Tags Structure: Show to Other People • Get Feedback • Revise until the Spec feels solid.
  • 48. Building a Control Panel
  • 49. Workflow Module’s CP
  • 50. 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
  • 51. KISS: Keep It Simple, Stupid
  • 52. 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.
  • 53. Time Wasted on IE6 Making Software Support IE6 vs. Upgrading Users
  • 54. Time Wasted on IE6 Making Software Support IE6 vs. Upgrading Users 92% 8%
  • 55. Have Goals, Even Milestones, Never Deadlines
  • 56. IV. Writing Code
  • 57. Follow the EllisLab Development Guidelines! http://expressionengine.com/docs/development/guidelines/index.html
  • 58. "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
  • 59. Sanitize and Escape Everything • 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
  • 60. Abstraction • Use Twice, Write Once • Create Libraries! • Reduces Work and Mistakes • Purpose of Hermes
  • 61. Simplify, Simplify, Simplify
  • 62. 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
  • 63. Simplify: Reduce DB Work • Performing Multiple Queries are OK. • Validate, Check Pagination, Then Retrieve Data
  • 64. 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...
  • 65. 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();
  • 66. 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!
  • 67. 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;
  • 68. Provide Tools for Keeping Things Tidy • Removal of Old Data. • Removal of Old Caches • Optimize Tables - Reduce DB Overhead
  • 69. V. Debugging and Improving Performance
  • 70. Consider Performance an Aspect of Add-On Debugging
  • 71. 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.
  • 72. 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!
  • 73. 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
  • 74. 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
  • 75. SuperSearch SQL Queries
  • 76. 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
  • 77. Vanilla Template Log
  • 78. SuperSearch Processing
  • 79. Knowing is Half the Battle!
  • 80. Automated Actions • Example: Caching or Retrieving Remote Data • Can Seriously Slow Down an Add-On • Try AJAX
  • 81. 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
  • 82. Ask for Help • Plenty of EE, PHP, SQL Knowledge out there. Use it. • Often just discussing a problem will lead to a solution.
  • 83. V. Presentation Over, So Let's Talk

×