Связываем меню и вывод мини новостей

 

Доброго времени суток дорогой читатель Блога RS! Прежде чем мы продолжим писать админку для cms, нам необходимо подумать о такой вещи как категории. Ведь если припомнить, наш блог не умеет выводить список мини новостей какой нить категории. Причем тут меню и мини новости? И для чего их связывать? Ссылка на категорию будет отображаться в меню, стало быть наше меню имеет прямое воздействие на категорию. Давайте вспомним как реализуется вывод мини новостей. Там мы просто вытаскивали 10 последних новостей из базы данных, и выводили их. Для категории же необходимо будет выводить только определенные записи.

 

 

Теория

 

Давайте немного поразмышляем. Откуда нам знать какие мини новости выводить на экран? Все довольно просто. В базе данных, у таблицы меню есть id. Его мы будем переносить в таблицу blog. Тем самым мы свяжем таблицу menu и таблицу blog.

rs_gallery['37']

Сейчас все делается в ручную, но это пока... В следующих постах мы научим админку реализовывать все эти изменения.

 

Редактируем таблицу

 

Для начала нам необходимо добавить новый столбец в таблице blog. Приступим..

Заходим в структуры нашей таблицы blog

внизу выбираем "после date_b" и жмем "ОК"

Называем колонку - cat, ставим тип int выставляем значение 10 и жмем "сохранить"

Вручную добавьте новый пункт меню и пост. Прописав в колонку cat, у таблицы blog, id нового пункта меню. В посте "Работа с базой данных в php" я рассказывал как вставлять в БД записи.

rs_gallery['38']

 

Редактируем модуль "Меню"

 

Вспоминайте как работает модуль меню.

Задача такая: Необходимо сделать так, что бы, если в таблице меню не заполнить колонку href то ссылка генерировалась автоматически. Так мы будем делать ссылки на категорию. Вот код:

<?
function menu()
{
$result_index = mysql_query("SELECT * FROM menu");//Выводим из базы данных все пункты меню
$myrow_index = mysql_fetch_array($result_index);
if($myrow_index != "")//Проверяем есть ли в базе данных записи
{//Если есть...
$sm_read = file("templates/menu.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
preg_match("/\[_divmenu\](.*?)\[_divmenu\]/s",$sm_read,$div_menu);//Вырезаем из шаблона ту
//часть, которая будет повторяться, то есть блок
//<div class="div_menu"><a class="menu_link" href="[_href]">[_link]</a></div>
do//Цикл do while
{
$edd_tamp = $div_menu[1];//Так как на придется править шаблон,
//то лучше его сохранить в отдельную переменную, иначе нам придется
//пользоваться функцией file() чаще чем 1 раз, а это нагрузка на сервер

//Замены идентификаторов на переменные из базы данных
if($myrow_index[href] == "")$href = "/index.php?cat=".$myrow_index[id];
else $href = $myrow_index[href];

$edd_tamp = str_replace("[_href]",$href,$edd_tamp);//Ссылка
$edd_tamp = str_replace("[_link]",$myrow_index[name],$edd_tamp);//Текст ссылки

$menu .= $edd_tamp;// Склеиваем весь с генерированный код в одну переменную
}
while($myrow_index = mysql_fetch_array($result_index));
$menu = preg_replace("/\[_divmenu\].*?\[_divmenu\]/s",$menu,$sm_read);//Вместо [_divmenu]...[_divmenu]
//вклеиваем наш сгенерированный код из $menu
}
else $menu = "";//Если записей нет, то вывести это сообщение
return $menu;//Выводим с генерированный html код
}
?>

Я добавил две новые строчки:

if($myrow_index[href] == "")$href = "index.php?cat=".$myrow_index[id];
else $href = $myrow_index[href];

И отредактировал одну уже написанную:

$edd_tamp = str_replace("[_href]",$href,$edd_tamp);//Ссылка

Теперь, нашь код проверит, пуста ли колонка в таблице... Если пустая то делаем из нее ссылку типа "index.php?cat=N" Если же не пуста, то просто вставляем ссылку записанную в БД.

 

Пишем модуль "Категории" - cat.php

 

Тут все до ужаса просто. Модуль на 99% схож с модулем мини новостей.

<?
function index_cat($cat)
{
$result_index = mysql_query("SELECT * FROM blog WHERE cat='$cat' ORDER BY id DESC");//Выводим из базы данных все записи где колонка cat равна переменной $cat
$myrow_index = mysql_fetch_array($result_index);
if($myrow_index != "")//Проверяем есть ли в базе данных записи
{//Если есть...
$sm_read = file("templates/news.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
do//Цикл do while
{
$edd_tamp = $sm_read;//Так как на придется править шаблон,
//то лучше его сохранить в отдельную переменную, иначе нам придется
//пользоваться функцией file() чаще чем 1 раз, а это нагрузка на сервер
$text = explode("[end]",$myrow_index[text]);//идентификатор в тексте показывающий,
//что после него следует вывести кнопку "читать дальше"

//Замены идентификаторов на переменные из базы данных
$edd_tamp = str_replace("[_text]",$text[0],$edd_tamp);//Текст
$edd_tamp = str_replace("[_title]",$myrow_index[title],$edd_tamp);//Название статьи
$edd_tamp = str_replace("[_id]",$myrow_index[id],$edd_tamp);//id статьи, для вывода в полной статьи
$edd_tamp = str_replace("[_author]",$myrow_index[author],$edd_tamp);//Автор статьи
$edd_tamp = str_replace("[_date_b]",$myrow_index[date_b],$edd_tamp);//Дата размещения

$result .= $edd_tamp;// Склеиваем весь с генерированный код в одну переменную
}
while($myrow_index = mysql_fetch_array($result_index));
}
else $result = "<p align='center'>Нет записей в базе данных</p>";//Если записей нет, то вывести это сообщение
return $result;//Выводим с генерированный html код
}
?>

Разница лишь в некоторых переменных, которые я просто переименовал, и вывода записей из базы данных...

 

Подключаем модуль

 

Открываем файл index.php и добавляем вот эту строчку:

if($_GET['cat'])$cat = $_GET['cat'];

Сразу после вот этой строчки:

if($_GET['contact'])$contact = $_GET['contact'];

Далее нам необходимо прописать вот этот кусочек кода:

//МОДУЛЬ КАТЕГОРИЙ
if($cat)
{
include("moduls/cat.php");
$txt = index_cat($cat);
}
//МОДУЛЬ КАТЕГОРИЙ

Сразу после модуля мини новстей

 

Заключение

 

Писал все на скорую руку... сегодня как бы необходимо пост разместить, а у меня времени очень мало Если есть какие вопросы то задавайте, если что-то не работает, то тоже задавайте вопросы, буду свободен отвечу обязательно! Так же хочу заметить, что если Вы читатете блог в первые, то Вы не разберетесь в написанном. Этот пост продолжение цикла статей о разработки cms. Всем удачи, на сегодня у меня все!

Исходник
 

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

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
Вы не подтвердили условия политики конфиденциальности.
Илья, 12 Февраля 2012 г. 18:21 пишет:
Читатель
Ситуация весьма и нтересная...выскакивает ошибка:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /usr/home/hosting/wt1000862/htdocs/moduls/cat.php on line 19

При этом там, где контент в самом вверху надпись Resource id #9


При этом код следующий(вырезал то что посчитал ненужным):

<?
function index_cat($cat) {
$sql = "SELECT * FROM blog WHERE cat='$cat' ORDER BY id DESC";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
if($row != "") {
$sm_read = file("templates/news_p.html");
$sm_read = implode("",$sm_read);

do {
$edd_tamp = $sm_read;
$edd_tamp = str_replace("[_text_p]",$row[text_p],$edd_tamp);//Текст
$edd_tamp = str_replace("[_title]",$row[title],$edd_tamp);//Название статьи
$edd_tamp = str_replace("[_author]",$row[author],$edd_tamp);//Автор статьи
$edd_tamp = str_replace("[_date_b]",$row[date_b],$edd_tamp);//Дата размещения

$result .= $edd_tamp;
}
while($row = mysql_fetch_array($result));
}
else $result = "<p align='center'>Нет записей в базе данных</p>"; //Если записей нет, то вывести это сообщение
return $result; //Выводим с генерированный html код
}
?>

Информацию все при этом выводит всю как надо, но эта ошибка...явно что-то не то. И явно она связана с циклом do-while, потому что на первом $row = mysql_fetch_array($result); выборка делается на УРА.
Rio-Shaman, 12 Февраля 2012 г. 18:39 пишет:
Автор
У Вас переменная result сначала содержит результат выборки

...
$row = mysql_fetch_array($result);
...

А после, к выборке добавляется еще и html код шаблона

...
$result .= $edd_tamp;
...

после чего естественно вылазит ошибка...
Ответ для пользователя: Илья
Илья, 12 Февраля 2012 г. 19:45 пишет:
Читатель
Благодарю за ответ! Действительно, недоглядел...надо на сегодня завязывать, а то пойдут еще более глупые вопросы :)
Ответ для пользователя: Rio-Shaman
Прохор, 09 Марта 2012 г. 22:37 пишет:
Гость
Приветствую, Алексей!

Есть вопрос - как добавить при такой схеме статью в другие категории. Ведь указать можно только один id меню. А можно ли указать два?
Rio-Shaman, 10 Марта 2012 г. 02:25 пишет:
Автор
Здравствуйте! Пока нет. Все тонкости сразу реализовать и предусмотреть невозможно. Если развить Вашу идею, то можно переписать алгоритм таким образом, что бы он мог помещать записи в несколько каталогах одновременно. То есть изменить тип поля cat ( у таблицы blog ) на varchar и заносить в это поле несколько значений id через какой нить разделитель ( например "|" )

Функцию index_cat($cat) придется переделать таким образом, что бы она выводила из базы данных все записи, а после уже отсеивала те в которых колонка cat не содержать идентификатора просматриваемого каталога.
Ответ для пользователя: Прохор
Прохор, 10 Марта 2012 г. 14:48 пишет:
Гость
В целом понятно. Попробую поковырять.

А можно ли например сделать так, чтобы у каждой категории был свой id (или название), который бы просто вписывался в cat через запятую или просто через пробел?

В одном из уроков я уже видел такое. Создается таблица категорий с полями в которые вписываются названия категорий. А потом эти названия заносятся в одно из полей статьи уже в другой таблице. Причем через пробел.
Ответ для пользователя: Rio-Shaman
Rio-Shaman, 10 Марта 2012 г. 20:48 пишет:
Автор
Можно все что угодно =) Программирование это как содержать личный архив. Вы сами в праве решать где хранить данные, какого цвета будут папочки, на каких полках буду лежать эти папочки, где именно пользователи буду читать эти папочки, в каком виде, как будут доставаться эти папочки персоналом. Вы решаете абсолютно все!

Я выбрал вот такой путь реализации категорий, я покажу как это работает, а уж Вы в свою очередь можете переделать алгоритм как Вам хочется, моя задача показать Вам работу простейшей cms, а что Вы будете делать с этими знаниями уже Ваше дело =)
Ответ для пользователя: Прохор
Никита, 29 Июня 2012 г. 19:38 пишет:
Гость
Здравствуйте. Пишите очень хорошие статьи, делаю по ним курсовую) Хотел спросить у вас совет, как добавить страницу "Обо мне"? А именно, как реализовать подключение модуля и шаблона, и привязать их к пункту меню. Заранее спасибо за ответ
Rio-Shaman, 30 Июня 2012 г. 02:50 пишет:
Автор
А Вы админ панель уже писали?
Ответ для пользователя: Никита
Никита, 30 Июня 2012 г. 06:14 пишет:
Гость
Писал, но там урезанный функционал, я оставил только возможность добавлять статьи, редактировать их, и удалять комментарии)
Rio-Shaman, 30 Июня 2012 г. 16:35 пишет:
Автор
Для того чтобы у движка была возможность создавать страницы, необходимо в админ панели создать модуль меню. Он позволит создавать пункты с прямой ссылкой. Т.е. Вы можете создать пост, назвать его "Обо мне", а в меню создать пункт с прямой ссылкой на этот пост.
Ответ для пользователя: Никита
Alex, 21 Сентября 2012 г. 19:15 пишет:
Гость
Доброго времени суток. Вот Вы пишете
if($_GET['cat'])$cat = $_GET['cat'];, т.е. если в массиве есть элемент cat, то присваеваем переменной его значение. А если нет этого элемента??? Что будет?
Rio-Shaman, 21 Сентября 2012 г. 19:48 пишет:
Автор
Переменная не создастся, а стало быть модуль категории не запустится...
Ответ для пользователя: Alex
Александр Коршак, 04 Ноября 2012 г. 20:09 пишет:
Гость
Благодарю за статью!
Всё заработало. Теперь только добавляю записи в БД.
FIN, 16 Июня 2013 г. 10:27 пишет:
Читатель
Минут 15 пытался догнать, почему ничего не работает. Потом понял, что все работает, только с ног на голову. Названия категорий берутся из пунктов меню. Не лучше было бы, если меню брало названия из категорий. Соответственно при указании ссылки в пункте меню, это никак не отражалась бы на категориях.
Mama, 18 Мая 2014 г. 19:43 пишет:
Гость
Не могу связать категории и статьи
Имеются 2 файла
1 Вывод категорий (меню)
<?
include('bd_conn.php');
if($_GET['cat'])$cat = $_GET['cat'];
$query = "SELECT * FROM menu";
 $res=mysql_query($query);
 echo'<div id="left_bar">
		<div class="catgr">
		<br>
		<h3 style=color:red>Список категорий</h3>
			<ul>';
for($i=0;$i<mysql_num_rows($res);$i++){
$rows=mysql_fetch_array($res);

 printf('<a href=m.php?cat="'.$rows['id'].'">%s</a><br/>',$rows['name']);

 }
 if($cat){
 include('m1.php');
 }

?>
2 Статей
<?

 if(isset($_GET['cat']))
{
	$query="SELECT * FROM blog WHERE cat='".$cat."' ORDER BY id DESC";
	$res=mysql_query($query);

	
	echo'<div id="contnt">';
	echo'Atikls';
	//$rows=array();
	for($i=0;$i<mysql_num_rows($res);$i++){
	$rows=mysql_fetch_array($res);

	printf("<p><hr/>%s</p>
		<p><a href='index.php?cat=%s'>%s</p>
		<p>%s</p>",
		$rows['text'],$rows[0],$rows['title'],$rows['author'],$rows['date_b']);
		echo "<a href='index.php?categ=".$rows['categ']."'>".$rows['title']."'| читать далее...'</a><br>";
	}
	}
	
	

	echo'</div>';
?>
Mama, 18 Мая 2014 г. 19:46 пишет:
Гость
Буду признателен за помощь
Ответ для пользователя: Mama
Алексей, 19 Мая 2014 г. 10:33 пишет:
Автор
У статей колонка cat совпадает с колонкой ID у категорий?
Ответ для пользователя: Mama
Mama, 20 Мая 2014 г. 22:22 пишет:
Гость
да
Максим, 19 Января 2016 г. 18:27 пишет:
Гость

Приветствую, спасибо за Ваш труд, статьи очень интересные.

Вот возник такой вопрос:

делаю вывод категорий но хочу чтоб у категорий еще выводилось сколько записей в ней.

как правильно реализовать? вод код но не работает(

<?php
/*

*/
function menu_cat() {
	global $mysqli;
    $query = mysqli_query($mysqli, "SELECT * FROM `cb_cat` ORDER BY `id`");
  	$row = mysqli_fetch_array($query, MYSQLI_ASSOC);
	if($row != "")
	{
		$read = file("theme/menu_cat.html");
		$read = implode("",$read);
		do {
			$read_string = $read;
			$cat_id = $row[id];
			$read_string = str_replace("[_id_]",   $row[id],$read_string);
			$read_string = str_replace("[_name_]", $row[name],$read_string);
			$query_1 = mysqli_query($mysqli, "SELECT * FROM `cb_book` WHERE cat_id='$cat_id'");
			if ($query_1 != "" or $query_1 != 0) {
  	        $row_num = mysqli_num_rows($query_1);
			$read_string = str_replace("[_number_]", $row_num,$read_string);
			}
			else $read_string = str_replace("[_number_]", "0",$read_string);
			$menu .= $read_string;
		}
		while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC));
	}
	else $menu = "";
	return $menu;
	mysqli_free_result($query);
    mysqli_close($mysqli); 
}
?>
Алексей, 20 Января 2016 г. 17:36 пишет:
Автор
Доброго времени суток.
По идеи, можно вместо такой записи:
$query_1 = mysqli_query($mysqli, "SELECT * FROM `cb_book` WHERE cat_id='$cat_id'");
if ($query_1 != "" or $query_1 != 0) {
    $row_num     = mysqli_num_rows($query_1);
    $read_string = str_replace("[_number_]", $row_num, $read_string);
}
else
    $read_string = str_replace("[_number_]", "0", $read_string);
написать вот так:
$query_1     = mysqli_query($mysqli, "SELECT * FROM `cb_book` WHERE cat_id='$cat_id'");
$row_num     = mysqli_num_rows($query_1);
$read_string = str_replace("[_number_]", $row_num, $read_string);
так как функция mysqli_num_rows вернет ноль, если SELECT запрос вытащил ноль строк.
Ответ для пользователя: Максим
Максим, 20 Января 2016 г. 22:54 пишет:
Гость
Так не работает, я пробовал.

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /home/users/6/6521314/domains/chessbooks.ru/engine/menu_cat.php on line 21
20 $query_1     = mysqli_query($mysqli, "SELECT * FROM `cb_book` WHERE cat_id='$cat_id'");
21 $row_num     = mysqli_num_rows($query_1);
22 $read_string = str_replace("[_number_]", $row_num, $read_string);
Ответ для пользователя: Алексей
Алексей, 21 Января 2016 г. 01:27 пишет:
Автор
попробуйте написать вот так
$query_1     = mysqli_query($mysqli, "SELECT * FROM `cb_book` WHERE cat_id='$cat_id'");

echo mysqli_error($mysqli);
die();

$row_num     = mysqli_num_rows($query_1);
$read_string = str_replace("[_number_]", $row_num, $read_string);
скорее всего Вы на экране увидите текст с ошибкой. по ней можно понять что не так
Ответ для пользователя: Максим
Максим, 21 Января 2016 г. 11:11 пишет:
Гость
Алексей, спасибо, разобрался. Элементарная невнимательность(
$query_1     = mysqli_query($mysqli, "SELECT * FROM `cb_book` WHERE cat_id='$cat_id'");
ошибка в `cb_book`
$query_1     = mysqli_query($mysqli, "SELECT * FROM `cb_books` WHERE cat_id='$cat_id'");
p.s.
Алексей, а Вы не планируете написать урок по классам ооп на примере работы с MSQL?
Ответ для пользователя: Алексей
Алексей, 22 Января 2016 г. 10:13 пишет:
Автор
Алексей, а Вы не планируете написать урок по классам ооп на примере работы с MSQL?
не совсем понял, что Вы имеете ввиду. Хотите, что бы я написал урок по созданию класса который помог бы работать с mysql?
Ответ для пользователя: Максим
Максим, 22 Января 2016 г. 11:44 пишет:
Гость
Да, урок именно по созданию класса для работы с MSQL и примеры как его использовать в модулях. Думаю такой урок в разделе перед созданием движка будет многим интересен и полезен.
Ответ для пользователя: Алексей
Алексей, 22 Января 2016 г. 11:50 пишет:
Автор
Дело в том, что я сейчас не занимаюсь поддержкой и развития системы RS-BLOG (тот самый движок на котором я собирал блог в статьях). Код этого движка, мягко говоря, очень плох. Зеленый был, много чего не знал =).
Сейчас пытаюсь развить тему создания интернет-магазина на другом самописном движке - RS-MINI. Он еще не дописан, но класс по работе с БД уже есть, так что если Вам интересно, можете его глянуть тут
Ответ для пользователя: Максим
Евгений, 05 Ноября 2016 г. 11:36 пишет:
Гость
Предыдущее мое сообщение удалите: разобрался - не та база данных была подключена. Извините, пожалуйста за беспокойство. Все работает замечательно. Спасибо за разработку!