My project didn't get updates for long time, and now it deserved award for its patience. Few days ago I released the global update that completely transforms app logic and structure.

My primary goal was to get rid of the confusing event format and present all events regardless their type in one logical view with unified editing interface. Furthermore, with the existing format was too problematic for work on new features and updates because of excessively complex architecture.

That's why I held up any work on new features until the project is recreated with the new approach. Finally, the new version is up and running.

Did you ever need to make few little CSS adjustments in MODx Evo manager area without editing of the core CSS files? Say, make introtext field in document form a bit higher? If so, then maybe this little solution will be helpful. It allows to apply CSS rules placed inside a chunk.

In this article I'd like to show you a simple way how to force browser cache for static resources like CSS and JavaScript files simultaneously with cache clearing from the Manager area in MODx Evolution.

You probably know that if you add a some parameter to a query string inside of HTML code, then the browser will update this file and ignore its cached version. For example:


Event Reminder is online service designed to send automatic email notifications about upcoming events such as birthdays, meetings, monthly payments - everything what you wouldn't like to forget. So, it allows to set up a reminder with few clicks and not afraid to miss important events anymore.

The service is created to be as simple as possible. It has following features:

  • Extremely easy registration process - you'll be asked only for email address and password.
  • Set up fixed date, annual, monthly, weekly, daily events as well as configure custom set of occurrence dates.
  • Clear and simple interface without bunch of advertising and excess stuff.
  • Try without signup.
  • It's completely free.

This little and useful service allows you to create safe message that will be self destruct right after accessing it. So, if you need safely send someone your secret information, then instead of passing it directly by email or skype, you may send only a link generated especially for your message. Being visited, the message is permanently deleted and the link is no valid anymore. For additional security, the service allows to specify a password.

This snippet allows you easily resize and crop JPG, GIF and PNG images using my ImageResize PHP class. In general, it is just a shell for that class, but its main feature is that all resized image copies are stored in cache and will not be recreated each time the snippet is called. In addition, if the original image is changed or replaced by another image with same file name, the snippet will detect it and recreate the cached copy.

This is a PHP class designed for making the commonly used image manipulations in your code to be extremely easy. The class helps to implement resize and crop operations and supports JPG, GIF and PNG formats with keeping of the transparency.

The features include:

  • Resizing with or without keeping of the original proportions;
  • Resizing based on only one known side (width, height, long or short sides);
  • Preventing the upscaling of the image;
  • Cropping the canvas;
  • Resizing to fit the canvas size;
  • Preserving transparency for GIF and PNG images;
  • Saving the result as JPG, GIF or PNG format.

There was one little thing in the CodeIgniter v2.1.3 built in Pagination library which made me a little confused. In short, the library renders the variable number of links if current page is one of the first or last ones. Let me illustrate it:

     1 2 3 next
prev 4 5 6 7 8 next
prev 7 8 9

The above example shows how the pagination links are rendered with 9 total pages in three cases: when current page number is somewhere in the beginning, in the middle, and in the end, with the parameter $config['num_links'] equal to 2.

On my MODx sites I often want to have ability of changing the document creation date ("createdon" property). Yes, I know I can do it with the standard DocManager module, but if it is your regulary performed action, it is more than not handy. I wanted the solution which would allow me to set the date like it would regular template variable, but when being saved, it would affected the actual createdon date stored in the documents table.

The reasons of changing the createdon date may be various. One of the sites I worked on was used this property for displaying articles in chronological order and often the date has been needed to adjust (to make the article date looks like it was published earlier). You may ask: why not just use standard template variable and sort the articles based on it? Well, there were few things.

Adding the "nofollow" attribute to some (or all) of external links is one of most commonly actions performed on websites. And all of us knows that when the count of links grows, it becomes not handy to track this process and do not miss few of them. Furthermore the site may have content added by users (comments, for example) where manual tracking becomes completely wasting of time.

To automate this process, we will write a plugin which will be adding rel="nofollow" attribute to all external links before output the page to a user. Moreover we will add the functionality to skip links to a domains which are included to white list.

If your website have download links for files and you have to specify the downloadable file sizes, then you definitely know, how inconvenient is to do it manually. Moreover, we need always remember to keep actual size when we're replacing some of our files with new version, and this additional work doesn't brings a lot of fun.

Let's optimize this process and write a snippet which will automatically output the size of any file placed on our server.

Sometimes we may need to display an age in years, passed from some date. For example, it can be a simple self-introducing line like "I am X years old" on a personal web page. Of course, it is not the best idea to update it manually each year. Fortunately, we should not.

In this article we will write a snippet which will calculate the age based on any initial date. All we need is just call it like here:

 I am [[Age? &year=`1990`]] years old