Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

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

Erik Reagan

May 29, 2012
Tweet

More Decks by Erik Reagan

Other Decks in Technology

Transcript

  1. 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
  2. ERIKREAGAN • EngineSummit GOALS • Caveats in using Extensions •

    end_script explanation & use • Returning data back to EE • Better Debugging Processes 9
  3. ERIKREAGAN • EngineSummit PLUGINS • Runtime add-ons • No settings

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

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

    • EE handles installation & settings for you • Small learning curve 13
  6. 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
  7. ERIKREAGAN • EngineSummit FIELDTYPES • Fairly self-explanatory • Fieldtypes for

    channel publish form • Have corresponding Template tags 15
  8. 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
  9. 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
  10. 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”
  11. 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)
  12. 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
  13. ERIKREAGAN • EngineSummit 28 HOOK PROCESSING Low Seg2Cat Example Applied

    1. ExpressionEngine encounters the sessions_end hook in the system
  14. 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
  15. 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
  16. 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
  17. ERIKREAGAN • EngineSummit 32 HOOK PROCESSING Low Seg2Cat Example Applied

    5.Finally EE executes the sessions_end method within the ext.low_seg2cat.php file
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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";
  26. 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";