[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Написание CMS урок второй.
seva0812
боковое меню со списком категорий, сортировка статей по категориям;
соответственно, работа с категориями в админ-панели;
постраничная навигация;
мелкие изменения в шаблоне, CSS, структуре таблиц БД.


Часть I. Структура таблиц.

Таблицы теперь создает скрипт install.php, на этом функции инсталлятора пока закончены. Структура информации в базе данных представлена двумя таблицами:

te_article – вся информация о статьях. Дата добавления, id категории, к которой статья относится, текст, meta-теги и пр.
te_categories – категории, их имена, id, счетчик статей в этой категории.

Category_id в таблицах категорий так же как и id в таблице статей имеет флаги AUTO_INCREMENT и PRIMARY KEY. Уникальные идентификаторы нам нужны для сортировки.

Часть II. Админ-панель.

Admin.php
<?php
//функция обновления счетчика статей в выбранной категории
function update_cat_count ($category)
{
$sql_count_result = mysql_query("SELECT * FROM te_article WHERE category_id='".$_REQUEST['my_category_id']."'");
$rec_count = mysql_num_rows($sql_count_result);//количество статей данной категории
$rec_count = $rec_count +1;//Прибавляем 1 к текущему значению
$sql_2 = mysql_query("UPDATE te_categories SET cat_count='".$rec_count."' WHERE category_id='".$category."'") or die(mysql_error());
}
?>
<html>
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=win-1251" />
<
title>Tractor Engine: Администрирование</title>
</
head>

<?
include ('config.php');
include ('lib.php');

if (isset($_REQUEST['sub'])) //Если нажата кнопка (name="sub")
{
//Если заполнено поле с названием, создаем новую категорию
if ($_REQUEST['my_cat_name'] !== "")
{
$sql2 = mysql_query("INSERT into te_categories (name, cat_count)
values ('"
.$_REQUEST['my_cat_name']."', 1);");
$sql_count = mysql_query("SELECT * FROM te_categories WHERE name='".$_REQUEST['my_cat_name']."'");
$rec_count = mysql_fetch_assoc($sql_count);
//т.к. категория не выбрана, выбираем только что созданную
$_REQUEST['my_category_id'] = $rec_count['category_id'];
}
else update_cat_count ($_REQUEST['my_category_id']);//Обновляем счетчик статей в указанной категории

//Новая статья

$artcl_date = date("d.m.Y H:i");
$new_artcl=mysql_query("INSERT into te_article (title, category_id, description, content, meta_key_words, meta_description, date)
values ('"
.$_REQUEST['my_title']."', '".$_REQUEST['my_category_id']."', '".$_REQUEST['my_description']."', '".$_REQUEST['my_text']."',
'"
.$_REQUEST['my_meta_key_words']."', '".$_REQUEST['my_meta_description']."', '".$artcl_date."');");

}
//Формируем список категорий
$cat = get_cat_list (); //Функция объявлена в lib.php

?>
<body>
<
form action="admin.php" method="post">
<
p>Заголовок: <input name="my_title" type="text" size="60" /></p><p>
Поместить в: <SELECT NAME="my_category_id">
<?php
foreach ($cat as $category){
print '<OPTION VALUE='.$category['category_id'].'>';echo $category['name'];
}
?>
</SELECT>
Новая категория: <input name="my_cat_name" type="text" size="25" />
</
p>
<
p>Описание:<br><textarea name="my_description" cols="80" rows="4" ></textarea></p>
<
p>Основной текст:<br><textarea name="my_text" cols="80" rows="12" ></textarea></p>

<
p>Key words: <input name="my_meta_key_words" type="text" size="40" /></p>
<
p>Description: <input name="my_meta_description" type="text" size="40" /></p>
<
input name="sub" type="submit" value="Отправить" />
</
form>
</
body>
</
html>


Обратите внимание, обновление счетчика статей мы выделили в отдельную функцию update_cat_count, позже она нам наверняка где-нибудь еще пригодится, когда таких функций накопится достаточное количество, вынесем в отдельную библиотеку.

lib.php
<?php
//Список категорий
function get_cat_list () {
$sql_cat_list = mysql_query("SELECT * FROM te_categories ORDER BY category_id");
for ($cat_list=array(); $row=mysql_fetch_assoc($sql_cat_list); $cat_list[]=$row);
$cat_list = array_reverse ($cat_list); //переворачиваем массив
return $cat_list;
}

//Категории в норм виде (возвращает массив или печатает)
function get_categories ($cat_list, $print="noprint") {
foreach ($cat_list as $cat)
{
$categories [$cat['category_id']]['name'] = $cat['name'];
$categories [$cat['category_id']]['cat_count'] = $cat['cat_count'];
if ($print !== "noprint") echo '<li class="list"><a href="?page=article&category_id='.$cat['category_id'].'">'.$cat['name'].'</a> <small>('.$cat['cat_count'].')</small></li>';
}
if ($print == "noprint") return $categories;
}
?>


Зачем вначале мы получили список категорий $cat_list, а затем зачем-то преобразовали в $categories в цикле foreach? Просто для удобства и красоты мы из списка массивов (записей или строк), полученных из БД, сделали двумерный массив с первичным ключом category_id (ведь он у нас уникален). Для наглядности распечатайте оба этих массива, и сразу увидите разницу:


echo "<pre>";
print_r ($cat_list);
echo "<br>";
print_r ($categories);
echo "</pre>";


Часть III. Шаблон вывода.

В index.php подключаем page.php – единственный обязательный файл шаблона, который, в свою очередь, подключает любые другие части темы. Шаблон использует компоненты (программную часть) выбранной пользователем страницы, соответственно до шаблона нужно выбрать подключаемую страницу (напомню, типы страниц у нас лежат в каталоге inc).

Подробное рассмотрение шаблона вывода я оставлю на следующей теме, потому как меня пугает тот объем информации, который мне придется на вас вывалить за раз.

исходники завтра выложу P.S влом заливать на серв)))



Спустя 15 минут, 42 секунды (30.05.2011 - 01:49) inpost написал(а):
То, что я пишу - ты типо игнорируешь?

Спустя 1 минута, 28 секунд (30.05.2011 - 01:50) seva0812 написал(а):
inpostнет
блин ну мне что выложить готовый исходник и спросить у вас таких знающих что дальше делать ну или вы посмотрели бы на мои ошибки!раз так то уж

Спустя 1 минута, 14 секунд (30.05.2011 - 01:51) inpost написал(а):
seva0812
Исправляй по ходу дела, зачем продолжать писать неправильно?

Спустя 2 минуты, 37 секунд (30.05.2011 - 01:54) seva0812 написал(а):
вот я в следущий теме выкладываю полностью двиг и ты мне скажешь если ошибки потомучто они у меня были на начальном этапе

Спустя 5 минут, 17 секунд (30.05.2011 - 01:59) inpost написал(а):
seva0812
Основные я назвал ещё тогда, ты их уже получил, всё это касается и дальнейшего развития, то есть это те ошибки, которые будут по всему сайту.

Спустя 4 часа, 23 минуты, 33 секунды (30.05.2011 - 06:23) XCross написал(а):
blink.gif

Спустя 23 минуты, 52 секунды (30.05.2011 - 06:47) inpost написал(а):
kmaks
Не стоит спамить, если нечего сказать smile.gif

Спустя 2 часа, 22 минуты, 24 секунды (30.05.2011 - 09:09) Basili4 написал(а):
values ('".$_REQUEST['my_title']."', '".$_REQUEST['my_category_id']."', '".$_REQUEST['my_description']."', '".$_REQUEST['my_text']."',
'".$_REQUEST['my_meta_key_words']."', '".$_REQUEST['my_meta_description']."', '".$artcl_date."');");



Дыра.

Я вот что скажу. выправь ошипки с 1 урока. и я и inpost тебе их указали. По аналогиии выправь ошибки во 2 урока. Я понимаю что ЦМС полюбому будет содержать долю ГК но не такую.

Дам несколько советов
1. Не верь никому приходящим даннам от пользователя. ВСЕГДА проверяй супер глобальные массивы. заменить на mysql_real_escape_string($_REQUEST['my_meta_description'])

а еще лучше на mysql_real_escape_string($_POST['my_meta_description']) необходимо знать откуда переменные приходят. Вот так во всех запросах где ты строки вносишь


где цифери там проще $id=(int)$id; Исправляй пока это.

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.