Доброго времени суток дорогой читатель Блога 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" Если же не пуста, то просто вставляем ссылку записанную в БД.
Тут все до ужаса просто. Модуль на 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. Всем удачи, на сегодня у меня все!
Исходник |
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); выборка делается на УРА.
...
$row = mysql_fetch_array($result);
...
А после, к выборке добавляется еще и html код шаблона
...
$result .= $edd_tamp;
...
после чего естественно вылазит ошибка...
Есть вопрос - как добавить при такой схеме статью в другие категории. Ведь указать можно только один id меню. А можно ли указать два?
Функцию index_cat($cat) придется переделать таким образом, что бы она выводила из базы данных все записи, а после уже отсеивала те в которых колонка cat не содержать идентификатора просматриваемого каталога.
А можно ли например сделать так, чтобы у каждой категории был свой id (или название), который бы просто вписывался в cat через запятую или просто через пробел?
В одном из уроков я уже видел такое. Создается таблица категорий с полями в которые вписываются названия категорий. А потом эти названия заносятся в одно из полей статьи уже в другой таблице. Причем через пробел.
Я выбрал вот такой путь реализации категорий, я покажу как это работает, а уж Вы в свою очередь можете переделать алгоритм как Вам хочется, моя задача показать Вам работу простейшей cms, а что Вы будете делать с этими знаниями уже Ваше дело =)
if($_GET['cat'])$cat = $_GET['cat'];, т.е. если в массиве есть элемент cat, то присваеваем переменной его значение. А если нет этого элемента??? Что будет?
Всё заработало. Теперь только добавляю записи в БД.
Имеются 2 файла
1 Вывод категорий (меню)
Приветствую, спасибо за Ваш труд, статьи очень интересные.
Вот возник такой вопрос:
делаю вывод категорий но хочу чтоб у категорий еще выводилось сколько записей в ней.
как правильно реализовать? вод код но не работает(
По идеи, можно вместо такой записи:
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
Алексей, а Вы не планируете написать урок по классам ооп на примере работы с MSQL?
Сейчас пытаюсь развить тему создания интернет-магазина на другом самописном движке - RS-MINI. Он еще не дописан, но класс по работе с БД уже есть, так что если Вам интересно, можете его глянуть тут