Блог на G-Drive

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

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

Таблица site_categories
artidname...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 в представленном в статье коде следующим образом:

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

    После добавления авторов мне понадобилось выводить в списках статей метаданные авторов (имена для адреса и текста ссылок, например june и Юлия). Конечно, можно было просто добавить в основной запрос из кода, приведенного в статье, фрагмент LEFT JOIN `site_author` USING(`author`) и т.п., но у меня был более универсальный код примерно такого содержания:

    $a=array('author');
    
    $fields='`site_categories`.*';
    $tables='`site_categories`';
    ...
    
    foreach ($a as $f)
    {
      $fields.=',`site_'.$f.'`.`id` `'.$f.'_id`,`site_'.$f.'`.`name` `'.$f.'_name`';
      $tables.=' LEFT JOIN `site_'.$f.'` USING (`'.$f.'`)';
    }
    

    На месте многоточия находится показанный ниже код:

    $condition='`category`';
    
    if (strlen($p0))
    {
      ...
      $condition.=' AND `'.$r0['id'].'`='.$page[$r0['id']];
    }
    

    На месте многоточия находится код, позволяющий исключить из массива $a признак, данные которого выбираются движком автоматически. Например, на странице списка моих статей по адресу /author/june имена june и Юлия доступны соответственно в переменных $page['id'] и $page['name'], но а чтобы результат выборки не менялся из-за исключения признака из массива, данные признака добавляются в запрос, как фактические данные (Gency не позволит появиться незакодированным кавычкам в этих данных):

    if (is_numeric($key=array_search($r0['id'],$a)))
    {
      unset($a[$key]);
      $fields.=',"'.$page['id'].'" `'.$r0['id'].'_id`,"'.$page['name'].'" `'.$r0['id'].'_name`';
    }
    

    Метаданные также нужны и на странице статьи, причем не только данные автора, но и данные категории (обратите внимание на ссылку сразу после текста статьи), однако эти данные непосредственно не связаны со списком комментариев, расположенным на странице статьи. Иными словами, для страниц статей можно использовать тот же самый универсальный код, но в нем нужно иметь отдельный массив признаков для выборки метаданных, связанных с собственным содержимым страницы, а не списком объектов страницы. Код обработки этого массива должен отличаться от показанного выше, т.к. основной запрос для страницы статьи выполняется движком автоматически и не предусматривает присоединения каких-то дополнительных данных. Эти данные можно выбирать отдельными запросами.

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

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