266
Extreme Syndication The Lean, Mean, Content-Serving Machine

Extreme Syndication · What is Syndication? Three episodes of The Simpsons every single day Content produced by one site is shown on another Consumer can use data as they desire Producer

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Extreme SyndicationThe Lean, Mean, Content-Serving Machine

What is Syndication?

What is Syndication?

Three episodes of The Simpsons every single day

What is Syndication?

Three episodes of The Simpsons every single day

Content produced by one site is shown on another

What is Syndication?

Three episodes of The Simpsons every single day

Content produced by one site is shown on another

Consumer can use data as they desire

What is Syndication?

Three episodes of The Simpsons every single day

Content produced by one site is shown on another

Consumer can use data as they desire

Producer gets more exposure for their content

Built-In SolutionsNo Assembly Required

Built-In SolutionsCollaboration System RSS Feed

Built-In SolutionsCollaboration System RSS Feed

Calendar iCalendar Feed

Built-In SolutionsCollaboration System RSS Feed

Calendar iCalendar Feed

Syndicated Content RSS Feed

Built-In SolutionsCollaboration System RSS Feed

Calendar iCalendar Feed

Syndicated Content RSS Feed

Gallery RSS Feeds

Gallery List Albums

Gallery List Albums

Gallery Album

Gallery Album

My Gallery

My Gallery

Built-In SolutionsCollaboration System RSS Feed

Calendar iCalendar Feed

Syndicated Content RSS Feed

Gallery RSS Feeds

Widget macro

The Widget Macro

The Widget Macro

Provides code to display an asset from your site on another site

The Widget Macro

Provides code to display an asset from your site on another site

^Widget( assetUrl [, width, height, templateId] );

The Widget Macro

Provides code to display an asset from your site on another site

^Widget( assetUrl [, width, height, templateId] );

If no templateId, uses www_ajaxInlineView

The Widget Macro

Provides code to display an asset from your site on another site

^Widget( assetUrl [, width, height, templateId] );

If no templateId, uses www_ajaxInlineView

Otherwise, uses www_widgetView

The Widget Macro

The Widget Macro

Not just for static content

The Widget Macro

Not just for static content

Forms inside the Widget frame work

The Widget Macro

Not just for static content

Forms inside the Widget frame work

Collaboration System

The Widget Macro

Not just for static content

Forms inside the Widget frame work

Collaboration System

DataForm

The Widget Macro

Not just for static content

Forms inside the Widget frame work

Collaboration System

DataForm

Thingy

The Widget Macro

Not just for static content

Forms inside the Widget frame work

Collaboration System

DataForm

Thingy

Form will open in a new window

Built-In SolutionsCollaboration System RSS Feed

Calendar iCalendar Feed

Syndicated Content RSS Feed

Gallery RSS Feeds

Widget macro

Ajax Inline View

Ajax Inline View

Ajax Inline View

Display just the asset content

Ajax Inline View

Display just the asset content

No style

Ajax Inline View

Display just the asset content

No style

Not even a fully-formed HTML document

Ajax Inline View

Display just the asset content

No style

Not even a fully-formed HTML document

Useful with AJAX / YUI Connection

Ajax Inline View

Display just the asset content

No style

Not even a fully-formed HTML document

Useful with AJAX / YUI Connection

http://example.com/asset?func=ajaxInlineView

Ajax Inline View

Display just the asset content

No style

Not even a fully-formed HTML document

Useful with AJAX / YUI Connection

http://example.com/asset?func=ajaxInlineView

element.innerHTML = ajaxInlineViewContent

RSS From AnythingBuilding a Better Soapbox

What is RSS?

What is RSS?

Really Simple Syndication

What is RSS?

Really Simple Syndication

The standard for syndication on the Web

What is RSS?

Really Simple Syndication

The standard for syndication on the Web

An XML dialect

What is RSS?

Really Simple Syndication

The standard for syndication on the Web

An XML dialect

Just another type of markup

What is RSS?

Really Simple Syndication

The standard for syndication on the Web

An XML dialect

Just another type of markup

WebGUI is all about markup

RSS A Folder

RSS A Folder

Folder contains documents

RSS A Folder

Folder contains documents

Keep existing functionality

RSS A Folder

Folder contains documents

Keep existing functionality

Add an RSS feed using Shortcuts and new templates

RSS A FolderCreate a Shortcut for the RSS Feed

RSS A FolderCreate a Shortcut for the RSS Feed

Edit the Shortcut to have the right properties

RSS A FolderCreate a Shortcut for the RSS Feed

Edit the Shortcut to have the right properties

Make a new template for the Folder

What RSS Is... Really<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0">

<channel> <title>Example.com RSS Feed</title> <link>http://www.example.com</link> <description>RSS</description>

<item> <title>Grand Opening</title> <link>http://www.example.com/grand-opening</link> <description>A Welcome Message from Example.com</description> </item>

<item> <title>Grand Closing</title> <link>http://www.example.com/thanks-for-the-fish</link> </item>

</channel>

</rss>

What RSS Is... Really<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0">

<channel> <title>Example.com RSS Feed</title> <link>http://www.example.com</link> <description>RSS</description>

<item> <title>Grand Opening</title> <link>http://www.example.com/grand-opening</link> <description>A Welcome Message from Example.com</description> </item>

<item> <title>Grand Closing</title> <link>http://www.example.com/thanks-for-the-fish</link> </item>

</channel>

</rss>

XML Prologue

What RSS Is... Really<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0">

<channel> <title>Example.com RSS Feed</title> <link>http://www.example.com</link> <description>RSS</description>

<item> <title>Grand Opening</title> <link>http://www.example.com/grand-opening</link> <description>A Welcome Message from Example.com</description> </item>

<item> <title>Grand Closing</title> <link>http://www.example.com/thanks-for-the-fish</link> </item>

</channel>

</rss>

RSS declaration

What RSS Is... Really<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0">

<channel> <title>Example.com RSS Feed</title> <link>http://www.example.com</link> <description>RSS</description>

<item> <title>Grand Opening</title> <link>http://www.example.com/grand-opening</link> <description>A Welcome Message from Example.com</description> </item>

<item> <title>Grand Closing</title> <link>http://www.example.com/thanks-for-the-fish</link> </item>

</channel>

</rss>

Channel declaration

What RSS Is... Really<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0">

<channel> <title>Example.com RSS Feed</title> <link>http://www.example.com</link> <description>RSS</description>

<item> <title>Grand Opening</title> <link>http://www.example.com/grand-opening</link> <description>A Welcome Message from Example.com</description> </item>

<item> <title>Grand Closing</title> <link>http://www.example.com/thanks-for-the-fish</link> </item>

</channel>

</rss>

Each channel has a title, a link, and a description

What RSS Is... Really<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0">

<channel> <title>Example.com RSS Feed</title> <link>http://www.example.com</link> <description>RSS</description>

<item> <title>Grand Opening</title> <link>http://www.example.com/grand-opening</link> <description>A Welcome Message from Example.com</description> </item>

<item> <title>Grand Closing</title> <link>http://www.example.com/thanks-for-the-fish</link> </item>

</channel>

</rss>

Each channel has multiple items

What RSS Is... Really<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0">

<channel> <title>Example.com RSS Feed</title> <link>http://www.example.com</link> <description>RSS</description>

<item> <title>Grand Opening</title> <link>http://www.example.com/grand-opening</link> <description>A Welcome Message from Example.com</description> </item>

<item> <title>Grand Closing</title> <link>http://www.example.com/thanks-for-the-fish</link> </item>

</channel>

</rss>

Each item has a title, link, and description

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

XML Prologue

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

RSS Declaration

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

Channel Declaration

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

Folder Title

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

Folder URL

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

Company URL Macro

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

Gateway Macro with Folder URL

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

Folder Description

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

CDATA to Escape HTML

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><tmpl_var description escape="HTML"></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

Another way to escape HTML

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

File Loop

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

File Title

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

File URL

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

File Description

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

Show the Image

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

<channel> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[<tmpl_var description>]]></description>

<tmpl_loop file.loop> <item> <title><tmpl_var title></title> <link>^u;^/(<tmpl_var url>);</link> <description><![CDATA[ <tmpl_if isImage><img src="^u;^/(<tmpl_var url>); /></tmpl_if> <tmpl_var synopsis> ]]></description> </item> </tmpl_loop>

</channel>

</rss>

File Description

RSS A FolderCreate a Shortcut for the RSS Feed

Edit the Shortcut to have the right properties

Make a new template for the Folder

Apply the template to a Shortcut Override

RSS A FolderCreate a Shortcut for the RSS Feed

Edit the Shortcut to have the right properties

Make a new template for the Folder

Apply the template to a Shortcut Override

Create a Snippet with the right content type

RSS A FolderCreate a Shortcut for the RSS Feed

Edit the Shortcut to have the right properties

Make a new template for the Folder

Apply the template to a Shortcut Override

Create a Snippet with the right content type

Tell the browser where to find the RSS

<link rel="alternate" href="/document-repository.rss" type="application/rss+xml" />

<link rel="alternate" href="/document-repository.rss" type="application/rss+xml" />

<link rel="alternate" href="/document-repository.rss" type="application/rss+xml" />

Alternate Version

<link rel="alternate" href="/document-repository.rss" type="application/rss+xml" />

Alternate Version

<link rel="alternate" href="/document-repository.rss" type="application/rss+xml" />

Location

<link rel="alternate" href="/document-repository.rss" type="application/rss+xml" />

Location

<link rel="alternate" href="/document-repository.rss" type="application/rss+xml" />

Content Type

<link rel="alternate" href="/document-repository.rss" type="application/rss+xml" />

Content Type

RSS Beyond

Apply this technique to any asset you want

Page Layouts / Articles

DataForm

Thingy

RSS Trouble

RSS Trouble

Test your feed outside any browser

curl or wget

RSS Trouble

Test your feed outside any browser

curl or wget

Validate your feed

W3 Feed Validator: http://validator.w3.org/feed/

JSON FeedsBringing Power to Those Who Can Use It

JSON?

JSON?

JavaScript Object Notation

JSON?

JavaScript Object Notation

The JavaScript code to create a JavaScript Object

JSON?

JavaScript Object Notation

The JavaScript code to create a JavaScript Object

Strikingly similar to a Perl hash

JSON?

JavaScript Object Notation

The JavaScript code to create a JavaScript Object

Strikingly similar to a Perl hash

The format used in WebGUI's configuration file

JSON?

JavaScript Object Notation

The JavaScript code to create a JavaScript Object

Strikingly similar to a Perl hash

The format used in WebGUI's configuration file

Many libraries exist in multiple languages

JSON?

JavaScript Object Notation

The JavaScript code to create a JavaScript Object

Strikingly similar to a Perl hash

The format used in WebGUI's configuration file

Many libraries exist in multiple languages

The best way to get information to JavaScript

JSON A Folder

JSON A Folder

Folder contains images

JSON A Folder

Folder contains images

Keep existing functionality

JSON A Folder

Folder contains images

Keep existing functionality

Allow users to get a JSON array of images to do with what they please

JSON A FolderCreate a Shortcut for the JSON feed

JSON A FolderCreate a Shortcut for the JSON feed

Edit the Shortcut to have the right properties

JSON A FolderCreate a Shortcut for the JSON feed

Edit the Shortcut to have the right properties

Make a new template for the Folder

What JSON is... Really// An array[ "one", "two", "three" ]

// An object{ "one" : 1, "two" : 2, "three" : 3}

// A more complicated object{ "letters" : [ "a", "b", "c" ], "numbers" : [ 1, 2, 3 ]}

// An array of objects[ { "name" : "Doug" }, { "name" : "Frank" }]

What JSON is... Really// An array[ "one", "two", "three" ]

// An object{ "one" : 1, "two" : 2, "three" : 3}

// A more complicated object{ "letters" : [ "a", "b", "c" ], "numbers" : [ 1, 2, 3 ]}

// An array of objects[ { "name" : "Doug" }, { "name" : "Frank" }]

var obj = eval( "(" + json + ")" );

obj[0] == "one"obj[2] == "three"

What JSON is... Really// An array[ "one", "two", "three" ]

// An object{ "one" : 1, "two" : 2, "three" : 3}

// A more complicated object{ "letters" : [ "a", "b", "c" ], "numbers" : [ 1, 2, 3 ]}

// An array of objects[ { "name" : "Doug" }, { "name" : "Frank" }]

var obj = eval( "(" + json + ")" );

obj.one == 1obj[ "three" ] == 3

What JSON is... Really// An array[ "one", "two", "three" ]

// An object{ "one" : 1, "two" : 2, "three" : 3}

// A more complicated object{ "letters" : [ "a", "b", "c" ], "numbers" : [ 1, 2, 3 ]}

// An array of objects[ { "name" : "Doug" }, { "name" : "Frank" }]

var obj = eval( "(" + json + ")" );

obj.letters[0] == "a"obj[ "numbers"][ 1 ] == 2

What JSON is... Really// An array[ "one", "two", "three" ]

// An object{ "one" : 1, "two" : 2, "three" : 3}

// A more complicated object{ "letters" : [ "a", "b", "c" ], "numbers" : [ 1, 2, 3 ]}

// An array of objects[ { "name" : "Doug" }, { "name" : "Frank" }]

var obj = eval( "(" + json + ")" );

obj[0].name == "Doug"obj[1].name == "Frank"

{"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);","files" : [

<tmpl_loop files.loop>{

"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);"

}<tmpl_unless __LAST__>,</tmpl_unless></tmpl_loop>

]}

{"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);","files" : [

<tmpl_loop files.loop>{

"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);"

}<tmpl_unless __LAST__>,</tmpl_unless></tmpl_loop>

]}

{"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);","files" : [

<tmpl_loop files.loop>{

"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);"

}<tmpl_unless __LAST__>,</tmpl_unless></tmpl_loop>

]}

Folder Title

{"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);","files" : [

<tmpl_loop files.loop>{

"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);"

}<tmpl_unless __LAST__>,</tmpl_unless></tmpl_loop>

]}

Escape special characters

{"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);","files" : [

<tmpl_loop files.loop>{

"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);"

}<tmpl_unless __LAST__>,</tmpl_unless></tmpl_loop>

]}

Folder URL

{"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);","files" : [

<tmpl_loop files.loop>{

"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);"

}<tmpl_unless __LAST__>,</tmpl_unless></tmpl_loop>

]}

Files Loop

{"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);","files" : [

<tmpl_loop files.loop>{

"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);"

}<tmpl_unless __LAST__>,</tmpl_unless></tmpl_loop>

]}

Files Information

{"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);","files" : [

<tmpl_loop files.loop>{

"title" : "<tmpl_var title escape="JS">","url" : "^u;^/(<tmpl_var url escape="JS">);"

}<tmpl_unless __LAST__>,</tmpl_unless></tmpl_loop>

]}

Proper Syntax

JSON A FolderCreate a Shortcut for the JSON feed

Edit the Shortcut to have the right properties

Make a new template for the Folder

Apply the template to a Shortcut Override

JSON A FolderCreate a Shortcut for the JSON feed

Edit the Shortcut to have the right properties

Make a new template for the Folder

Apply the template to a Shortcut Override

Create a Snippet with the right content type

JSON A FolderCreate a Shortcut for the JSON feed

Edit the Shortcut to have the right properties

Make a new template for the Folder

Apply the template to a Shortcut Override

Create a Snippet with the right content type

Test the JSON feed

<script src="^Extras(yui/build/yahoo-dom-event/yahoo-dom-event.js);"></script><script src="^Extras(yui/build/json/json-min.js);"></script><script src="^Extras(yui/build/connection/connection-min.js);"></script><script type="text/javascript">

var url = "/photo-stream.json";

var callback = {success : function (o) {

if ( YAHOO.lang.JSON.isValid( o.responseText ) ) {alert( url + " is valid JSON" );

}else {

alert( url + " is not valid JSON" );}

},failure : function (o) {

alert( url + " does not seem to exist: " + o.responseText );}

};

YAHOO.util.Connect.asyncRequest( "GET", url, callback );</script>

<script src="^Extras(yui/build/yahoo-dom-event/yahoo-dom-event.js);"></script><script src="^Extras(yui/build/json/json-min.js);"></script><script src="^Extras(yui/build/connection/connection-min.js);"></script><script type="text/javascript">

var url = "/photo-stream.json";

var callback = {success : function (o) {

if ( YAHOO.lang.JSON.isValid( o.responseText ) ) {alert( url + " is valid JSON" );

}else {

alert( url + " is not valid JSON" );}

},failure : function (o) {

alert( url + " does not seem to exist: " + o.responseText );}

};

YAHOO.util.Connect.asyncRequest( "GET", url, callback );</script>

<script src="^Extras(yui/build/yahoo-dom-event/yahoo-dom-event.js);"></script><script src="^Extras(yui/build/json/json-min.js);"></script><script src="^Extras(yui/build/connection/connection-min.js);"></script><script type="text/javascript">

var url = "/photo-stream.json";

var callback = {success : function (o) {

if ( YAHOO.lang.JSON.isValid( o.responseText ) ) {alert( url + " is valid JSON" );

}else {

alert( url + " is not valid JSON" );}

},failure : function (o) {

alert( url + " does not seem to exist: " + o.responseText );}

};

YAHOO.util.Connect.asyncRequest( "GET", url, callback );</script>

Grab YUI Modules

<script src="^Extras(yui/build/yahoo-dom-event/yahoo-dom-event.js);"></script><script src="^Extras(yui/build/json/json-min.js);"></script><script src="^Extras(yui/build/connection/connection-min.js);"></script><script type="text/javascript">

var url = "/photo-stream.json";

var callback = {success : function (o) {

if ( YAHOO.lang.JSON.isValid( o.responseText ) ) {alert( url + " is valid JSON" );

}else {

alert( url + " is not valid JSON" );}

},failure : function (o) {

alert( url + " does not seem to exist: " + o.responseText );}

};

YAHOO.util.Connect.asyncRequest( "GET", url, callback );</script>

Photo Stream URL

<script src="^Extras(yui/build/yahoo-dom-event/yahoo-dom-event.js);"></script><script src="^Extras(yui/build/json/json-min.js);"></script><script src="^Extras(yui/build/connection/connection-min.js);"></script><script type="text/javascript">

var url = "/photo-stream.json";

var callback = {success : function (o) {

if ( YAHOO.lang.JSON.isValid( o.responseText ) ) {alert( url + " is valid JSON" );

}else {

alert( url + " is not valid JSON" );}

},failure : function (o) {

alert( url + " does not seem to exist: " + o.responseText );}

};

YAHOO.util.Connect.asyncRequest( "GET", url, callback );</script>

YUI Connection Callback

<script src="^Extras(yui/build/yahoo-dom-event/yahoo-dom-event.js);"></script><script src="^Extras(yui/build/json/json-min.js);"></script><script src="^Extras(yui/build/connection/connection-min.js);"></script><script type="text/javascript">

var url = "/photo-stream.json";

var callback = {success : function (o) {

if ( YAHOO.lang.JSON.isValid( o.responseText ) ) {alert( url + " is valid JSON" );

}else {

alert( url + " is not valid JSON" );}

},failure : function (o) {

alert( url + " does not seem to exist: " + o.responseText );}

};

YAHOO.util.Connect.asyncRequest( "GET", url, callback );</script>

Test the JSON

<script src="^Extras(yui/build/yahoo-dom-event/yahoo-dom-event.js);"></script><script src="^Extras(yui/build/json/json-min.js);"></script><script src="^Extras(yui/build/connection/connection-min.js);"></script><script type="text/javascript">

var url = "/photo-stream.json";

var callback = {success : function (o) {

if ( YAHOO.lang.JSON.isValid( o.responseText ) ) {alert( url + " is valid JSON" );

}else {

alert( url + " is not valid JSON" );}

},failure : function (o) {

alert( url + " does not seem to exist: " + o.responseText );}

};

YAHOO.util.Connect.asyncRequest( "GET", url, callback );</script>

Test the JSON

<script src="^Extras(yui/build/yahoo-dom-event/yahoo-dom-event.js);"></script><script src="^Extras(yui/build/json/json-min.js);"></script><script src="^Extras(yui/build/connection/connection-min.js);"></script><script type="text/javascript">

var url = "/photo-stream.json";

var callback = {success : function (o) {

if ( YAHOO.lang.JSON.isValid( o.responseText ) ) {alert( url + " is valid JSON" );

}else {

alert( url + " is not valid JSON" );}

},failure : function (o) {

alert( url + " does not seem to exist: " + o.responseText );}

};

YAHOO.util.Connect.asyncRequest( "GET", url, callback );</script>

Connection Failed

<script src="^Extras(yui/build/yahoo-dom-event/yahoo-dom-event.js);"></script><script src="^Extras(yui/build/json/json-min.js);"></script><script src="^Extras(yui/build/connection/connection-min.js);"></script><script type="text/javascript">

var url = "/photo-stream.json";

var callback = {success : function (o) {

if ( YAHOO.lang.JSON.isValid( o.responseText ) ) {alert( url + " is valid JSON" );

}else {

alert( url + " is not valid JSON" );}

},failure : function (o) {

alert( url + " does not seem to exist: " + o.responseText );}

};

YAHOO.util.Connect.asyncRequest( "GET", url, callback );</script>

Do the test

YAY!

Why JSON?

More flexible than RSS or HTML

User only needs a static web page to get dynamic content

For the Ambitious

TrimPath JavaScript Template System

http://code.google.com/p/trimpath/wiki/JavaScriptTemplates

Given a template string and a JSON object

Returns HTML

Beyond JSON

Beyond JSON

Build a JavaScript slideshow based on the Folder of Images

Beyond JSON

Build a JavaScript slideshow based on the Folder of Images

Build a complete JavaScript search interface to a Thingy

Beyond JSON

Build a JavaScript slideshow based on the Folder of Images

Build a complete JavaScript search interface to a Thingy

Allow users to take their Gallery Albums and Photos to any site they want, in any form they want

RSS From EverythingSometimes one is better than many

RSS From Everything

RSS feed for multiple content types

Calendar, Collaboration, Gallery all in one feed

SQLReport to assemble the data

RSS From EverythingCreate the SQLReport

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Asset ID

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Title

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

URL

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Description

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Description for Post assets

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Description for Event assets

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Description for Gallery Album assets

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Description for other assets

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Asset table

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Join Asset Data

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Handle versioning

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Join other tables for individual asset information

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Left Join to include non-matching rows from asset

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Limit by state and lineage

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Limit to these asset types including sub-classes

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

For Event assets, get those occurring within 1 month

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Pass if not Event asset

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

OR Pass if starts within a month

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

For non-Event assets, get those added in the last

month

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

Pass if Event asset

SELECT asset.assetId AS assetId,assetData.title AS title,assetData.url AS url,IF ( Post.assetId IS NOT NULL,

Post.content,IF ( Event.assetId IS NOT NULL,

CONCAT_WS( " - ", Event.startDate, Event.startTime, Event.location, assetData.synopsis ),IF ( GalleryAlbum.assetId IS NOT NULL,

wobject.description,assetData.synopsis

) ) ) AS descriptionFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.assetId = asset.assetId AND ad.status = "approved"

)LEFT JOIN wobject

ON asset.assetId = wobject.assetId AND assetData.revisionDate = wobject.revisionDateLEFT JOIN Post

ON asset.assetId = Post.assetId AND assetData.revisionDate = Post.revisionDateLEFT JOIN Event

ON asset.assetId = Event.assetId AND assetData.revisionDate = Event.revisionDateLEFT JOIN GalleryAlbum

ON asset.assetId = GalleryAlbum.assetId AND assetData.revisionDate = GalleryAlbum.revisionDateWHERE

asset.state = "published"AND asset.lineage LIKE "000001%"AND (

Post.assetId IS NOT NULL OR Event.assetId IS NOT NULL OR GalleryAlbum.assetId IS NOT NULL

)AND (

Event.assetId IS NULL OR Event.startDate <= DATE_ADD( CURDATE(), INTERVAL 1 MONTH )

)AND (

Event.assetId IS NOT NULL OR FROM_UNIXTIME( asset.creationDate ) > DATE_SUB( CURDATE(), INTERVAL 1 MONTH )

)

OR Pass if asset created in the last month

SELECTassetData.url AS url,assetData.assetSize AS length,IF ( FileAsset.filename REGEXP 'jpe?g$',

"image/jpeg", "application/octet-stream"

) AS contentTypeFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.status = "approved" AND ad.assetId = assetData.assetId

)JOIN FileAsset

ON asset.assetId = FileAsset.assetIdAND assetData.revisionDate = FileAsset.revisionDate

WHEREasset.parentId = ?AND asset.state = "published"

SELECTassetData.url AS url,assetData.assetSize AS length,IF ( FileAsset.filename REGEXP 'jpe?g$',

"image/jpeg", "application/octet-stream"

) AS contentTypeFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.status = "approved" AND ad.assetId = assetData.assetId

)JOIN FileAsset

ON asset.assetId = FileAsset.assetIdAND assetData.revisionDate = FileAsset.revisionDate

WHEREasset.parentId = ?AND asset.state = "published"

Select URL and File size

SELECTassetData.url AS url,assetData.assetSize AS length,IF ( FileAsset.filename REGEXP 'jpe?g$',

"image/jpeg", "application/octet-stream"

) AS contentTypeFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.status = "approved" AND ad.assetId = assetData.assetId

)JOIN FileAsset

ON asset.assetId = FileAsset.assetIdAND assetData.revisionDate = FileAsset.revisionDate

WHEREasset.parentId = ?AND asset.state = "published"

Get a Content Type

SELECTassetData.url AS url,assetData.assetSize AS length,IF ( FileAsset.filename REGEXP 'jpe?g$',

"image/jpeg", "application/octet-stream"

) AS contentTypeFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.status = "approved" AND ad.assetId = assetData.assetId

)JOIN FileAsset

ON asset.assetId = FileAsset.assetIdAND assetData.revisionDate = FileAsset.revisionDate

WHEREasset.parentId = ?AND asset.state = "published"

JPEG Images

SELECTassetData.url AS url,assetData.assetSize AS length,IF ( FileAsset.filename REGEXP 'jpe?g$',

"image/jpeg", "application/octet-stream"

) AS contentTypeFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.status = "approved" AND ad.assetId = assetData.assetId

)JOIN FileAsset

ON asset.assetId = FileAsset.assetIdAND assetData.revisionDate = FileAsset.revisionDate

WHEREasset.parentId = ?AND asset.state = "published"

Sane default

SELECTassetData.url AS url,assetData.assetSize AS length,IF ( FileAsset.filename REGEXP 'jpe?g$',

"image/jpeg", "application/octet-stream"

) AS contentTypeFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.status = "approved" AND ad.assetId = assetData.assetId

)JOIN FileAsset

ON asset.assetId = FileAsset.assetIdAND assetData.revisionDate = FileAsset.revisionDate

WHEREasset.parentId = ?AND asset.state = "published"

Join tables and handle versioning

SELECTassetData.url AS url,assetData.assetSize AS length,IF ( FileAsset.filename REGEXP 'jpe?g$',

"image/jpeg", "application/octet-stream"

) AS contentTypeFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.status = "approved" AND ad.assetId = assetData.assetId

)JOIN FileAsset

ON asset.assetId = FileAsset.assetIdAND assetData.revisionDate = FileAsset.revisionDate

WHEREasset.parentId = ?AND asset.state = "published"

Normal join to only get File assets

SELECTassetData.url AS url,assetData.assetSize AS length,IF ( FileAsset.filename REGEXP 'jpe?g$',

"image/jpeg", "application/octet-stream"

) AS contentTypeFROM assetJOIN assetData

ON asset.assetId = assetData.assetId AND assetData.revisionDate = (

SELECT MAX( revisionDate ) FROM assetData ad WHERE ad.status = "approved" AND ad.assetId = assetData.assetId

)JOIN FileAsset

ON asset.assetId = FileAsset.assetIdAND assetData.revisionDate = FileAsset.revisionDate

WHEREasset.parentId = ?AND asset.state = "published"

Only published assets with the right parent

RSS From EverythingCreate the SQLReport

Make a new template for the SQLReport

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

Standard Beginning

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

Channel information

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

Items loop

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

Query 1 results loop

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

Title from Query 1

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

URL from Query 1

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

Description from Query 1

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

If Query 2 has a result(GalleryAlbum Files)

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

Query 2 loop

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

RSS Enclosure Tag

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

File URL

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

File Size

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

File Content Type

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

<channel> <title><tmpl_var title></title> <link>^u;</link> <description><![CDATA[<tmpl_var description>]]></description> <tmpl_loop rows_loop> <item> <title><tmpl_var row.field.title.value></title> <link>^u;^/(<tmpl_var row.field.url.value>);</link> <description><![CDATA[ <tmpl_var row.field.description.value> ]]></description> <tmpl_if hasNest> <tmpl_loop query2.rows_loop> <enclosure url="^u;^/(<tmpl_var query2.row.field.url.value>);" length="<tmpl_var query2.row.field.length.value>" type="<tmpl_var query2.row.field.contentType.value>" /> </tmpl_loop> </tmpl_if> </item> </tmpl_loop></channel>

</rss>

Standard Ending

RSS From EverythingCreate the SQLReport

Make a new template for the SQLReport

Create a Snippet with the right content type

RSS From EverythingCreate the SQLReport

Make a new template for the SQLReport

Create a Snippet with the right content type

Test the RSS feed

ReviewMaking a long speech longer

Review

Review

Existing Syndication Methods

Certain Assets

Widget

Ajax Inline View

Review

Review

RSS From Anything

RSS is just markup

Make a new template

Shortcut and override

AssetProxy into a Snippet

Review

Review

JSON From Anything

Flexible way to get dynamic content from static sites

Same process as RSS

Just a different template

Review

Review

RSS From Everything

Use a SQLReport to combine multiple asset types

Use sub-queries for attachments or enclosures

Just a different template

Questions?I won't blame you for being overwhelmed