Блог на G-Drive

Решила собрать блог на G-Drive (этот сайт) и по горячим следам описать основные используемые при этом приемы. И вот что у меня получилось...

Блог обычно имеет структуру, при которой основной список статей размещается непосредственно на главной странице сайта. Кроме того, в блоге также присутствуют дополнительные списки статей, сгруппированных по какому-либо признаку (категория статьи, временной период публикации статьи и т.п.). Было бы вполне логично сделать так, чтобы за формирование и вывод всех списков статей отвечал один и тот же модуль. Т.к. списки статей размещаются не в одной категории (в терминах G-Drive каждая запись таблицы site_categories представляет собой отдельную категорию), в таблице site_categories необходимо определить поле module и поместить в него имя модуля, отвечающего за формирование и вывод всех списков статей. Категории статей можно разместить непосредственно в таблице site_categories, но лучше это сделать в отдельной таблице, чтобы не смешивать их с другими страницами блога, особенно с учетом того, что статьи блога также могут быть размещены в таблице site_categories, чтобы упростить их адресацию. В итоге получается следующее:

Таблица site_categories
aididname...categorybitsmodule
0Блог разработчиков...084category
1categoryКатегории статей...091category
10g-drive-dbe-3Знакомьтесь: G-Drive DBE 3...284article
11g-drive-blogБлог на G-Drive...284article
Таблица site_category
categoryidname...
1gencyGency...
2g-driveG-Drive...

Для формирования списка статей определенной категории на соответствующей странице может быть использован следующий запрос:

SELECT * FROM `site_categories` WHERE `category`={$page['category']}

Для формирования основного списка статей на главной странице сайта может быть использован следующий запрос:

SELECT * FROM `site_categories` WHERE `category`!=0

Сравнение "!=0" в условии отбора можно опустить.

В G-Drive признаком обращения к главной странице сайта является наличие пустой строки в $px (а также в $p0 и в $r0['id']). Выполнение соответствующей проверки с объединением двух описанных выше запросов в один и базовый код для осуществления постраничной навигации представлены ниже:

$pp=5;

$s=strlen($px)?'='.$page['category']:'!=0';

if ($res=mysqli_query($link,'SELECT COUNT(*) FROM `site_categories` WHERE `category`'.$s))
{
  list($count)=mysqli_fetch_row($res);
  $pc=(int)(($count+$pp-1)/$pp);
  mysqli_free_result($res);
  if ($pn==0||$pn>$pc) error(404);
  elseif (!($res=mysqli_query($link,'SELECT * FROM `site_categories` WHERE `category`'.$s.' ORDER BY `date` DESC LIMIT '.(($pn-1)*$pp).','.$pp))) error(503);
}
else error(503);

Условие `category`!=0 позволяет исключить из основного списка статей не требующие публикации статьи, т.е. статьи все-таки будут опубликованы, но они не будут отображаться в основном списке статей. Чтобы исключить статьи с нулевым идентификатором категории и из дополнительных списков, необходимо отказаться от использования категории с нулевым идентификатором. Также можно использовать более универсальное условие `category`!=0 AND `category`={$page['category']}, которое за счет изменения второй части позволяет группировать статьи по разным признакам и при этом исключить из списков не требующие публикации статьи (с нулевым идентификатором категории).

Вот и все, что я хотела написать в данной статье. Жду ваших вопросов и комментариев.

Комментарии: 2

  1. Юлия

    По просьбам коллег решила добавить разделение статей по авторам. Развивая изложенную в конце статьи идею, для главной страницы сайта можно использовать запрос с условием отбора `category`!=0, а для страниц со списками статей определенного автора или определенной категории – соответственно `category`!=0 AND `author`={$page['author']} или `category`!=0 AND `category`={$page['category']} (предполагается, что в таблице site_author по аналогии с таблицей site_category используется поле author для хранения идентификаторов авторов статей). Как видно, два последних запроса будут отличаться друг от друга только именем поля во второй части условия отбора. Имя этого поля совпадает со значением поля id таблицы site_categories (доступно в $p0 и в $r0['id']). Т.е. можно использовать универсальное условие `category`!=0 AND `{$p0}`={$page[$p0]} и формировать значение $s в представленном в статье коде следующим образом (сравнение "!=0" в первой части условия опущено):

    $s=strlen($px)?' AND `'.$p0.'`='.$page[$p0]:'';
    
  2. Юлия

    Статья и предыдущий комментарий обновлены.

Отправить комментарий

Ваш адрес E-mail не будет опубликован.