SlideShare a Scribd company logo
Unleashing Creative
Freedom with
What is your current
platform of choice?
Who am I?
Mark Hamstra
Founder & CEA at modmore
Freelance MODX Developer
my doggies
Turbo
Bommel
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
MOD-what?
• Open Source
• Written in PHP (of course)
• Primarily used with MySQL, other drivers available
• Already 10 years old young
• Content Management System Framework Platform
https://twitpic.com/3pvrmw
For who is MODX
• Web Professionals
• Designers
• Front-end developers
• Using MODX as a tool
• Est 4-5.000.000 sites
Community
• Professional and helpful
• Official Forum: forums.modx.com 50.544
• +- 1M views of modx.com per month
• Twitter: #MODX
• Slack: modx.org 286
All the features of a CMS
rich text editor versioning user groups
multisite templates multilingual extensions
markdown media browser hierarchical
page tree commercial support automatic
menu builder blogging permissions seo
friendly urls server-side caching
Installs without Assumptions
Elements as Building Blocks
Templates
TemplateVariables
Chunks
Snippets
Plugins
Templates
• Usually HTML
• Contains MODX tags
• One template per page
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]]
Chunks
• Usually HTML
• Reusable piece of code
• [[$name-of-chunk]]
Template
Chunk “head”
Snippets
• PHP!
• Comparable to a function
• Accepts properties
• [[name-of-snippet]] or 

[[!name-of-snippet]]
Snippet “helloWorld”
Template
Snippets
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]]
But wait, there’s even more!
• [[helloWorld?

&property=`value`

]]
• [[$head?

&extraCss=`<link rel=.. href=..>`

]]
Plugins
• PHP!
• Event-based, so no tags
• Can read and often
influence behaviour
No need to reinvent

the wheel
• Packages (aka extras, add-
ons, extensions, third party
components…) provide
common functionality
• Install via Package Installer
inside the manager
Example: getResources
• Lists resources matching
conditions
• Uses a Chunk as template
• Use Cases:
• Article listings
• Dynamic (sub)menus
• RSS feed generation
Template
Chunk “blogListItem”
Time for a Manager Tour!
http://localhost/tmp/phpfrl/manager/
MODX Architecture
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
2015-07, cve.mitre.org
xPDO
• Object Relational Bridge / ORM
• Open Source (modxcms/xpdo)
• Extension to PHP’s PDO
• Support for MySQL, sqlsrv (and more)
Fetching a Single Object
$obj = $modx->getObject(‘modChunk’, 5);
$c = array(‘name’ => ‘head’);
$obj = $modx->getObject(‘modChunk’, $c)
Easy Query Builder
$c = $modx->newQuery(‘modResource’);
$c->where([
‘parent’ => 0,
‘AND:pagetitle:LIKE => ‘%About%’
]);
$matches = $modx->getCollection(‘modResource’, $c);
foreach ($matches as $modResource) { . . . }
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’); }
👍
⚠
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
xPDO Package Schema - Head
<?xml version="1.0" encoding="UTF-8"?>
<model package="phpfrl"
baseClass="xPDOSimpleObject"
platform="mysql"
defaultEngine="MyISAM"
version="1.1">
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>
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" />
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>
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>
xPDO Generated Model
<?php

class frlMeetup extends xPDOSimpleObject {
}
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->Speakers

foreach ($speakers as $spegfytaker) {

echo $speaker->name . ‘ zal vertellen over ‘ . $speaker->subject;

}
Unleashing Creative Freedom with MODX (2015-09-03 at GroningenPHP)
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/talk/view/15031 => please leave feedback
Enjoy your Creative Freedom

More Related Content

PDF
Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)
Mark Hamstra
 
PDF
Unleashing Creative Freedom with MODX - 2015-08-26 at PHP Zwolle
Mark Hamstra
 
PDF
Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)
Mark Hamstra
 
PPTX
PHP language presentation
Annujj Agrawaal
 
PDF
Doing Drupal security right
Gábor Hojtsy
 
PDF
Plone 5 theming
Victor De Alba
 
PPTX
Pragmatic plone projects
Andreas Jung
 
PPTX
Pragmatische Plone Projekte
Andreas Jung
 
Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)
Mark Hamstra
 
Unleashing Creative Freedom with MODX - 2015-08-26 at PHP Zwolle
Mark Hamstra
 
Unleashing Creative Freedom with MODX (2015-07-21 @ PHP FRL)
Mark Hamstra
 
PHP language presentation
Annujj Agrawaal
 
Doing Drupal security right
Gábor Hojtsy
 
Plone 5 theming
Victor De Alba
 
Pragmatic plone projects
Andreas Jung
 
Pragmatische Plone Projekte
Andreas Jung
 

What's hot (19)

PDF
What's up with Drupal 7?
Gábor Hojtsy
 
PDF
Doing Drupal security right from Drupalcon London
Gábor Hojtsy
 
PDF
Drupal Security from Drupalcamp Cologne 2009
Gábor Hojtsy
 
PDF
Drupal 7 Theme System
Peter Arato
 
PDF
itPage LDC 09 Presentation
Eric Landmann
 
PDF
Introduction to Drupal (7) Theming
Robert Carr
 
PDF
You Got React.js in My PHP
Taylor Lovett
 
PPTX
A look at Drupal 7 Theming
Aimee Maree
 
PDF
Transforming WordPress Search and Query Performance with Elasticsearch
Taylor Lovett
 
PDF
Php converted pdf
Northpole Web Service
 
PDF
How to start developing apps for Firefox OS
benko
 
PPT
Module development
ingraminnovation
 
PDF
Modernizing WordPress Search with Elasticsearch
Taylor Lovett
 
PDF
Drupal theming - a practical approach (European Drupal Days 2015)
Eugenio Minardi
 
PPTX
Php with mysql ppt
Rajamanickam Gomathijayam
 
PDF
JSON REST API for WordPress
Taylor Lovett
 
PPT
20110606 e z_flow_gig_v1
Gilles Guirand
 
PPT
Drupal Performance - SerBenfiquista.com Case Study
hernanibf
 
What's up with Drupal 7?
Gábor Hojtsy
 
Doing Drupal security right from Drupalcon London
Gábor Hojtsy
 
Drupal Security from Drupalcamp Cologne 2009
Gábor Hojtsy
 
Drupal 7 Theme System
Peter Arato
 
itPage LDC 09 Presentation
Eric Landmann
 
Introduction to Drupal (7) Theming
Robert Carr
 
You Got React.js in My PHP
Taylor Lovett
 
A look at Drupal 7 Theming
Aimee Maree
 
Transforming WordPress Search and Query Performance with Elasticsearch
Taylor Lovett
 
Php converted pdf
Northpole Web Service
 
How to start developing apps for Firefox OS
benko
 
Module development
ingraminnovation
 
Modernizing WordPress Search with Elasticsearch
Taylor Lovett
 
Drupal theming - a practical approach (European Drupal Days 2015)
Eugenio Minardi
 
Php with mysql ppt
Rajamanickam Gomathijayam
 
JSON REST API for WordPress
Taylor Lovett
 
20110606 e z_flow_gig_v1
Gilles Guirand
 
Drupal Performance - SerBenfiquista.com Case Study
hernanibf
 
Ad

Similar to Unleashing Creative Freedom with MODX (2015-09-03 at GroningenPHP) (20)

PDF
Introduction To Drupal
Lauren Roth
 
PDF
An Introduction to Tornado
Gavin Roy
 
PDF
GDG Addis - An Introduction to Django and App Engine
Yared Ayalew
 
PPTX
Creating Custom Templates for Joomla! 2.5
Don Cranford
 
PDF
Codeigniter
Joram Salinas
 
PPTX
Php reports sumit
Sumit Biswas
 
PPTX
CCI2018 - Automatizzare la creazione di risorse con ARM template e PowerShell
walk2talk srl
 
PPTX
ITPROceed 2016 - The Art of PowerShell Toolmaking
Kurt Roggen [BE]
 
PDF
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
Lucidworks
 
PPT
Php intro
Jennie Gajjar
 
PPT
Php intro
Jennie Gajjar
 
PPT
Php intro
Jennie Gajjar
 
PDF
Drupal 8 - Core and API Changes
Shabir Ahmad
 
PPTX
Office 365 Saturday (Sydney) - SharePoint framework – build integrated user e...
Anupam Ranku
 
PDF
ITB2017 - Keynote
Ortus Solutions, Corp
 
PDF
Gajendra sharma Drupal Module development
Gajendra Sharma
 
PPTX
Extending eZ Platform v2 with Symfony and React
eZ Systems
 
PDF
Ipc mysql php
Anis Berejeb
 
PDF
Staying Sane with Drupal NEPHP
Oscar Merida
 
PPTX
Introduction to Monsoon PHP framework
Krishna Srikanth Manda
 
Introduction To Drupal
Lauren Roth
 
An Introduction to Tornado
Gavin Roy
 
GDG Addis - An Introduction to Django and App Engine
Yared Ayalew
 
Creating Custom Templates for Joomla! 2.5
Don Cranford
 
Codeigniter
Joram Salinas
 
Php reports sumit
Sumit Biswas
 
CCI2018 - Automatizzare la creazione di risorse con ARM template e PowerShell
walk2talk srl
 
ITPROceed 2016 - The Art of PowerShell Toolmaking
Kurt Roggen [BE]
 
Challenges of Simple Documents: When Basic isn't so Basic - Cassandra Targett...
Lucidworks
 
Php intro
Jennie Gajjar
 
Php intro
Jennie Gajjar
 
Php intro
Jennie Gajjar
 
Drupal 8 - Core and API Changes
Shabir Ahmad
 
Office 365 Saturday (Sydney) - SharePoint framework – build integrated user e...
Anupam Ranku
 
ITB2017 - Keynote
Ortus Solutions, Corp
 
Gajendra sharma Drupal Module development
Gajendra Sharma
 
Extending eZ Platform v2 with Symfony and React
eZ Systems
 
Ipc mysql php
Anis Berejeb
 
Staying Sane with Drupal NEPHP
Oscar Merida
 
Introduction to Monsoon PHP framework
Krishna Srikanth Manda
 
Ad

More from Mark Hamstra (9)

PDF
The (Long) Road to Commerce 1.0
Mark Hamstra
 
PDF
Improving the MODX Documentation - March 29, 2019
Mark Hamstra
 
PDF
Commerce in 30 minutes (November 15, 2018 at MODX Meetup Maastricht)
Mark Hamstra
 
PDF
MODX Meetup 2018-03-07 - Introduction talk
Mark Hamstra
 
PDF
Dev, Staging & Production Workflow with Gitify (at MODXpo 2015 in Munich)
Mark Hamstra
 
PDF
Solving the Workflow - Building MODX.today with Gitify (2015-05-21, Alkmaar)
Mark Hamstra
 
PDF
Solving the Workflow (or, how MODX.today is being built with git and Gitify)
Mark Hamstra
 
PDF
MODX Weekend 2014 - Welcome Slides
Mark Hamstra
 
PDF
MODXpo 2013 - The Business of Premium - Day 2, 14:30
Mark Hamstra
 
The (Long) Road to Commerce 1.0
Mark Hamstra
 
Improving the MODX Documentation - March 29, 2019
Mark Hamstra
 
Commerce in 30 minutes (November 15, 2018 at MODX Meetup Maastricht)
Mark Hamstra
 
MODX Meetup 2018-03-07 - Introduction talk
Mark Hamstra
 
Dev, Staging & Production Workflow with Gitify (at MODXpo 2015 in Munich)
Mark Hamstra
 
Solving the Workflow - Building MODX.today with Gitify (2015-05-21, Alkmaar)
Mark Hamstra
 
Solving the Workflow (or, how MODX.today is being built with git and Gitify)
Mark Hamstra
 
MODX Weekend 2014 - Welcome Slides
Mark Hamstra
 
MODXpo 2013 - The Business of Premium - Day 2, 14:30
Mark Hamstra
 

Recently uploaded (20)

PPTX
The Latest Scam Shocking the USA in 2025.pptx
onlinescamreport4
 
PPTX
dns domain name system history work.pptx
MUHAMMADKAVISHSHABAN
 
PPTX
Pengenalan perangkat Jaringan komputer pada teknik jaringan komputer dan tele...
Prayudha3
 
PDF
The Internet of Things (IoT) refers to a vast network of interconnected devic...
chethana8182
 
PDF
KIPER4D situs Exclusive Game dari server Star Gaming Asia
hokimamad0
 
PDF
UI/UX Developer Guide: Tools, Trends, and Tips for 2025
Penguin peak
 
PPTX
原版北不列颠哥伦比亚大学毕业证文凭UNBC成绩单2025年新版在线制作学位证书
e7nw4o4
 
PPTX
Unlocking Hope : How Crypto Recovery Services Can Reclaim Your Lost Funds
lionsgate network
 
PPT
1965 INDO PAK WAR which Pak will never forget.ppt
sanjaychief112
 
PPTX
谢尔丹学院毕业证购买|Sheridan文凭不见了怎么办谢尔丹学院成绩单
mookxk3
 
PDF
Cybersecurity Awareness Presentation ppt.
banodhaharshita
 
PPTX
How tech helps people in the modern era.
upadhyayaryan154
 
PDF
Slides: PDF Eco Economic Epochs for World Game (s) pdf
Steven McGee
 
PPTX
Google SGE SEO: 5 Critical Changes That Could Wreck Your Rankings in 2025
Reversed Out Creative
 
PPT
Transformaciones de las funciones elementales.ppt
rirosel211
 
PDF
KIPER4D situs Exclusive Game dari server Star Gaming Asia
hokimamad0
 
PDF
Latest Scam Shocking the USA in 2025.pdf
onlinescamreport4
 
PPTX
B2B_Ecommerce_Internship_Simranpreet.pptx
LipakshiJindal
 
PDF
BGP Security Best Practices that Matter, presented at PHNOG 2025
APNIC
 
PPTX
The Internet of Things (IoT) refers to a vast network of interconnected devic...
chethana8182
 
The Latest Scam Shocking the USA in 2025.pptx
onlinescamreport4
 
dns domain name system history work.pptx
MUHAMMADKAVISHSHABAN
 
Pengenalan perangkat Jaringan komputer pada teknik jaringan komputer dan tele...
Prayudha3
 
The Internet of Things (IoT) refers to a vast network of interconnected devic...
chethana8182
 
KIPER4D situs Exclusive Game dari server Star Gaming Asia
hokimamad0
 
UI/UX Developer Guide: Tools, Trends, and Tips for 2025
Penguin peak
 
原版北不列颠哥伦比亚大学毕业证文凭UNBC成绩单2025年新版在线制作学位证书
e7nw4o4
 
Unlocking Hope : How Crypto Recovery Services Can Reclaim Your Lost Funds
lionsgate network
 
1965 INDO PAK WAR which Pak will never forget.ppt
sanjaychief112
 
谢尔丹学院毕业证购买|Sheridan文凭不见了怎么办谢尔丹学院成绩单
mookxk3
 
Cybersecurity Awareness Presentation ppt.
banodhaharshita
 
How tech helps people in the modern era.
upadhyayaryan154
 
Slides: PDF Eco Economic Epochs for World Game (s) pdf
Steven McGee
 
Google SGE SEO: 5 Critical Changes That Could Wreck Your Rankings in 2025
Reversed Out Creative
 
Transformaciones de las funciones elementales.ppt
rirosel211
 
KIPER4D situs Exclusive Game dari server Star Gaming Asia
hokimamad0
 
Latest Scam Shocking the USA in 2025.pdf
onlinescamreport4
 
B2B_Ecommerce_Internship_Simranpreet.pptx
LipakshiJindal
 
BGP Security Best Practices that Matter, presented at PHNOG 2025
APNIC
 
The Internet of Things (IoT) refers to a vast network of interconnected devic...
chethana8182
 

Unleashing Creative Freedom with MODX (2015-09-03 at GroningenPHP)

  • 2. What is your current platform of choice?
  • 3. Who am I? Mark Hamstra Founder & CEA at modmore Freelance MODX Developer my doggies Turbo Bommel
  • 4. 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
  • 5. MOD-what? • Open Source • Written in PHP (of course) • Primarily used with MySQL, other drivers available • Already 10 years old young • Content Management System Framework Platform
  • 7. For who is MODX • Web Professionals • Designers • Front-end developers • Using MODX as a tool • Est 4-5.000.000 sites
  • 8. Community • Professional and helpful • Official Forum: forums.modx.com 50.544 • +- 1M views of modx.com per month • Twitter: #MODX • Slack: modx.org 286
  • 9. All the features of a CMS rich text editor versioning user groups multisite templates multilingual extensions markdown media browser hierarchical page tree commercial support automatic menu builder blogging permissions seo friendly urls server-side caching
  • 11. Elements as Building Blocks Templates TemplateVariables Chunks Snippets Plugins
  • 12. Templates • Usually HTML • Contains MODX tags • One template per page
  • 13. 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]]
  • 14. Chunks • Usually HTML • Reusable piece of code • [[$name-of-chunk]] Template Chunk “head”
  • 15. Snippets • PHP! • Comparable to a function • Accepts properties • [[name-of-snippet]] or 
 [[!name-of-snippet]] Snippet “helloWorld” Template
  • 17. 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]]
  • 18. But wait, there’s even more! • [[helloWorld?
 &property=`value`
 ]] • [[$head?
 &extraCss=`<link rel=.. href=..>`
 ]]
  • 19. Plugins • PHP! • Event-based, so no tags • Can read and often influence behaviour
  • 20. No need to reinvent
 the wheel • Packages (aka extras, add- ons, extensions, third party components…) provide common functionality • Install via Package Installer inside the manager
  • 21. Example: getResources • Lists resources matching conditions • Uses a Chunk as template • Use Cases: • Article listings • Dynamic (sub)menus • RSS feed generation Template Chunk “blogListItem”
  • 22. Time for a Manager Tour! http://localhost/tmp/phpfrl/manager/
  • 24. 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 2015-07, cve.mitre.org
  • 25. xPDO • Object Relational Bridge / ORM • Open Source (modxcms/xpdo) • Extension to PHP’s PDO • Support for MySQL, sqlsrv (and more)
  • 26. Fetching a Single Object $obj = $modx->getObject(‘modChunk’, 5); $c = array(‘name’ => ‘head’); $obj = $modx->getObject(‘modChunk’, $c)
  • 27. Easy Query Builder $c = $modx->newQuery(‘modResource’); $c->where([ ‘parent’ => 0, ‘AND:pagetitle:LIKE => ‘%About%’ ]); $matches = $modx->getCollection(‘modResource’, $c); foreach ($matches as $modResource) { . . . }
  • 28. 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’); } 👍 ⚠
  • 29. 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
  • 30. xPDO Package Schema - Head <?xml version="1.0" encoding="UTF-8"?> <model package="phpfrl" baseClass="xPDOSimpleObject" platform="mysql" defaultEngine="MyISAM" version="1.1">
  • 31. 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>
  • 32. 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" />
  • 33. 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>
  • 34. 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>
  • 35. xPDO Generated Model <?php
 class frlMeetup extends xPDOSimpleObject { }
  • 36. 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->Speakers
 foreach ($speakers as $spegfytaker) {
 echo $speaker->name . ‘ zal vertellen over ‘ . $speaker->subject;
 }
  • 38. 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/talk/view/15031 => please leave feedback Enjoy your Creative Freedom