![Page 1: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/1.jpg)
July 2015 Meetup
www.php.frl / www.meetup.com/PHP-FRL / @PHPFRL
![Page 2: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/2.jpg)
Echo ‘Hello World!’;www.php.frl / www.meetup.com/PHP-FRL / @PHPFRL
![Page 3: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/3.jpg)
Location Sponsor
Pronamic
www.php.frl / www.meetup.com/PHP-FRL / @PHPFRL
![Page 4: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/4.jpg)
Speaker
Mark Hamstra Unleashing Creative Freedom with MODX
www.php.frl / www.meetup.com/PHP-FRL / @PHPFRL
![Page 5: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/5.jpg)
Unleashing Creative Freedom with
![Page 6: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/6.jpg)
Who am I?Mark Hamstra
Founder & CEA at modmore Freelance MODX Developer
not me
Turbo
Bommel
![Page 7: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/7.jpg)
Agenda
• What is MODX, for whom, available features, how to build a MODX site
• Tour of the MODX Manager (back-end)
• The Architecture of MODX, xPDO ORM, extending and overriding
![Page 8: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/8.jpg)
MOD-what?
![Page 9: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/9.jpg)
MOD-what?
• Open Source
![Page 10: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/10.jpg)
MOD-what?
• Open Source
• Written in PHP (of course)
![Page 11: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/11.jpg)
MOD-what?
• Open Source
• Written in PHP (of course)
• Already 10 years old young
![Page 12: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/12.jpg)
MOD-what?
• Open Source
• Written in PHP (of course)
• Already 10 years old young
• Content ManagementSystem Framework Platform
![Page 13: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/13.jpg)
All the features of a CMS
![Page 14: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/14.jpg)
All the features of a CMS
rich text editor versioning user groupsmultisite templates multilingual extensionsmarkdown media browser hierarchicalpage tree commercial support automaticmenu builder blogging permissions seofriendly urls server-side caching
![Page 15: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/15.jpg)
Out-of-the-box Install
![Page 16: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/16.jpg)
Out-of-the-box Install
![Page 17: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/17.jpg)
Elements as Building Blocks
TemplatesTemplate Variables
ChunksSnippetsPlugins
![Page 18: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/18.jpg)
Templates
• Usually HTML
• Contains MODX tags
• One template per page
![Page 19: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/19.jpg)
Template Variables
• Custom field for resources
• Commonly “TV”
• Tied to templates
• Text, image, select, checkbox, date, radio, richtext, tag and custom types available
• [[*name-of-tv]]
![Page 20: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/20.jpg)
Chunks
• Usually HTML
• Reusable piece of code
• [[$name-of-chunk]]Template
Chunk “head”
![Page 21: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/21.jpg)
Snippets
• PHP!
• Comparable to a function
• Accepts properties
• [[name-of-snippet]] or [[!name-of-snippet]]
Snippet “helloWorld”
Template
![Page 22: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/22.jpg)
Snippets
![Page 23: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/23.jpg)
But wait, there’s more!
• [[name-of-snippet]]
• [[!name-of-snippet]]
• = uncached!
• [[++name-of-setting]][[!++name-of-setting]]
• [[$name-of-chunk]][[!$name-of-chunk]]
• [[*name-of-field]][[!*name-of-field]]
![Page 24: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/24.jpg)
But wait, there’s even more!
• [[helloWorld? &property=`value ̀]]
• [[$head? &extraCss=`<link rel=.. href=..> ̀]]
![Page 25: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/25.jpg)
Plugins
• PHP!
• Event-based, so no tags
• Can read and often influence behaviour
![Page 26: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/26.jpg)
No need to reinventthe wheel
• Packages (aka extras, add-ons, extensions, third party components…) provide common functionality
• Install via Package Installer inside the manager
![Page 27: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/27.jpg)
Example: getResources
• Lists resources matching conditions
• Uses a Chunk as template
• Use Cases:
• Article listings
• Dynamic (sub)menus
• RSS feed generation
Template
Chunk “blogListItem”
![Page 29: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/29.jpg)
MODX Architecture
![Page 31: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/31.jpg)
Secure by Design
• Automatic $_GET, $_POST, $_REQUEST sanitisation in the request handler
cve.mitre.org
![Page 32: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/32.jpg)
Secure by Design
• Automatic $_GET, $_POST, $_REQUEST sanitisation in the request handler
• xPDO ORM prevents SQL Injections
cve.mitre.org
![Page 33: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/33.jpg)
Secure by Design
• Automatic $_GET, $_POST, $_REQUEST sanitisation in the request handler
• xPDO ORM prevents SQL Injections
• 28 CVE entries, 8 since 2014• WordPress: 906, already ~85 in 2015• Drupal: 915, already ~120 in 2015
cve.mitre.org
![Page 34: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/34.jpg)
xPDO
![Page 35: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/35.jpg)
xPDO
• Object Relational Bridge / ORM
![Page 36: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/36.jpg)
xPDO
• Object Relational Bridge / ORM
• Open Source (modxcms/xpdo)
![Page 37: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/37.jpg)
xPDO
• Object Relational Bridge / ORM
• Open Source (modxcms/xpdo)
• Extension to PHP’s PDO
![Page 38: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/38.jpg)
xPDO
• Object Relational Bridge / ORM
• Open Source (modxcms/xpdo)
• Extension to PHP’s PDO
• Support for MySQL, sqlsrv (and more)
![Page 39: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/39.jpg)
Fetching a Single Object
$c = 5;
$obj = $modx->getObject(‘modChunk’, $c);
$c2 = array(‘name’ => ‘head’);
$obj = $modx->getObject(‘modChunk’, $c2)
![Page 40: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/40.jpg)
Easy Query Builder
$c = $modx->newQuery(‘modResource’);
$c->where([
‘parent’ => 0,
‘AND:pagetitle:LIKE => ‘%About%’
]);
$matches = $modx->getCollection(‘modResource’, $c);
foreach ($matches as $modResource) { . . . }
![Page 41: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/41.jpg)
Automatic Filtering
$search = $_POST[‘search’];
$c = $modx->newQuery(‘modResource’);
$c->where([
‘introtext:LIKE’ => “%{$search}%”,
]);
$modx->setPlaceholder(‘search’, sanitise($search));
function sanitise($value) { return htmlentities($value, ENT_QUOTES, ‘UTF-8’); }
👍
⚠
![Page 42: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/42.jpg)
Custom Models with xPDO
![Page 43: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/43.jpg)
Custom Models with xPDO
1. Create an xPDO Package Schema (XML)
2. Use build script to write schema into the actual model files/classes
3. Register it before use ($modx->addPackage)
4. Use any xPDO method (getObject, getCollection) on your custom model
![Page 44: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/44.jpg)
xPDO Package Schema - Head
<?xml version="1.0" encoding="UTF-8"?>
<model package="phpfrl"
baseClass="xPDOSimpleObject"
platform="mysql"
defaultEngine="MyISAM"
version="1.1">
![Page 45: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/45.jpg)
xPDO Package Schema - Object
<?xml version="1.0" encoding="UTF-8"?>
<model package=“phpfrl” …
<object class="frlMeetup" table=“meetups”>
.. fields ..
</object>
<object class="frlSpeaker" table=“speakers”> … </object>
</model>
![Page 46: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/46.jpg)
xPDO Package Schema - Fields<?xml version="1.0" encoding="UTF-8"?>
<model package=“phpfrl” …
<object class="frlMeetup" table=“meetups">
<field key="name" dbtype="varchar" precision="100" phptype="string" null="false" default=“PHP FRL Meetup" />
![Page 47: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/47.jpg)
xPDO Package Schema - Indices
<?xml version="1.0" encoding="UTF-8"?>
<model package=“phpfrl” …
<object class="frlMeetup" table=“meetups"> <field key="name" dbtype=“varchar" … <field key=“starts_on" dbtype=“datetime" <field key="name" dbtype=“varchar" …
<index alias="name" name="name" primary="false" unique="false" type="BTREE"> <column key="name" length="" collation="A" null="false" /> </index> </object>
![Page 48: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/48.jpg)
xPDO Package Schema - Relations<?xml version="1.0" encoding="UTF-8"?>
<model package=“phpfrl” baseClass=“xPDOSimpleObject" …
<object class="frlMeetup" table=“meetups"> <field key="name" dbtype=“varchar” …>
<composite alias=“Speakers” class=“frlSpeaker” local=“id” foreign=“meetup” cardinality=“many” owner=“local” /> </object>
<object class="frlSpeaker" table=“speakers"> <field key="name" dbtype=“varchar” …> <field key="meetup" dbtype=“int” …>
<aggregate alias=“Meetup” class=“frlMeetup” local=“meetup” foreign=“id” cardinality=“one” owner=“foreign” /> </object>
![Page 49: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/49.jpg)
xPDO Generated Model
<?phpclass frlMeetup extends xPDOSimpleObject {
}
<?php
class frlMeetup_mysql extends frlMeetup {
}
![Page 50: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/50.jpg)
Interacting with that model$modx->addPackage(‘phpfrl’, ‘/path/to/model/‘);
$c = $modx->newQuery(‘frlMeetup’);$c->sortby(‘starts_on’, ‘DESC’);$meetup = $modx->getObject(‘frlMeetup’, $c);
echo ‘De volgende meetup is ‘ . $meetup->name . ‘ en vind plaats op ‘ . $meetup->starts_on . ‘. ’;
$speakers = $meetup->getMany(‘Speakers’); // or just $meetup->Speakersforeach ($speakers as $spegfytaker) { echo $speaker->name . ‘ zal vertellen over ‘ . $speaker->subject;}
![Page 51: Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)](https://reader034.vdocuments.site/reader034/viewer/2022042819/55cceea4bb61eb645b8b45f4/html5/thumbnails/51.jpg)
Interesting links: • MODX.com => official website • rtfm.modx.com => official documentation • github.com/modxcms/revolution => source code • MODX.today => daily links/articles about MODX • modmore.com => premium extras for MODX • https://joind.in/14897 => please leave feedback
Enjoy your Creative Freedom