unleashing creative freedom with modx (2015-09-08 at phpamersfoort)

40
Unleashing Creative Freedom with

Upload: mark-hamstra

Post on 12-Apr-2017

232 views

Category:

Internet


1 download

TRANSCRIPT

Page 1: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Unleashing Creative Freedom with

Page 2: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Who am I?Mark Hamstra

Founder & CEA at modmore Freelance MODX Developer

my doggies

Turbo

Bommel

Page 3: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 4: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

What is your current platform of choice?

Page 5: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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

Page 6: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

https://twitpic.com/3pvrmw

Page 7: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

For who is MODX

• Web Professionals

• Designers

• Front-end developers

• Using MODX as a tool

• Est 4-5.000.000 sites

Page 8: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Community

• Free addons: 622 • Official Forum: forums.modx.com 50.571 • +- 1M views of modx.com per month • Twitter: #MODX • Slack: modx.org 289

Page 9: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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

Page 10: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Installs without Assumptions

Page 11: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Elements as Building Blocks

TemplatesTemplate Variables

ChunksSnippetsPlugins

Page 12: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Templates

• Usually HTML

• Contains MODX tags

• One template per page

Page 13: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 14: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Chunks

• Usually HTML

• Reusable piece of code

• [[$name-of-chunk]]Template

Chunk “head”

Page 15: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Snippets

• PHP!

• Comparable to a function

• Accepts properties

• [[name-of-snippet]] or [[!name-of-snippet]]

Snippet “helloWorld”

Template

Page 16: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Snippets

Page 17: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 18: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Plugins

• PHP!

• Event-based, so no tags

• Can read and often influence behaviour

Page 19: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 20: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 21: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Time for a Manager Tour!http://localhost/tmp/phpfrl/manager/

Page 22: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

MODX Architecture

Page 23: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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

Page 24: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

xPDO

• Object Relational Bridge / ORM

• Open Source (modxcms/xpdo)

• Extension to PHP’s PDO

• Support for MySQL, sqlsrv (and more)

Page 25: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Fetching a Single Object

$obj = $modx->getObject(‘modChunk’, 5);

$c = array(‘name’ => ‘head’);

$obj = $modx->getObject(‘modChunk’, $c)

Page 26: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 27: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 28: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 29: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

xPDO Package Schema - Head

<?xml version="1.0" encoding="UTF-8"?>

<model package="phpfrl"

baseClass="xPDOSimpleObject"

platform="mysql"

defaultEngine="MyISAM"

version="1.1">

Page 30: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 31: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 32: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 33: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 34: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

xPDO Generated Model

<?phpclass frlMeetup extends xPDOSimpleObject {

}

Page 35: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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 36: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)
Page 37: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Custom Resources

• Extend the base modResource object

• Custom processing logic

• Custom UI

Page 38: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Custom User Objects

• Extend the base modUser object

• Custom authentication logic

Page 39: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

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/15171 => talk feedback

Enjoy your Creative Freedom

Page 40: Unleashing Creative Freedom with MODX (2015-09-08 at PHPAmersfoort)

Thanks