Пишем модуль Статьи для нашей CMS

 

Приветствую Вас на продолжение цикла статей "Разработка CMS блога" В этой статье мы будем писать модуль вывода статьи. Логика написания очень похожа на предыдущий наш модуль, можно даже сказать, что они идентичны, разница лишь в том, что этот модуль не будет выбирать из базы данных больше одной записи, а значит цикла do while{} в этом модуле не будет. Прежде чем мы приступим к написанию второго модуля, хочу Вас предупредить, что если Вы не читали предыдущих две статьи ( "Верстка нашего блога", "Пишем модуль 'Мини новости' для нашей CMS" ), то в этой Вам будет сложно понять содержания скриптов, так как я буду редактировать, уже ранние написанные файлы, которые Вы и в глаза то не видели

 

 

Так, что нам понадобится? Нам понадобится ранние написанный файл index.php, в него мы внесем некоторые исправления..Так же нам понадобится создать шаблон, он будет очень похож на шаблон мини новостей и собственно сам модуль. Модуль будет представлять собой функцию, в которую мы посылаем id нашей статьи, после чего текст из базы данных будет передаваться в шаблон, и все это выведется на экран пользователя...

Для начало подправим наш файл index.php Что собственно будем править? Все очень просто.. при запуске нашей главной страницы блога, по умолчанию срабатывает модуль news.php Мы пока что не ставили никаких условий препятствующие запуску этого модуля, именно поэтому он у нас запускается всегда, это то и будем исправлять. Если вспомнить, то ссылка на статью выглядит следующим образом "?blog=1", это означает что мы создаем глобальную переменную $_GET с идентификатором blog ($_GET['blog']) Вот вам и условие при котором не стоит подключать модуль news.php Вот как это выглядит в коде :

if($_GET['blog'])$blog = $_GET['blog'];//Определяем, есть ли глобальная переменная GET и если есть, то 
//переносим ее содержимое в переменную $blog

//МОДУЛЬ МИНИ НОВОСТЕЙ
if(!$blog)//Определяем, существует ли $blog, если НЕТ то подключаем модуль news.php
{
include("moduls/news.php");
$txt = index_page();//Выводим результат функции в переменную, которая отобразится на экране пользователя
//МОДУЛЬ МИНИ НОВОСТЕЙ
}

Далее мы приступим к созданию нашего нового модуля, и как обычно (я так делаю) начну с шаблона, вот код:

<div class="div_news">
<p class="title">[_title]</p>
<p>[_text]</p>
<p align="right"><a href="javascript:history.go(-1);">Назад</a></p>
</div>
<div class="div_footer">
Автор: [_author] | [_date_b]
</div>

Тут у нас те же самые код-слова которые в последствие заменятся на текст из базы данных. Я сохранил этот файл (text.html) в папке templates, куда собственно складываю все шаблоны.

Далее мы приступим к написанию самого модуля, вот код файла text.php

<?
function blog($blog)
{
$result_index = mysql_query("SELECT * FROM blog WHERE id = '$blog'");//Выводим из базы статью
$myrow_index = mysql_fetch_array($result_index);
if($myrow_index != "")//Проверяем есть ли в базе данных записи
{//Если есть...
$sm_read = file("templates/text.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его

$text = str_replace("[end]","",$myrow_index[text]);//Удаляем код-слово из текста
//(напоминаю, что этот [end] служит нам разделителем текста статьи, это нужно для вклеивания кнопки "Читать дальше")

//Замены идентификаторов на переменные из базы данных
$sm_read = str_replace("[_text]",$text,$sm_read);//Текст
$sm_read = str_replace("[_title]",$myrow_index[title],$sm_read);//Название статьи
$sm_read = str_replace("[_author]",$myrow_index[author],$sm_read);//Автор статьи
$sm_read = str_replace("[_date_b]",$myrow_index[date_b],$sm_read);//Дата размещения
}
else $sm_read = "<p align='center'>Нет записей в базе данных</p>";//Если записей нет, то вывести это сообщение
return $sm_read;//Выводим с генерированный html код
}
?>

Я сохранил этот файл в папку moduls

Осталось в файле index.php подключить этот модуль, и прописать условия его подключения. Условием будет присутствие переменной $blog, то есть если эта переменная объявлена, то вместо модуля news.php мы подключаем text.php. Вот как выглядит код:

//МОДУЛЬ CТАТЕЙ
if($blog)
{
include("moduls/text.php");
$txt = blog($blog);//Выводим результат функции в переменную, которая отобразится на экране пользователя
}
//МОДУЛЬ CТАТЕЙ

Этот кусок кода, как вы догадались вносится в файл index.php перед строкой

include("templates/index.html");

На этом собственно все, для теста заполните в базе данных таблицу blog, и увидите, что все прекрасно работает Если есть какие вопросы, пишите комментарии, постараюсь ответить. Удачи!

update: Если после запуска Вы наблюдаете не адекватную картину в виде каракозябр, или непонятных символов в верху ( типа вот таких - п»їп»ї ), то переходите вот к этому посту "Правильная кодировка у нашего движка". Эта проблема связана с кодировкой, так что ее, просто, необходимо сменить, и все =)


Исходник
 

Возможно Вам будут интересны следующие заметки

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

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Вы не подтвердили условия политики конфиденциальности.
Alex, 13 Марта 2012 г. 06:06 пишет:
Гость
Вот оно решение. Действительно сглупил пропустив этот пункт.
Хочу ещё поинтересоваться: каким образом можно сделать ограничение на количество символов в превью статей (news.php), т.е. чтобы оправдать наличие кнопки "Читать дальше"?
Rio-Shaman, 13 Марта 2012 г. 07:19 пишет:
Автор
В моей CMS анонс работает по принципу "Отмерил на глазок, воткнул код-слово [end]". Все, что до этого код-слова будет анонсом...
Ответ для пользователя: Alex
Alex, 13 Марта 2012 г. 07:46 пишет:
Гость
Спасибо Вам за предоставленные уроки, за Ваши ответы и терпение.
Ответ для пользователя: Rio-Shaman
Алексей, 24 Апреля 2012 г. 18:46 пишет:
Читатель
Друг, извиняюсь, но у меня не переходит на полную статью. Где может быть ошибка? Я что то сначала не замечал и дошел почти до конца админки, а сейчас решил попробовать и не робит
Алексей, 24 Апреля 2012 г. 18:52 пишет:
Читатель
Или далее будет перерабатываться все это?
Rio-Shaman, 24 Апреля 2012 г. 19:53 пишет:
Автор
Главная страница и страница с полной статьей очень похожи, их легко спутать, особенно если пост один, и состоит всего лишь из пару предложений.... Плюс к этому Вы могли не использовать код слово [end], в тексте статьи, из-за этого текст не делится на полную статью и анонс.

Очень сложно тут что-то испортить, поэтому я думаю, что Вы просто спутали, обратите внимание при переходе с главной странице по кнопке "Читать дальше" ссылка в адресной строке меняется? И меняется ли ссылка "Читать дальше" на "Назад"?

Если Вы все же что-то напутали при сборке, то я теряюсь в догадках где.....
Ответ для пользователя: Алексей
Алексей, 24 Апреля 2012 г. 20:14 пишет:
Читатель
В редакторе из админки вставил енд, но не переходит. Ссылка не меняется. Сегодня вечером посижу, глядишь и найду)
Алексей, 24 Апреля 2012 г. 20:20 пишет:
Читатель
Прошу прощения. Не углядел малость самую. Исправил, все работает) Не буду больше в 6 утра писать сайт ))
Алексей, 24 Июня 2012 г. 22:56 пишет:
Читатель
Rio-Shaman, не подскажешь как решить проблему с кодировкой? Знаю что в уроках чуть ранее ты писал что все скрипты должны быть в win-1251, но как быть если нужно все сделать в utf-8?
Проблема в том что я сохранил все файлы в utf-8, в базе данных в phpadmin у всех таблиц стоит сопоставление utf-8 general ci b у самой базы тоже. После добавления текста на русском в базу при просмотре через phpadmin отображается все нормально, но страницах сайта вместо русских символов отображаются вопросительные знаки(??????? ??? ??????)
Может кто подскажет как решить эту проблему? Пытался задать нужную кодировку через файл .htaccess, но создание этого файла в корневом каталоге (даже если он просто пустой) приводит к 500-й ошибке!
Rio-Shaman, 25 Июня 2012 г. 00:12 пишет:
Автор
Я думаю Вам поможет вот такая строчка сразу после подключения к базе данных:
mysql_query("SET NAMES 'utf8'");
Ответ для пользователя: Алексей
Юрий, 08 Сентября 2012 г. 22:39 пишет:
Читатель
Не могу кое-что понять ... вы пишите "Условием будет присутствие переменной $blog, то есть если эта переменная объявлена, то вместо модуля news.php мы подключаем text.php. Вот как выглядит код:" , код у меня в точь как у вас, но у меня на главной странице подключается материалы из базы для news.php ... а как мне вынести материалы теперь из text.php? И можно ли эти материалы выносить на другой странице?
Rio-Shaman, 12 Сентября 2012 г. 09:33 пишет:
Автор
Я не совсем понимаю вопрос.. Как можно вывести материал из text.php? В данном файле нет никаких материалов.
Файл news.php позволяет вывести из базы данных несколько анонсов заметок (анонсы это все то что переде словом [end]). Файл text.php выводит полный текст (то есть все что перед [end] и после него) лишь одной заметки.
Ответ для пользователя: Юрий
FALCON, 30 Октября 2012 г. 23:56 пишет:
Гость
Кароче, если ты записываешь данные со страницы в базу, то используй :
mysql_query("SET NAMES utf8");
А если ты выводишь данные из базы на страницу (то что ты и делаешь), то используй:
mysql_query("SET character_set_results=utf8").
Попробуй, должно помочь.
Ответ для пользователя: Алексей
Рядовой, 04 Апреля 2013 г. 19:40 пишет:
Гость
А я правильно понимаю, адресная строка поста будет иметь приблизительно такой вид: blog.ru/index.php?blog=13/ ?
Если да, то как сделать, чтобы она выглядела, к примеру, так: http://rio-shaman.ru/mysli/itog-2012--plany-na-2013/ ?
Где почитать, в каком направлении копать?
Алексей, 04 Апреля 2013 г. 20:13 пишет:
Автор
В цикле статей есть заметки по реализации ЧПУ. Если интересно, то вам сюда:
http://rio-shaman.ru/razrabotka-cms/uluchshenija/teorija-realizacii-chpu/
Ответ для пользователя: Рядовой
Богдан, 19 Сентября 2013 г. 21:23 пишет:
Гость
при включенных ошибках на денвере выводит кучу таких сообщений Notice: Use of undefined constant
это можно как-то исправить? или данное сообщение скорее не ошибка, а просто денвер делится информацией, типо смотри какой я крутой?)
Алексей, 19 Сентября 2013 г. 23:57 пишет:
Автор
Нет... Просто при написание движка я допускал некие ошибки в синтаксисе... Например нельзя было писать вот так:
$cat = $myrow_index[cat];
Нужно было писать вот так:
$cat = $myrow_index['cat'];
В первом примере я опустил кавычки, а для php это ошибка уровня Notice...
Ну при опубликования материалов на данном блоге я не раз говорил, что в программирование я новичок, и учился писать что-то сложнее калькулятора вместе с читателями...
Ответ для пользователя: Богдан
dlegame, 14 Декабря 2013 г. 19:39 пишет:
Читатель
Ув.Алексей! доброго вам времени суток!
я начал полностью переписывать работу концепции форка который реализовал на RSblog и вот
там реализовал модульность по своему и вот изо этого у меня почему то не работает ЧПУ и когда пытаюсь зайди в статью то он мне показывает белую страницу...понять в чем проблема немогу...посмотрите вот: Открыть
и скажите пожалуйста в чем может быть проблема.
Заранее благодарю вас =)
Алексей, 15 Декабря 2013 г. 23:00 пишет:
Автор
У Вас переменная $chpu_links, которая берет свое значение из элемента chpu_links массива $_GET не может быть определена, так как в файле .htaccess нет алгоритма получения этой переменой
Скорее всего проблема именно в этом
Ответ для пользователя: dlegame
Евгений, 03 Августа 2014 г. 06:15 пишет:
Читатель
Вопрос, а как же объеденить все это в 1 файл? Т.е. сразу

<?
function index_page(){
....
}
function news($news_full){
...
}
?>