SimplePage

1. Артур (01.04.2017 / 21:16)
Делал проект для развлечения, но возможно кому то пригодиться, ибо очень прост в освоении, но при этом достаточно удобен и гибок.

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

Решение:
Немного инфы чтоб было понятнее:




Система представляет единственный файл следующего содержания:
<?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;
});

Далее я распишу возможности системы и процесс ее установки.

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

Структура проекта

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

Структура проекта

Откройте браузер и перейдите на ваш сайт: http://your-site.com - вы увидите вашу главную страницу.

2. Артур (01.04.2017 / 21:17)
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',
];

Структура проекта

После перезагрузки страницы в браузере вы увидите обновленный дизайн.

Добавлено через 00:42 сек.
Еще одна страница с ЧПУ
Предположим вам необходимо добавить на сайт страницу с описанием проекта, не нарушая принципов ЧПУ. Для этого создайте файл 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>

Теперь у вас появилась новая страница на сайте, перезагрузите браузер и перейдите на нее.

3. Артур (01.04.2017 / 21:19)
Установка 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>


4. Артур (01.04.2017 / 21:19)
Плагины
Система никак не ограничивает возможности языка. Чтобы это показать, давайте реализуем возможности блога с единственным автором на базе синтаксиса 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');
?>
# О проекте

Мой очень хороший проект

Добавлено через 02:26 сек.
Под лендинги и сайты, думаю, подойдет просто идеально, если нужно что то посложнее, можно использовать такую схему:

<?php
include('sp.php');

// Контроллер страницы
$db = $sp['database'];
$rows = $db->query(...);
?>
<!-- Шаблон -->
<ul>
  <?php foreach($rows as $row); ?>
    <li><?= $row['val'] ?></li>
  <?php endforeach; ?>
</ul>

Страницы получаются более структурированны (вверху контроллер, внизу шаблон) и крайне гибкими (можно сделать все, что позволяет PHP).

Добавлено через 00:51 сек.
Все описанное в данной теме прикрепляю в виде архива.

Может кому пригодиться ) Лицензировать не буду, делайте с кодом что хотите, считайте учебным проектом.

5. Don (01.04.2017 / 23:22)
Спасибо, у тебя как всегда все самое интересное +

6. Артур (04.05.2017 / 17:18)
О движке на хабре

7. Александр (04.05.2017 / 17:46)
Странно видеть в 2017 фреймворк в таком стиле, да еще и от Башки.

8. Avilon (04.05.2017 / 17:49)
Весьма интересно и познавательно. Возьму себе на заметку.

9. Артур (04.05.2017 / 17:52)
Муз-ТВ, я раньше тоже думал, что все должно быть строго "кошерно", но со временем все больше и больше понимаешь - задачи нужно решать так, чтобы и клиент оставался доволен, и самому руки марать не пришлось. Вот SimplePage примерно из то же оперы.

URL: https://visavi.net/topics/43525