+ All Categories
Transcript
Page 1: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

THE ANATOMY OF AN EXTENSION

Page 2: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

WHO IS THIS GUY?

2

A family man

Page 3: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

WHO IS THIS GUY?

3

Jesus is my homeboy

Page 4: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

WHO IS THIS GUY?

4

World famous (I’m on the internet)

Page 5: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

WHO IS THIS GUY?

5

EE Reactor team member

Page 6: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

WHO IS THIS GUY?

6

Partner & Technical Director

Page 7: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

THE ANATOMY OF AN EXTENSION

7

Page 8: The Anatomy of an Extension

!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

Page 9: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

GOALS• Caveats in using Extensions

• end_script explanation & use

• Returning data back to EE

• Better Debugging Processes

9

Page 10: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

ADD-ONS OVERVIEW• Plugins

• Accessories

• Modules

• Fieldtypes

• Extensions

10

Page 11: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

PLUGINS• Runtime add-ons

• No settings interface

• No installation required

• No unique db tables (typically)

11

Page 12: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

PLUGINS• No language file requirement

• Can format custom text fields

• Can provide Template tags

• Small learning curve

12

Page 13: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

ACCESSORIES• Only shown in Control Panel

• EE handles installation & settings for you

• Small learning curve

13

Page 14: The Anatomy of an Extension

!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

Page 15: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

FIELDTYPES• Fairly self-explanatory

• Fieldtypes for channel publish form

• Have corresponding Template tags

15

Page 16: The Anatomy of an Extension

!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

Page 17: The Anatomy of an Extension

!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

Page 18: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

WHAT ARE HOOKS?

18

Page 19: The Anatomy of an Extension

!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”

Page 20: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#20

How do hooks relate to Extensions?

Page 21: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#21

How do hooks relate to Extensions?

Page 22: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#22

HOOK PROCESSING1. ExpressionEngine encounters a "hook" in the system

Page 23: The Anatomy of an Extension

!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)

Page 24: The Anatomy of an Extension

!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

Page 25: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#25

HOOK PROCESSING4.If the add-on Extension file exists, it is loaded

Page 26: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#26

HOOK PROCESSING5.Within that Extension class, the method listed is

executed.

Page 27: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#27

How do hooks relate to Extensions?

Page 28: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#28

HOOK PROCESSINGLow Seg2Cat Example Applied

1. ExpressionEngine encounters the sessions_end hook in the system

Page 29: The Anatomy of an Extension

!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

Page 30: The Anatomy of an Extension

!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

Page 31: The Anatomy of an Extension

!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

Page 32: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#32

HOOK PROCESSINGLow Seg2Cat Example Applied

5.Finally EE executes the sessions_end method within the ext.low_seg2cat.php file

Page 33: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

EXTENSION PROCESSING

33

Page 34: The Anatomy of an Extension

!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

Page 35: The Anatomy of an Extension

!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

Page 36: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

HOOKS QUERY

SELECT DISTINCT ee.*FROM exp_extensions eeWHERE enabled = 'y'ORDER BY hook, priority ASC, class

36

From libraries/Extensions.php

Page 37: The Anatomy of an Extension

!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

Page 38: The Anatomy of an Extension

!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

Page 39: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#39

Extensions playing well with others

Page 40: The Anatomy of an Extension

!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

Page 41: The Anatomy of an Extension

!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

Page 42: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#42

Add-ons → Extensions

Page 43: The Anatomy of an Extension

!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";

Page 44: The Anatomy of an Extension

!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";

Page 45: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#45

exp_extensions table

Page 46: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#46

All content available online at:

focuslabllc.com/blog

Page 47: The Anatomy of an Extension

!ERIKREAGAN"""•"""EngineSummit"#$%#

!ERIKREAGANPartner"#Focus#Lab"#LLC!FocusLabLLC

47


Top Related