Thomas, sorry to see that you're having some trouble getting started with MODX. I can assure you that MODX isn't just for the experienced developers. In fact, MODX is designer-friendly. If you can build an HTML/CSS website, you surely can use MODX! Unlike many other Content Management Systems, MODX never dictates how to write your HTML or even name your files. That decision is yours to make.
What's a Template?
Let's consider this
scaled-down blog post example from Bootstrap:
// Static HTML Template
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="The official example template of creating a blog with Bootstrap.">
<meta name="author" content="">
<title>Blog Template for Bootstrap</title>
<!-- Bootstrap core CSS -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
<link href="http://getbootstrap.com/examples/blog/blog.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="blog-masthead">
<div class="container">
<nav class="blog-nav">
<a class="blog-nav-item active" href="#">Home</a>
<a class="blog-nav-item" href="#">New features</a>
<a class="blog-nav-item" href="#">Press</a>
<a class="blog-nav-item" href="#">New hires</a>
<a class="blog-nav-item" href="#">About</a>
</nav>
</div>
</div>
<div class="container">
<div class="blog-header">
<h1 class="blog-title">The Bootstrap Blog</h1>
<p class="lead blog-description">The official example template of creating a blog with Bootstrap.</p>
</div>
<div class="row">
<div class="col-sm-8 blog-main">
<div class="blog-post">
<h2 class="blog-post-title">Sample blog post</h2>
<p class="blog-post-meta">January 1, 2014 by <a href="#">Mark</a></p>
<p>This blog post shows a few different types of content that's supported and styled with Bootstrap. Basic typography, images, and code are all supported.</p>
<hr>
<p>Cum sociis natoque penatibus et magnis <a href="#">dis parturient montes</a>, nascetur ridiculus mus. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Sed posuere consectetur est at lobortis. Cras mattis consectetur purus sit amet fermentum.</p>
<blockquote>
<p>Curabitur blandit tempus porttitor. <strong>Nullam quis risus eget urna mollis</strong> ornare vel eu leo. Nullam id dolor id nibh ultricies vehicula ut id elit.</p>
</blockquote>
<p>Etiam porta <em>sem malesuada magna</em> mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.</p>
<h2>Heading</h2>
<p>Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros.</p>
<h3>Sub-heading</h3>
<p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</p>
<pre><code>Example code block</code></pre>
<p>Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa.</p>
<h3>Sub-heading</h3>
<p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean lacinia bibendum nulla sed consectetur. Etiam porta sem malesuada magna mollis euismod. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
<ul>
<li>Praesent commodo cursus magna, vel scelerisque nisl consectetur et.</li>
<li>Donec id elit non mi porta gravida at eget metus.</li>
<li>Nulla vitae elit libero, a pharetra augue.</li>
</ul>
<p>Donec ullamcorper nulla non metus auctor fringilla. Nulla vitae elit libero, a pharetra augue.</p>
<ol>
<li>Vestibulum id ligula porta felis euismod semper.</li>
<li>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</li>
<li>Maecenas sed diam eget risus varius blandit sit amet non magna.</li>
</ol>
<p>Cras mattis consectetur purus sit amet fermentum. Sed posuere consectetur est at lobortis.</p>
</div><!-- /.blog-post -->
</div><!-- /.blog-main -->
<div class="col-sm-3 col-sm-offset-1 blog-sidebar">
<div class="sidebar-module sidebar-module-inset">
<h4>About</h4>
<p>Etiam porta <em>sem malesuada magna</em> mollis euismod. Cras mattis consectetur purus sit amet fermentum. Aenean lacinia bibendum nulla sed consectetur.</p>
</div>
<div class="sidebar-module">
<h4>Archives</h4>
<ol class="list-unstyled">
<li><a href="#">March 2014</a></li>
<li><a href="#">February 2014</a></li>
<li><a href="#">January 2014</a></li>
<li><a href="#">December 2013</a></li>
<li><a href="#">November 2013</a></li>
<li><a href="#">October 2013</a></li>
<li><a href="#">September 2013</a></li>
<li><a href="#">August 2013</a></li>
<li><a href="#">July 2013</a></li>
<li><a href="#">June 2013</a></li>
<li><a href="#">May 2013</a></li>
<li><a href="#">April 2013</a></li>
</ol>
</div>
<div class="sidebar-module">
<h4>Elsewhere</h4>
<ol class="list-unstyled">
<li><a href="#">GitHub</a></li>
<li><a href="#">Twitter</a></li>
<li><a href="#">Facebook</a></li>
</ol>
</div>
</div><!-- /.blog-sidebar -->
</div><!-- /.row -->
</div><!-- /.container -->
<footer class="blog-footer">
<p>Blog template built for <a href="http://getbootstrap.com">Bootstrap</a> by <a href="https://twitter.com/mdo">@mdo</a>.</p>
<p>
<a href="#">Back to top</a>
</p>
</footer>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</body>
</html>
The HTML markup above is what you'd put in your MODX
Template.
Chunks and
Template Variables help you organize your
Template. Typically
Chunks are used for the parts of your
Template that are common to all pages that use it.
Template Variables, are basically custom fields. You'd use them to store data that doesn't structurely belong in regular resource fields.
Now let's see how easy it is to turn our Bootstrap blog post template into a MODX template:
// Dynamic MODX Template
<!DOCTYPE html>
<html lang="en">
<head>
[[$PageHead]]
</head>
<body>
[[$PageNavigation]]
<div class="container">
<div class="blog-header">
<h1 class="blog-title">[[*pagetitle]]</h1>
<p class="lead blog-description">[[*description]]</p>
</div>
<div class="row">
<div class="col-sm-8 blog-main">
<img src="[[*FeaturedImage]]" width="640" class="img-responsive" alt="[[*FeaturedImageCaption]]">
<hr>
<div class="blog-post">
<h2 class="blog-post-title">[[*longtitle]]</h2>
<p class="blog-post-meta">[[*publishedon:strtotime:date=`%B %e, %Y`]] by <a href="[[~10]]">[[*createdby:userinfo=`firstname`]]</a></p>
[[*content]]
</div><!-- /.blog-post -->
</div><!-- /.blog-main -->
<div class="col-sm-3 col-sm-offset-1 blog-sidebar">
[[$BlogDescription]]
[[$BlogArchives]]
[[$Blogroll]]
</div><!-- /.blog-sidebar -->
</div><!-- /.row -->
</div><!-- /.container -->
[[$Footer]]
[[$PageScripts]]
</body>
</html>
Voilà!
We went from a static HTML template to a dynamic template without breaking a sweat. We didn't use any Snippets (PHP), hacks or plugins. Just our HTML, using
MODX tags.
Let's dissect our MODX template:
[[$PageHead]] => This is the chunk that contains the page's metadata. In it, you'll find this:
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
<meta name="description" content="The official example template of creating a blog with Bootstrap.">
<meta name="author" content="">
<title>[[*pagetitle]]</title>
<!-- Bootstrap core CSS -->
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">
<link href="http://getbootstrap.com/examples/blog/blog.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
Looks familiar? It surely does.
[[*pagetitle]] => is the page/post title, which will be replaced by
Blog Template for Bootstrap
[[$PageNavigation]] => This chunk contains the main navigation block. In it, you'll find this:
<div class="blog-masthead">
<div class="container">
<nav class="blog-nav">
<a class="blog-nav-item active" href="[[~1]]">Home</a>
<a class="blog-nav-item" href="[[~2]]">New features</a>
<a class="blog-nav-item" href="[[~3]]">Press</a>
<a class="blog-nav-item" href="[[~4]]">New hires</a>
<a class="blog-nav-item" href="[[5]]">About</a>
</nav>
</div>
</div>
Typically, you'd use an extra like
Wayfinder to generate dynamic navigational menus, but like I said earlier, MODX is very flexible. What you choose to use (or not) is up to you. Soon enough you'll appreciate the power of
extras.
[[~2]] => This is a MODX
link tag (as seen in the navigation chunk above). The number between the brackets is the id of the page (resource) you're linking to.
[[*FeaturedImage]] => is a
Template Variable. So is this:
[[*FeaturedImageCaption]]. In the example above, it allows us to assign a Featured Image as well as a caption to each blog post.
<img src="[[*FeaturedImage]]" width="640" class="img-responsive" alt="[[*FeaturedImageCaption]]">
[[*content]] => is the post content (body text).
I'll stop here as I'm sure the picture is clearer by now. This was a very basic example to show how easy it is to build a template in MODX. There are obviously more efficient (and better) ways of doing certain things, but that's beyond the scope of this post.
Check out MODX's
Quick-Start Video Series to get the full picture.
[ed. note: treigh last edited this post 10 years, 9 months ago.]