Save 37% off PRO during our Black Friday Sale! »

The Anatomy of an Extension

The Anatomy of an Extension

One of the least understood aspects of ExpressionEngine is the class of add-ons known as Extensions. Many developers don’t understand why they exist, what they actually do or what problems they solve.

This confusion exists among both Extension users and developers alike. A quick browse of any ExpressionEngine support forum shows that a common first step to solving an issue is to “Disable all Extensions,” yet most don’t know why.

This was is designed to demystify the world of Extensions. The goal was to help everyone, from the general user to the new add-on developer, understand why Extensions exist, what they do and how they work.

You can also find the presentation in blog form here: http://focuslabllc.com/journal/the-anatomy-of-an-expressionengine-extension

594642c6d8a7fa66c622e740496a0a32?s=128

Erik Reagan

May 29, 2012
Tweet

Transcript

  1. ERIKREAGAN • EngineSummit THE ANATOMY OF AN EXTENSION

  2. ERIKREAGAN • EngineSummit WHO IS THIS GUY? 2 A family

    man
  3. ERIKREAGAN • EngineSummit WHO IS THIS GUY? 3 Jesus is

    my homeboy
  4. ERIKREAGAN • EngineSummit WHO IS THIS GUY? 4 World famous

    (I’m on the internet)
  5. ERIKREAGAN • EngineSummit WHO IS THIS GUY? 5 EE Reactor

    team member
  6. ERIKREAGAN • EngineSummit WHO IS THIS GUY? 6 Partner &

    Technical Director
  7. ERIKREAGAN • EngineSummit THE ANATOMY OF AN EXTENSION 7

  8. ERIKREAGAN • EngineSummit GOALS • Extensions in the context of

    Add-ons • What are Hooks? • How do Hooks relate to Extensions? • How are Extensions called by EE? 8
  9. ERIKREAGAN • EngineSummit GOALS • Caveats in using Extensions •

    end_script explanation & use • Returning data back to EE • Better Debugging Processes 9
  10. ERIKREAGAN • EngineSummit ADD-ONS OVERVIEW • Plugins • Accessories •

    Modules • Fieldtypes • Extensions 10
  11. ERIKREAGAN • EngineSummit PLUGINS • Runtime add-ons • No settings

    interface • No installation required • No unique db tables (typically) 11
  12. ERIKREAGAN • EngineSummit PLUGINS • No language file requirement •

    Can format custom text fields • Can provide Template tags • Small learning curve 12
  13. ERIKREAGAN • EngineSummit ACCESSORIES • Only shown in Control Panel

    • EE handles installation & settings for you • Small learning curve 13
  14. ERIKREAGAN • EngineSummit MODULES • Can have a Control Panel

    interface • Requires Language file • Must be installed in the Control Panel • Can utilize "actions" • Can provide Template tags 14
  15. ERIKREAGAN • EngineSummit FIELDTYPES • Fairly self-explanatory • Fieldtypes for

    channel publish form • Have corresponding Template tags 15
  16. ERIKREAGAN • EngineSummit EXTENSIONS • Must be installed in the

    CP • Can use EE's built-in simple settings builder • Requires language file when you have settings • Can have unique database tables (but they o en don’t) 16
  17. ERIKREAGAN • EngineSummit EXTENSIONS • Manipulates data or processing during

    a given point in a page load • Must behave nicely with other extensions • Probably the steepest learning curve in add-ons • Can only be used with existing system "hooks" 17
  18. ERIKREAGAN • EngineSummit WHAT ARE HOOKS? 18

  19. ERIKREAGAN • EngineSummit 19 Hooks are used to alter or

    augment the behavior of an operating system, of applications, or of other so ware components. Wikipedia article on “Hooking”
  20. ERIKREAGAN • EngineSummit 20 How do hooks relate to Extensions?

  21. ERIKREAGAN • EngineSummit 21 How do hooks relate to Extensions?

  22. ERIKREAGAN • EngineSummit 22 HOOK PROCESSING 1. ExpressionEngine encounters a

    "hook" in the system
  23. ERIKREAGAN • EngineSummit 23 HOOK PROCESSING 2.It checks the exp_extensions

    table to see if there is a record with the "hook" where the "enabled" column is set to "y" (yes)
  24. ERIKREAGAN • EngineSummit 24 HOOK PROCESSING 3.If there is, then

    EE looks at the "class" column to determine which add-on to look in for this extension
  25. ERIKREAGAN • EngineSummit 25 HOOK PROCESSING 4.If the add-on Extension

    file exists, it is loaded
  26. ERIKREAGAN • EngineSummit 26 HOOK PROCESSING 5.Within that Extension class,

    the method listed is executed.
  27. ERIKREAGAN • EngineSummit 27 How do hooks relate to Extensions?

  28. ERIKREAGAN • EngineSummit 28 HOOK PROCESSING Low Seg2Cat Example Applied

    1. ExpressionEngine encounters the sessions_end hook in the system
  29. ERIKREAGAN • EngineSummit 29 HOOK PROCESSING Low Seg2Cat Example Applied

    2.It checks the already-loaded extensions dataset for an extension using the sessions_end hook which is enabled
  30. ERIKREAGAN • EngineSummit 30 HOOK PROCESSING Low Seg2Cat Example Applied

    3.EE looks at the class "Low_seg2cat_ext" and knows to look for a folder called third_party/low_seg2cat
  31. ERIKREAGAN • EngineSummit 31 HOOK PROCESSING Low Seg2Cat Example Applied

    4.If third_party/low_seg2cat/ext.low_seg2cat.php exists, the file is loaded and an object is created
  32. ERIKREAGAN • EngineSummit 32 HOOK PROCESSING Low Seg2Cat Example Applied

    5.Finally EE executes the sessions_end method within the ext.low_seg2cat.php file
  33. ERIKREAGAN • EngineSummit EXTENSION PROCESSING 33

  34. ERIKREAGAN • EngineSummit HOOK EXAMPLE /* ------------------------------------------- /* 'delete_entries_start' hook.

    /* - Perform actions prior to entry deletion / take over deletion */ $edata = $this->extensions->call('delete_entries_start'); if ($this->extensions->end_script === TRUE) return; /* /* -------------------------------------------*/ 34 The “delete_entries_start” hook
  35. ERIKREAGAN • EngineSummit HOOK EXAMPLE /* ------------------------------------------- /* 'delete_entries_start' hook.

    /* - Perform actions prior to entry deletion / take over deletion */ $edata = $this->extensions->call('delete_entries_start'); if ($this->extensions->end_script === TRUE) return; /* /* -------------------------------------------*/ 35 The “delete_entries_start” hook
  36. ERIKREAGAN • EngineSummit HOOKS QUERY SELECT DISTINCT ee.* FROM exp_extensions

    ee WHERE enabled = 'y' ORDER BY hook, priority ASC, class 36 From libraries/Extensions.php
  37. ERIKREAGAN • EngineSummit HOOK EXAMPLE /* ------------------------------------------- /* 'delete_entries_start' hook.

    /* - Perform actions prior to entry deletion / take over deletion */ $edata = $this->extensions->call('delete_entries_start'); if ($this->extensions->end_script === TRUE) return; /* /* -------------------------------------------*/ 37 The “delete_entries_start” hook
  38. ERIKREAGAN • EngineSummit HOOK EXAMPLE /* ------------------------------------------- /* 'delete_entries_start' hook.

    /* - Perform actions prior to entry deletion / take over deletion */ $edata = $this->extensions->call('delete_entries_start'); if ($this->extensions->end_script === TRUE) return; /* /* -------------------------------------------*/ 38 The “delete_entries_start” hook
  39. ERIKREAGAN • EngineSummit 39 Extensions playing well with others

  40. ERIKREAGAN • EngineSummit HOOK EXAMPLE /* ------------------------------------------- /* 'delete_entries_start' hook.

    /* - Perform actions prior to entry deletion / take over deletion */ $edata = $this->extensions->call('delete_entries_start'); if ($this->extensions->end_script === TRUE) return; /* /* -------------------------------------------*/ 40 The “delete_entries_start” hook
  41. ERIKREAGAN • EngineSummit DEBUGGING METHODS • Disable all extensions in

    the CP • Disable all extensions in the config.php file • Disable one extension at a time in the database 41
  42. ERIKREAGAN • EngineSummit 42 Add-ons → Extensions

  43. ERIKREAGAN • EngineSummit 43 config.php override /* |------------------------------------------------------- | ExpressionEngine

    Config Items |------------------------------------------------------- | | The following items are for use with ExpressionEngine. | The rest of the config items are for use with | CodeIgniter. | */ $config['app_version'] = "250"; $config['is_system_on'] = "y"; $config['allow_extensions'] = "y";
  44. ERIKREAGAN • EngineSummit 44 config.php override /* |---------------------------------------------------------- | ExpressionEngine

    Config Items |---------------------------------------------------------- | | The following items are for use with ExpressionEngine. | The rest of the config items are for use with | CodeIgniter. | */ $config['app_version'] = "250"; $config['is_system_on'] = "y"; $config['allow_extensions'] = "n";
  45. ERIKREAGAN • EngineSummit 45 exp_extensions table

  46. ERIKREAGAN • EngineSummit 46 All content available online at: focuslabllc.com/blog

  47. ERIKREAGAN • EngineSummit ERIKREAGAN Partner Focus Lab LLC FocusLabLLC 47