Простой движок CMS на PHP

 

Видел множество статей в интернете, с названием "Простой движок" Да, соглашусь, он уж очень простой, по причине того что учат в нем выводить лишь мета теги и текст, собственно на этом все... Единственная идея которую получилось донести в этих статьях, это как привязать шаблон к php скрипту... Этого конечно вполне достаточно, чтоб развить идею и изобрести велосипед собственной сборки Но хотелось бы такую статью, которая описывала какой-нить простой скрипт, который выполнялся как "движок" Я тут кое что написал, и хотелось бы поделится...

 

 

Вообще мысля проста создать так сказать модуль для своей CMS который выводил бы предпросмотр новостей... По моему мнению, движок это простое отделение кода PHP от кода HTML Я возможно не правильно его называю, это не движок, если верить терминам то, то, что мы будем писать - это шаблонизатор. Вообщем то это совсем не важно, конечный продукт будет уметь выводить мини новости, и при этом мы сможем менять шаблон не трогая код. Мы не будем вытаскивать информацию из базы данных, просто напрямую впишем ее в переменную. Приступим...Создадим файл index.php в нем напишем такой код

<?
include("module/news.php");
$news = index_page();


include("templates/index.html");
?>

из него видно что мы подключаем два файла. Один из папки "module" т.е. модули, другой из папки "templates" т.е. шаблоны... Как вы поняли нам нужно написать сам модуль и шаблон... Но шаблонов мы будем писать два, один будет содержать разметку главной страницы, а другой будет содержать разметку самой мини новости. Начнем с мини новости, назовем файл news.html

<span>[title]</span>
<div style="border:1px solid #DCDCDC;width:550px;">
<p>[text]</p>
</div>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td>Автор: [author] | [date_b]</td></tr>
</table>
<br>

индексы [title], [text], [author], [date_b] заменятся на переменные в нашем модуле. Теперь напишем шаблон главной страницы, назовем его index.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Первый движок</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<body>
<?=$news?>
</body>
</html>

Обычная страница html только в ней присутствует php код <?=$news?> Тут будут выведены наши новости... Приступим к самому модулю, называем его news.php

<?
function index_page()
{
//Заполняем переменные с информацией
//В наших мининовостях будет виден текст, заголовок, дата и автор
$txt[0]="Печально когда при создание чего то ты забываешь про какие то мелочи...и для того что бы не переписывать все ты пытаешься измудриться так, чтобы вмешательство в код было минимальное..";
$txt[1]="Когда то такие попытки увенчаются успехом, а иногда бывает и так, собственными же руками уродуешь код =(";
$title[0]="Титл новости 1";
$title[1]="Титл новости 2";
$author[0]="Первый автор";
$author[1]="Второй автор";
$date_b[0]="12/10/11";
$date_b[1]="13/10/11";

$sm_read = file("templates/news.html");//Открываем шаблон
$sm_read = implode("",$sm_read);//Так как функция file() в результате дает нам массив, то склеиваем его
for($i=0;isset($txt[$i]);$i++)//Выводим цикл где меняем индексы на информацию из переменных
{
$edd_tamp = $sm_read;
$edd_tamp = str_replace("[text]",$txt[$i],$edd_tamp);
$edd_tamp = str_replace("[title]",$title[$i],$edd_tamp);
$edd_tamp = str_replace("[author]",$author[$i],$edd_tamp);
$edd_tamp = str_replace("[date_b]",$date_b[$i],$edd_tamp);

$news .= $edd_tamp;//Склеиваем все в одну переменную
}
return $news;//Выводим результат функции
}
?>

Собственно небольшой движок написан...Поместим файлы news.html и index.html в папку templates. Файл news.php в папку module, а файл index.php в корень сайта...

Это лишь простой пример реализации скрипта который может генерировать страничку "на лету". Более подробнее оп простом движке на php может почитать вот тут

 

Комментарии (20)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
pol, 02 Октября 2011 г. 22:54 пишет:
Читатель
Мне понравилось =))
Sergey, 17 Июня 2012 г. 07:50 пишет:
Гость
На странице index.html вы делаете так:
<body>
<?=$news?>
</body>

а в новостях вы делаете так:
<p>[text]</p>

мне кажется, что логичнее тогда везде делать одинаково, в тех же новостях делать так же как и на главной странице:
<span><?=$title[$i]?></span>
<div style="border:1px solid #DCDCDC;width:550px;">
<p><?=$txt[$i]?></p>
</div>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td><?=$author[$i]?> | <?=$date_b[$i]?></td></tr>
</table>
<br>

тогда ненужно будет задействовать функцию str_replace(), количество кода сократится на 5 строк да и быстродействие немного увеличится
Rio-Shaman, 17 Июня 2012 г. 14:37 пишет:
Автор
Я с самого начала именно так и собирался делать, вот только я что-то причину припомнить не могу почему отказался от данного способа.
Ответ для пользователя: Sergey
syler, 25 Октября 2012 г. 15:26 пишет:
Читатель
Все просто в главном шаблоне мы просто подставляем готовый исход работы скрипта, тем самым если бы в главном шаблоне использывали такую систему то пришлось бы не однократно прибегать к функции file ...., а так мы просто вызываем в самом низу главный шаблон с помощью инклуда и тем самым идет прямая замена переменных.... Извеняюсь за орфографию пишу с телефона :-)
NiunCMS, 20 Января 2013 г. 06:07 пишет:
Гость
Хочу реализовать мультиязычность в CMS
и вот ставлю например:
в index.php:
include("lang/$lang/blog.ini");
}
$txt = $my;
{
потом в файле
cms_core/setting/niuncms_setting.php
добавляю:
$lang = "ru";//Язык сайта
в языковом файле прописываю:
lang/ru/blog.ini
код:
<?php
$my = "Моя CMS";
?>
а в файлах проекта (html добавляю):
<?=$my?>

PS: что я не правильно сделал? или прописал
Rio-Shaman, 20 Января 2013 г. 16:01 пишет:
Автор
Не совсем понял вот эту запись:
include("lang/$lang/blog.ini");
}
$txt = $my;
{
include() это функция которая подключает файл, находящийся по указанному пути... у данной функции нет тела. И к тому же скобки тела указаны не в правильном порядке. Правильнее было бы написать вот так:
include("lang/$lang/blog.ini");
$txt = $my;
Если Вам нужно проверить существует ли файл по пути "lang/$lang/blog.ini" то используйте вот такую запись:
if (file_exists("lang/$lang/blog.ini"))
{
include("lang/$lang/blog.ini");
$txt = $my;
}
Ответ для пользователя: NiunCMS
NiunCMS, 21 Января 2013 г. 01:23 пишет:
Гость
Всё сделал) но изменил эту строку:
$txt = $my;
на
$txt .= $my;
как так он не отображал контент блога) но он выносит локализацию после контента:
http://cs406329.userapi.com/v406329786/6463/bODfuZ1d6JE.jpg
думаю вам тоже будет интересна локализация :)
Ответ для пользователя: Rio-Shaman
RAEman, 11 Мая 2013 г. 08:34 пишет:
Гость
А как сделать для твоей новостной странички вывод новостей по страницам?
Алексей, 11 Мая 2013 г. 13:32 пишет:
Автор
Я реализовал ее вот так:
http://rio-shaman.ru/razrabotka-cms/uluchshenija/postranichnaja-navigacija/
Но данный пример является частью цикла, и там описан индивидуальный подход, а не общий..

Я уже делился с читателем общим примером, вот комментарий
http://rio-shaman.ru/razrabotka-cms/uluchshenija/postranichnaja-navigacija/#comment_1106
в котором я оставил ссылку на закачку примера.
Ответ для пользователя: RAEman
Артем, 27 Июля 2013 г. 08:30 пишет:
Гость
Спасибо за статью, но видеокурс будет лучше:) Вот хочу посоветовать… http://awebart.ru/cms/
Павел, 12 Декабря 2013 г. 19:28 пишет:
Гость
Алексей,здраствуйте.Вы пишете:"так как функция file() в результате дает нам массив,то склейваем его."Функция implode() объединяет элементы массива в строку и возвращает строку,полученную объединением строковых представлений элементов массива.С помощью оператора echo $st_read; проверил и никакой склееной строки не обнаружил,а имела место таблица\рамка\ для мини новостей с реквизитами [title] и [text] и.т.д..
Алексей, 13 Декабря 2013 г. 10:20 пишет:
Автор
При выгрузки файла с помощью функции file() каждая строка в файле превращается в отдельный элемент массива. Для дальнейшей работы нам не нужен массив, нам нужна строковая переменная. Именно поэтому мы применяем функцию implode().
а имела место таблица рамка для мини новостей с реквизитами [title] и [text] и.т.д..
То что Вы наблюдали и есть результат склейки массива в строку.
Ответ для пользователя: Павел
Павел, 13 Декабря 2013 г. 20:48 пишет:
Гость
Я понял так,что при выгрузке файла с помощью функции file образуется массив,в котором есть элементы в строковом представлении и нестроковом представлении.Так вот,с помощью функции implode() мы получаем строку объединяющую только строковые представления из выгруженного файла.
Евгений, 21 Января 2014 г. 09:58 пишет:
Гость
Вы пишите в индексном файле:
include("module/news.php");
Это что получается, для каждой страницы нужно делать инклуд?
Алексей, 21 Января 2014 г. 11:26 пишет:
Автор
Да, для каждой странице нужен инклюд. Сделано это для того что бы у движка была одна точка входа. Без такого подхода, например, очень сложно (скорее всего даже не возможно) реализовать человеко-понятные урлы.
Ответ для пользователя: Евгений
php middle developer, 07 Августа 2014 г. 11:54 пишет:
Гость
Вот из-за таких статей и плодятся мегапрограммисты, которые делают сайты на собственных движках, которые потом никто поддерживать не хочет, если вы уже учите людей чему-то то учите сразу нормальному подходу, как вариант MVC
Старый Дед во 100 лет, 12 Августа 2014 г. 21:05 пишет:
Читатель
Алексей удалите комментарий этого умника - php middle developer
Он перепутал гнездо пауков - php.ru, с Вашим блогом
Ответ для пользователя: php middle developer
Саша, 02 Сентября 2014 г. 12:07 пишет:
Гость
А я согласен в php mid dev ))
Кирилл, 18 Октября 2014 г. 17:02 пишет:
Гость
Спасибо за материал. Собираюсь сделать простой сайт с несколькими основными страницами и блогом, при этом используя самописный движок (а не популярную CMS вроде вордпресса), который позже легко изменю или подточу под себя.
Игорь, 15 Мая 2016 г. 23:11 пишет:
Гость
Очень интересно написано, буду и дальше читать!