Pull to refresh

Функция для постраничного вывода статей в блоге со встроенным paginatorom

Целью данной функции является минимизация кода, и возможность использовать одну функцию как для поиска, так и для основного отображения статей на сайте.
В целом все началось с того, что мне потребовался paginator для главной страницы создаваемого мной блога. Но, я был крайне удивлен тому, что все готовые решения, либо заточены под какую-либо CMS, либо настолько громоздки, что количество кода превышает общее количество кода самого блога. Далеко не буду ходить, думаю многим известен Pagination.ru.
Конечно же проще чем использовать MySQL LIMIT, думаю искать ничего не стоит. Идея не нова, использовалась и описывалась сотни раз, поэтому на оригинальность я не претендую, всего лишь делюсь удобной, по моему мнению, функцией, которую можно допиливать под множество потребностей.
Итак думаю можно начинать.

Структура таблицы базы данных

CREATE TABLE IF NOT EXISTS `posts` (                                -- где:
  `id` int(11) NOT NULL AUTO_INCREMENT,                                 -- идентификатор (первичный ключ)
  `category` varchar(20) NOT NULL,                                      -- категория
  `theme` varchar(256) NOT NULL,                                        -- тема статьи     
  `post` text NOT NULL,                                                 -- текст статьи
  `date` varchar(20) NOT NULL,                                          -- дата публикации в формате UNIX
  `user` varchar(20) NOT NULL,                                          -- имя пользователя, опубликовавшего статью
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Непосредственно функция

//$table - имя таблицы
//$critery - критерий поиска в формате имя_поля=значение
//$limit - количество отображаемых статей на странице
function post($table, $critery = null, $limit = 5) {
    // Линк подключения к БД
    $pdo = new PDO('mysql:host=имя_хоста;dbname=имя_бд', 'имя_пользователя', 'пароль');
    // Формирование критерия поиска, если критерий пуст, уточняющее WHERE не используется   
    $where = NULL;
    if (isset($critery)) {
        list($at, $vl) = explode("=", $critery);
        $atribute = trim($at);
        $value = trim($vl); 
        $where = "WHERE `$atribute` = '$value'";
    }
    // Отправная точка отсчета статей
    $begin = isset($_GET['begin'])?intval($_GET['begin']):0;
    // Основной запрос в БД
    $query = "SELECT category, theme, post, date, user  
        FROM `$table` $where 
            ORDER BY `id` 
            DESC LIMIT ".$begin.", ".$limit;
    $result  = $pdo->query($query);
    // Сохраняем все значения в массив
    $row = $result->fetchAll(PDO::FETCH_ASSOC);
    // Перебираем массив и формируем визуализацию полученных значений
    if(is_array($row) ) {
        foreach($row as $array) {
            echo "<div id='theme'><h3>", $array['theme'], '</h3></div>';
            echo "<div id='date'><h6>Posted ", date('M j, Y', $array['date']), " by ", $array['user'],"</h6></div>";
            echo "<div id='post'><p>", substr($array['post'], 0, 400), '.....</p></div>';
            echo "<div id='category'>", $array['category'], "<hr /></div>";
        }
    }
    $query = "SELECT COUNT(*) as `count` 
        FROM `$table` " . $where;
    $result = $pdo->query($query);
    // Здесь мы подсчитываем сколько всего у нас статей
    $count = $result->fetch(PDO::FETCH_OBJ)->count;
    // Вычисляем сколько будет страниц
    $pageCount = ceil($count/$limit);
    $navigation = NULL;
    // Формируем навигацию
    for($i=0; $i<$pageCount; $i++) {
        $navigation .= '<a href="index.php?begin='.($i*$limit).'">'.($i+1).'</a>';
    }
    echo '<div class="pagination">' . $navigation . '</div>';
    } 

С помощью конструкции switch можно соорудить нехитрый рубрикатор:
switch ($_GET['id']) {
    // Таких рубрик может быть сколь угодно
    case 'PHP':
        post('posts', 'category=PHP');
        break;
    case 'CSS':
        post('posts', 'category=CSS');
        break;
    // Ну и дефолтовое значение вывод всех статей. Первой будет последняя опубликованная
    default: post('posts');
    break;
}

Таким же образом можно соорудить и поисковик, но уже естественно без switch.
Прикрутив сюда CSS, получается весьма годная визуализация, без особых заморочек.
Всем спасибо. Всегда открыт для конструктивной критики.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.