Website Development with CMS October CMS
October CMS is a PHP CMS based on Laravel, released in 2014. Version 3 is completely rewritten: modern Laravel 10+, Composer installation, Tailwind in the interface. Supports both classic PHP templates and headless mode via API.
When to Choose October CMS
October CMS is well suited when the team knows Laravel. Plugins are Laravel packages using Eloquent, Blade, Events. Built-in tools: Tailor (flexible content builder), Builder (plugin generation via UI), RainLab plugins (Blog, Users, Pages, Translate).
Architecture
october-project/
├── themes/
│ └── mytheme/
│ ├── theme.yaml
│ ├── layouts/
│ │ └── default.htm
│ ├── pages/
│ │ ├── index.htm
│ │ └── blog-post.htm
│ ├── partials/
│ │ ├── header.htm
│ │ └── footer.htm
│ └── assets/
├── plugins/
│ └── mycompany/
│ └── mysite/ # custom project plugin
├── config/
└── storage/
Page Structure (.htm file)
title = "Blog"
url = "/blog"
layout = "default"
is_hidden = 0
[blogPosts posts]
posts_per_page = 12
category_filter = ""
sort_order = "published_at desc"
==
{% put styles %}
<link rel="stylesheet" href="{{ ['~/assets/css/blog.css'] | theme }}">
{% endput %}
<div class="blog-listing">
{% for post in posts %}
{% partial "blog/post-card" post=post %}
{% endfor %}
{% if posts.lastPage > 1 %}
{% partial "pagination" items=posts %}
{% endif %}
</div>
Tailor: Flexible Content Without Plugins
Tailor (October 3+) is a built-in content modeling system, similar to ACF in WordPress:
# blueprints/blog.yaml
uuid: a6e3a3c4-9d1f-4a1e-b9d2-d7c8e8f1a2b3
handle: Blog\Post
type: entry
fields:
title:
label: Title
type: text
required: true
slug:
label: Slug
type: text
preset:
field: title
type: slug
content:
label: Content
type: richeditor
featured_image:
label: Featured Image
type: fileupload
mode: image
imageWidth: 1200
imageHeight: 630
category:
label: Category
type: entries
source: Blog\Category
maxItems: 1
published_at:
label: Publication Date
type: datepicker
mode: datetime
Components
Components are the main unit of logic in October CMS. They encapsulate data for the template:
// plugins/mycompany/mysite/components/LatestPosts.php
namespace MyCompany\MySite\Components;
use Cms\Classes\ComponentBase;
use MyCompany\MySite\Models\Post;
class LatestPosts extends ComponentBase
{
public function componentDetails(): array
{
return [
'name' => 'Latest Posts',
'description' => 'Displays the latest blog posts',
];
}
public function defineProperties(): array
{
return [
'limit' => [
'title' => 'Number of posts',
'type' => 'string',
'default' => '6',
'validationPattern' => '^[0-9]+$',
],
];
}
public function onRun(): void
{
$this->page['posts'] = Post::published()
->with('featured_image', 'categories')
->orderBy('published_at', 'desc')
->limit((int) $this->property('limit'))
->get();
}
}
Development Timeline
| Stage | Time |
|---|---|
| Installation + theme + basic pages | 1–2 days |
| Tailor blueprints (5–8 types) | 1–2 days |
| Components and logic | 2–4 days |
| Templates and layout | 3–7 days |
| Plugins (Blog, Users, SEO) | 1–2 days |
| Corporate website | 10–15 days |







