Минимум: CMS

3.4K
.
Задача:
Простая и расширяемая система управления контентом, без ограничений на язык.

Решение:
Немного инфы чтоб было понятнее:
В систему изначально включено: layout, обработка ошибок, менеджер плагинов
Система использует возможности веб-сервера для роутинга запросов
Система работает на голом PHP и если немного подправить, то практически любой версии

Система представляет единственный файл следующего содержания:
<?php
// Шаблонизатор
function template($path, array $assign = []){
  extract($assign);
  ob_start();
  include($path);

  return ob_get_clean();
}

// Загрузка контейнера
$sp = isset($sp)? $sp : [];
if(is_readable(__DIR__ . '/config.php')){
  $sp = array_merge(include(__DIR__ . '/config.php'), $sp);
}

// Загрузка плагинов
if(isset($sp['plugins'])){
  foreach($sp['plugins'] as $plugin){
    include($plugin);
  }
}

ob_start();
register_shutdown_function(function() use($sp){
  $content = ob_get_contents();
  ob_end_clean();

  // Обработка ошибок
  $error = error_get_last();
  if(is_array($error) && isset($sp['error'])){
    return call_user_func($sp['error'], $error, $content, $sp);
  }

  // Рендеринг страницы
  if(isset($sp['render'])){
    $content = call_user_func($sp['render'], $content, $sp);
  }

  // Подключение layout
  if(isset($sp['layout'])){
    $content = template($sp['layout'], [
      'title' => isset($sp['title'])? $sp['title'] : 'SimplePage',
      'content' => $content,
    ]);
  }

  echo $content;
});


Далее я распишу возможности системы и процесс ее установки.
.
Установка
Система работает на любом веб-сервере, поддерживающим PHP. Для установки необходимо переместить код системы в файл sp.php корня сайта. На этом все, система готова к работе. Правда она пока ничего не умеет.

Структура проекта (+/-)


Hello world
Создайте файл index.php в корне сайта со следующим содержанием:
<?php include('sp.php') ?>
<h1>Hello world</h1>
<p>Моя главная страница<p>


Структура проекта (+/-)


Откройте браузер и перейдите на ваш сайт: http://your-site.com - вы увидите вашу главную страницу.
.
Layout
Подключим css к вашему сайта. Создайте файл css/style.css в корне вашего проекта и добавьте в него следующий стиль:

h1 {
  color: silver;
}


Создайте файл _layout/default.html следующего содержания:

<!DOCTYPE html>
<html>
	<head>
		<title><?= $title ?></title>
		<meta charset="utf-8" />
		<link href="/css/style.css" rel="stylesheet">
	</head>
	<body>
		<?= $content ?>
	</body>
</html>


Это будет обертка для страниц вашего сайта.

Теперь необходимо указать системе использовать эту обертку. Для этого создайте файл config.php со следующим содержимым:

<?php
return [
  'layout' => '_layout/default.html',
];


Структура проекта (+/-)


После перезагрузки страницы в браузере вы увидите обновленный дизайн.
.
Delphinum
Еще одна страница с ЧПУ
Предположим вам необходимо добавить на сайт страницу с описанием проекта, не нарушая принципов ЧПУ. Для этого создайте файл about/index.php следующего содержания:

<?php include('../sp.php') ?>
<h1>О проекте</h1>
<p>Мой очень хороший проект</p>


Структура проекта (+/-)


Добавьте на главной странице сайта (index.php) ссылку на эту страницу:
<?php include('sp.php') ?>
<h1>Hello world</h1>
<p>
  Моя главная страница <a href="/about">проекта</a>
<p>


Теперь у вас появилась новая страница на сайте, перезагрузите браузер и перейдите на нее.
.
Установка Title страницам
Контейнер (конфигурация) системы может быть дополнена на уровне любой станицы. Мы используем это правило для установки Title страницам сайта. Для начала добавим глобальное значение title всем страницам. Для этого поменяем файл config.php следующим образом:

<?php
return [
  'layout' => '_layout/default.html',
  'title' => 'Мой сайт',
];


Если вы перезагрузите страницу сайта то увидите, что Title изменился. Теперь необходимо задать новый Title странице /about, для этого изменим ее следующим образом:

<?php
$sp = ['title' => 'О проекте'];
include('../sp.php');
?>
<h1>О проекте</h1>
<p>Мой очень хороший проект</p>


После перехода на страницу /about вы увидите, что ее Title кастомизировался.

Совет: если вам нужно изменить Title всем страницам в каталоге, добавьте в этот каталог файл sp.php следующего содержания:

<?php
$sp = ['title' => 'Заголовок для всех страниц каталога'];
include('../sp.php');


После чего вы можете подключать этот файл к страницам каталога вместо корневого файла sp.php:

<?php include('sp.php') ?>
<h1>О проекте</h1>
<p>Мой очень хороший проект</p>
.
Плагины
Система никак не ограничивает возможности языка. Чтобы это показать, давайте реализуем возможности блога с единственным автором на базе синтаксиса Markdown. В первую очередь подключим механизм рендеринга этого языка. Я рекомендую для загрузки внешних зависимостей использовать Composer. Создайте файл composer.json в корне проекта:

{
  "name": "MyProject",
  "type": "project",
  "require": {
    "michelf/php-markdown": "*"
  }
}


Выполните команду в консоли (если у вас установлен composer):

composer install


После создайте ваш плагин _plugins/mk.php:

<?php
function markdown($content){
  return Michelf\Markdown::defaultTransform($content);
}


Структура проекта (+/-)


Теперь необходимо подключить плагин к проекту. Для этого измените config.php:

<?php
return [
  'plugins' => [
    'vendor/autoload.php', // Для загрузки зависимостей
    '_plugins/mk.php',       // Для загрузки плагина
  ],
  'layout' => '_layout/default.html',
  'title' => 'Мой сайт',
];


Плагин подключен, теперь можно использовать его на всех страницах проекта, но мы изменим с его помощью только страницу "О проекте", для этого отредактируем about/index.php:

<?php
$sp = ['render' => 'markdown', 'title' => 'О проекте'];
include('../sp.php');
?>
# О проекте

Мой очень хороший проект
.
Все описанное в данной теме прикрепляю в виде архива.
Прикрепленные файлы:
.
¯\_(ツ)_/¯
Это ядро?
.
PaRtiZzaN, ну как бы ) По сути это оформленный аналог старых пыховских сайтов, где вся логика писалась прям на странице, но с небольшими доработками.
.
╭∩╮ (`-`) ╭∩╮
Это хорошо, когда мы избавляемся от всей лишней "шелухи".
И попытка создать что-то серьезное, но в стиле минимализма - похвальна..

Да, разумеется надо отдавать себе отчет, что в реальном (а особенно универсальном) проекте такого минимализма не получится, придется лепить обвес из различных свистелок-перделок и нужных функций.
Но вот если по быстрому надо слепить на заказ сайт-визитку, может очень пригодиться.
Всего: 119