ByteBard How to Sort Sections and Posts

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

Prologue

Lightweight CMS owns builtin algorithms to sort sections and posts. They should be feasible for general conditions. Nevertheless, you may need your own algorithms for sorting of sections and posts. This article illustrates to write your own sorting algorithms.

How PHP Sorts Stuffs

usort delegates its sorting algorithm to a callable (callback) fulfilling such interface:

callback(mixed $a, mixed $b): int

By this way, users of usort function can sort stuffs by their needs without reinventing sorting algorithms.

Lightweight CMS call usort internally to sort sections and posts. By modifying sorting callables used by the software, our users can write their sorting routines without altering other Lightweight CMS code.

Sort Posts

Common Properties used for Sorting Posts

Here we list common properties of posts used for sorting:

  • title: title of a post
  • author: author of a post
  • ctime (not implemented): created time of a post
  • mtime: last modified time of a post
  • weight: a user-defined value for sorting

Sample Code

Here we show builtin sorting routine used by Lightweight CMS to sort posts:

# Callback to sort posts.
define("SORT_POST_CALLBACK", "sort-post-callback");
$GLOBALS[SORT_POST_CALLBACK] = function ($a, $b) {
    # Sort two posts by their weights.
    if (array_key_exists(LIGHTWEIGHT_CMS_POST_WEIGHT, $a)
        && array_key_exists(LIGHTWEIGHT_CMS_POST_WEIGHT, $b))
    {
        $wa = $a[LIGHTWEIGHT_CMS_POST_WEIGHT];
        $wb = $b[LIGHTWEIGHT_CMS_POST_WEIGHT];

        if ($wa < $wb) {
            return -1;
        }
        else if ($wa == $wb) {
            return 0;
        }
        else {
            return 1;
        }
    }

    # Sort two posts by their modified time.
    #  Your should always set a mtime in metadata
    #  region of posts.
    if (array_key_exists(LIGHTWEIGHT_CMS_POST_MTIME, $a)
        && array_key_exists(LIGHTWEIGHT_CMS_POST_MTIME, $b))
    {
        $ma = $a[LIGHTWEIGHT_CMS_POST_MTIME];
        $mb = $b[LIGHTWEIGHT_CMS_POST_MTIME];

        if ($ma < $mb) {
            return -1;
        }
        else if ($ma == $mb) {
            return 0;
        }
        else {
            return 1;
        }
    }

    # Sort two posts by their titles.
    if (array_key_exists(LIGHTWEIGHT_CMS_POST_TITLE, $a)
        && array_key_exists(LIGHTWEIGHT_CMS_POST_TITLE, $b))
    {
        $ta = $a[LIGHTWEIGHT_CMS_POST_TITLE];
        $tb = $b[LIGHTWEIGHT_CMS_POST_TITLE];

        return strcasecmp($ta, $tb);
    }

    # They are equal, which is seldom the case.
    return 0;
};

Sort Sections

Common Properties used for Sorting Sections

Here we list common properties of sections for sorting:

  • title: title of a section
  • ctime (not implemented): created time of a section
  • mtime: last modifiled time of a section
  • weight: a user-defined value for sorting

Sections in Lightweight CMS are merely intermediaries to posts. Authors of sections don't make much sense mostly.

Sample Code

Here we show builtin sorting routine used by Lightweight CMS to sort sections:

# Callback to sort sections.
define("SORT_SECTION_CALLBACK", "sort-section-callback");
$GLOBALS[SORT_SECTION_CALLBACK] = function ($a, $b) {
    # Sort two sections by their weights.
    if (array_key_exists(LIGHTWEIGHT_CMS_SECTION_WEIGHT, $a)
        && array_key_exists(LIGHTWEIGHT_CMS_SECTION_WEIGHT, $b))
    {
        $wa = $a[LIGHTWEIGHT_CMS_SECTION_WEIGHT];
        $wb = $b[LIGHTWEIGHT_CMS_SECTION_WEIGHT];

        if ($wa < $wb) {
            return -1;
        }
        else if ($wa == $wb) {
            return 0;
        }
        else {
            return 1;
        }
    }

    # Sort two sections by their titles.
    if (array_key_exists(LIGHTWEIGHT_CMS_SECTION_TITLE, $a)
        && array_key_exists(LIGHTWEIGHT_CMS_SECTION_TITLE, $b))
    {
        $ta = $a[LIGHTWEIGHT_CMS_SECTION_TITLE];
        $tb = $b[LIGHTWEIGHT_CMS_SECTION_TITLE];

        return strcasecmp($ta, $tb);
    }

    # They are equal, which is seldom the case.
    return 0;
};