!ERIKREAGAN"""•"""EngineSummit"#$%#
THE ANATOMY OF AN EXTENSION
!ERIKREAGAN"""•"""EngineSummit"#$%#
WHO IS THIS GUY?
2
A family man
!ERIKREAGAN"""•"""EngineSummit"#$%#
WHO IS THIS GUY?
3
Jesus is my homeboy
!ERIKREAGAN"""•"""EngineSummit"#$%#
WHO IS THIS GUY?
4
World famous (I’m on the internet)
!ERIKREAGAN"""•"""EngineSummit"#$%#
WHO IS THIS GUY?
5
EE Reactor team member
!ERIKREAGAN"""•"""EngineSummit"#$%#
WHO IS THIS GUY?
6
Partner & Technical Director
!ERIKREAGAN"""•"""EngineSummit"#$%#
THE ANATOMY OF AN EXTENSION
7
!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
!ERIKREAGAN"""•"""EngineSummit"#$%#
GOALS• Caveats in using Extensions
• end_script explanation & use
• Returning data back to EE
• Better Debugging Processes
9
!ERIKREAGAN"""•"""EngineSummit"#$%#
ADD-ONS OVERVIEW• Plugins
• Accessories
• Modules
• Fieldtypes
• Extensions
10
!ERIKREAGAN"""•"""EngineSummit"#$%#
PLUGINS• Runtime add-ons
• No settings interface
• No installation required
• No unique db tables (typically)
11
!ERIKREAGAN"""•"""EngineSummit"#$%#
PLUGINS• No language file requirement
• Can format custom text fields
• Can provide Template tags
• Small learning curve
12
!ERIKREAGAN"""•"""EngineSummit"#$%#
ACCESSORIES• Only shown in Control Panel
• EE handles installation & settings for you
• Small learning curve
13
!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
!ERIKREAGAN"""•"""EngineSummit"#$%#
FIELDTYPES• Fairly self-explanatory
• Fieldtypes for channel publish form
• Have corresponding Template tags
15
!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
!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
!ERIKREAGAN"""•"""EngineSummit"#$%#
WHAT ARE HOOKS?
18
!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”
!ERIKREAGAN"""•"""EngineSummit"#$%#20
How do hooks relate to Extensions?
!ERIKREAGAN"""•"""EngineSummit"#$%#21
How do hooks relate to Extensions?
!ERIKREAGAN"""•"""EngineSummit"#$%#22
HOOK PROCESSING1. ExpressionEngine encounters a "hook" in the system
!ERIKREAGAN"""•"""EngineSummit"#$%#23
HOOK PROCESSING2. 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)
!ERIKREAGAN"""•"""EngineSummit"#$%#24
HOOK PROCESSING3.If there is, then EE looks at the "class" column to
determine which add-on to look in for this extension
!ERIKREAGAN"""•"""EngineSummit"#$%#25
HOOK PROCESSING4.If the add-on Extension file exists, it is loaded
!ERIKREAGAN"""•"""EngineSummit"#$%#26
HOOK PROCESSING5.Within that Extension class, the method listed is
executed.
!ERIKREAGAN"""•"""EngineSummit"#$%#27
How do hooks relate to Extensions?
!ERIKREAGAN"""•"""EngineSummit"#$%#28
HOOK PROCESSINGLow Seg2Cat Example Applied
1. ExpressionEngine encounters the sessions_end hook in the system
!ERIKREAGAN"""•"""EngineSummit"#$%#29
HOOK PROCESSINGLow Seg2Cat Example Applied
2. It checks the already-loaded extensions dataset for an extension using the sessions_end hook which is enabled
!ERIKREAGAN"""•"""EngineSummit"#$%#30
HOOK PROCESSINGLow Seg2Cat Example Applied
3.EE looks at the class "Low_seg2cat_ext" and knows to look for a folder called third_party/low_seg2cat
!ERIKREAGAN"""•"""EngineSummit"#$%#31
HOOK PROCESSINGLow Seg2Cat Example Applied
4.If third_party/low_seg2cat/ext.low_seg2cat.php exists, the file is loaded and an object is created
!ERIKREAGAN"""•"""EngineSummit"#$%#32
HOOK PROCESSINGLow Seg2Cat Example Applied
5.Finally EE executes the sessions_end method within the ext.low_seg2cat.php file
!ERIKREAGAN"""•"""EngineSummit"#$%#
EXTENSION PROCESSING
33
!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
!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
!ERIKREAGAN"""•"""EngineSummit"#$%#
HOOKS QUERY
SELECT DISTINCT ee.*FROM exp_extensions eeWHERE enabled = 'y'ORDER BY hook, priority ASC, class
36
From libraries/Extensions.php
!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
!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
!ERIKREAGAN"""•"""EngineSummit"#$%#39
Extensions playing well with others
!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
!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
!ERIKREAGAN"""•"""EngineSummit"#$%#42
Add-ons → Extensions
!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";
!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";
!ERIKREAGAN"""•"""EngineSummit"#$%#45
exp_extensions table
!ERIKREAGAN"""•"""EngineSummit"#$%#46
All content available online at:
focuslabllc.com/blog
!ERIKREAGAN"""•"""EngineSummit"#$%#
!ERIKREAGANPartner"#Focus#Lab"#LLC!FocusLabLLC
47