Latest Posts

Archives [+]

Entries filed under 'cms'

    Posted by Michael Marth MAR 25, 2011

    Posted in cms Comments 2

    There is a mini meme in CMS-land that says "CMSs don't need wokflow engines because most publishing workflows are 4-eyes" (see Janus Boye's and Deane Barker's posts). I believe that the underlying assumption of this claim is that the term "workflow"

    • denotes steps performed by humans and
    • applies mainly to publishing.

    In my opinion this definition is too narrow - a workflow should be considered a series of steps performed either by a human or automatically. Here are some actual use cases of CQ's workflow engine that I have seen. Some involved manual steps, whereas others did not:

    • e-mail notifications to authors when articles get published
    • automated spam check for incoming reader comments
    • automated Twitter posts when a blog post when online
    • thumbnail generation of imported images

    Therefore, I prefer to think of CMS-workflow engines as content automation engines.

    One important aspect of that is the "automation" can also imply manual steps - so simply the ability to run some code inside of the context of the CMS is not enough for a workflow engine. In real-world scenrios you additionally need a user interface for manual steps.

    Posted by Ben Peter JAN 28, 2011

    Posted in ajax, cms, development and performance Comment 1

    This post is cross-posted here.

    In your typical CMS setup, most of the content is actively managed as such. But you often come across scenarios where other data needs to appear on a page, e.g. prices or product data that are provided by external sources and change on their own schedule.

    There are various way to handle such a requirement, each with its own upsides and downsides.

    One obvious way would be to access the data from within the CMS domain, i.e. build a component that reaches out to the data source and renders the appropriate data accordingly. It’s straightforward to implement, the only variation being the complexity of data access (which is involved anyways).
    The one issue with this approach is that it will leave your page uncacheable to make sure that the data is always up to date. Every request to the page needs to hit the Publisher so that the component can reach out to the data source and pull the most recent data. Caching that page on a Dispatcher or CDN level is out of the question.

    If you want a page that doesn’t hit the Publisher and can be cached by the Dispatcher and on the CDN, you can take a slightly different approach: build a component that in edit mode will allow you to pull updated data from the data source, and store it as part of the page’s content. In publish mode the data will be rendered just as the rest of the page’s content.
    The issue with data updates is not eliminated, but it’s now pushed to the authoring side. On the publisher, the page is fully cacheable, but you need to make sure that whenever the data changes, the page is activated. That can happen automatically, if you have technical ways to be notified of data changes, or can be organizational (read: phone call). Altough technically often not a problem, the automated update often is impossible because the involved pages contain other content that may or may not be ready for activation and still need to be checked by a human. Or they are simply part of a review and approval workflow that is not certain to complete within the time that the data is allowed to be out of date on the public-facing systems.
    From an implementation perspective, this option is slightly more complex than the previous option.

    If there is a need to update the data in the page in a fully automated fashion, there are more options available that merge content and data not at the time the page is baked, but on the webserver or in the browser.

    Bringing data and content together in the browser is easily done through AJAX requests, as long as you can expose the data source in a way that will give you the right data per page as e.g. JSON. For both performance and information control reasons, you want to put a layer on top of the data source that will not simply spit out all of the data, but just the data that are required for that particular page.
    This approach works well, is very simple to implement, and matches the second approach in terms of cacheability: the page can be cached at all levels. A request for the page can be offloaded at a CDN layer and from the Dispatcher cache. Only an activation of the page due to content changes will require these layers to be purged or invalidated. The delivery layer on top of the data source can follow its own caching strategy.
    The approach may be inappropriate if the display of data must not be deferred until the request for the data is complete, or if it must not depend on Javascript being available. While today such restrictions are typically not considered important from a user experience point of view, legal requirements can often enforce that a page be either displayed completely with accurate information and independent of Javascript, or not at all.

    That leads to the fourth option that’s available which allows for good cacheability, data accuracy and user agent compatibility. Instead of aggregating in the browser, the aggregation is performed on the webserver.
    For that, a layer is built on top of the data source that renders HTML fragments that go into the page. The respective CQ component does nothing but render an appropriate SSI statement that fetches the HTML fragment from the data rendering layer and plugs it into the page. As typically SSI does not allow you to include remote sources, a reverse proxy is required to make the data available as a local path if the data source is not deployed within the same virtual host.
    That leaves the page cacheable on the publisher: the page including the SSI statement is pulled from the dispatcher cache, SSI statements are evaluated, and the page is then returned to the requesting layer – either the CDN, a proxy, or a browser. It can however not be cached at a CDN level, as for data consistency the webserver needs to re-perform the SSI on each request.
    In terms of implementation this option is pretty simple, but you want to make sure you have someone handy who knows your webserver well.

    For completeness’ sake, there’s an option that has similar characteristics as the first option in terms of cacheability and process interdependencies but is slightly more complex to implement. If you can afford to hit the Publisher on each request and your data source has a hierarchical structure, you can choose to make it visible to Sling as resources within the repository. This is typically only worth the effort if that data is used in many different scenarios and if it is semantically part of your content, but not managed as such because it comes from an established source that is outside of the system’s domain.

    Which of these options is appropriate is up to the concrete situation. None of them can be generally ruled out or recommended, although it may be considered bad manners to introduce interdependencies between content publication and data update processes, which the first two and the fifth option do.

    file

    Posted by Michael Marth JUN 10, 2010

    Posted in cms, everything is content and modelling Add comment

    Last week I have uploaded a Twitter clone application to Day's Package Share. The application's content package not only contains some sample content and the jsp files with the application code. It also includes sample users and their respective access rights on different JCR nodes. Putting all this information in one content package is possible (and even simple) because users, ACLs etc are stored in the content repository as JCR nodes.

    The experience of putting together this package nicely reminded me of the power of the concept of storing all of a a web application's artefacts in the content repository - which can be considered the technical implementation of Day's mantra "everything is content".

    Classically, the image of web content management systems one has in mind looks something like this:

    file

    Content is the input and a web page is the end result of some rendering process. There is nothing wrong with that image, but considering "everything is content" an alternative prototypical image of a CMS came to my mind:

    file

    A web content management system's repository is the place to store and manage all aspects that make up your web site. The web page is not only the end result, but also the source.

    Posted by Michael Marth MAR 12, 2010

    Posted in cms Comments 6

    When you look at the technology options one has for a CMS authoring interface there are two big camps: the web UI and the fat client (be it a Java client, .net or similar). The relative pros and cons of these two technology choices are usually described along these lines

    • web clients are easy to deploy whereas fat clients are not
    • on the other hand, fat clients provide a richer user experience and better usability overall.

    Consequently, fat clients are often suggested as the preferable solution for so-called power users whereas web clients are supposed to be the right thing for occasional CMS users.

    Well, these considerations have been around in the CMS community for about 10 years and I have not seen a lot of discussion about them. But I think they are not true anymore. The world has moved on and browser-based user interfaces have not only caught up with fat clients in terms of usability - I think they are even about to provide a better user experience.

    This is part of a very large trend in the computer industry: applications that were once desktop-based move into the browser with the primary examples being GMail or Google Docs. This trend has been facilitated by vast increases in browser performance and better widget libraries like JQuery or Ext. These improvements have made it technically possible to implement user interfaces that are as rich as desktop applications.  Drag-and-drop, tree widgets, responsiveness of the UI - most of what was once thought to be the desktop app's advantage now also exists in the browser.

    However, there is more to this trend: I, for example, have grown completely accustomed to having all my productivity apps within the browser. And because I spend most of my time within the browser it is the browser's infrastructure that defines "convenient" for me, be it password management, download- and upload-behaviour, the browser extensions I have come to rely upon or simply the fact the the browser is always running anyway.

    In my case the increasing tendency to use browser-based apps rather than desktop-based ones even goes out to the choice of my IDE for component development (arguably the most power-user-y thing to do). Day offers the Eclipse-based CRXDE as well as the browser-based CRXDELite and I find myself starting to the latter more and more often - because it is often simply more convenient.

    So, coming back to CMS authoring interfaces: In my opinion the fat client's deployment hassles are not compensated by usability anymore. Maybe, it is time for the CMS community to revisit this topic.

    Posted by David Nuescheler DEC 02, 2009

    Posted in cms and cq5 Comment 1

    Here is a short presentation with my personal top ten features in our upcoming release. Of course, this would ideally be accompanied by short fast paced demos, so if you are interested in getting personalized demo or a video, please reach out to us.