Пагинация XenForo [Developer Guide]

grisha2217

Проверенные
Сообщения
916
Решения
6
Реакции
1,393
Баллы
8,315
Жесть...
1.
Код:
<xen:if is="{$tests}">
Не нужно проверять "пустоту" массива для вывода пагинации, это уже есть в шаблоне page_nav
Код:
<xen:if is="{$pageTotal} > 1">

2. Не нужно добавлять в массив $viewParams элементы startOffset и endOffset, движок сам посчитает это
3.
PHP:
$page = isset($fetchOptions['page']) ? $fetchOptions['page'] : 1; // если в массиве $fetchOptions существует элемент с ключом page, то присваем его, иначе присваиваем 1
        $perPage = isset($fetchOptions['perPage']) ? $fetchOptions['perPage'] : 25; // если в массиве $fetchOptions существует элемент с ключом perPage, то присваем его, иначе присваиваем 25
        $offset = ($page - 1) * $perPage; // вычисляем отступ
        $limit = $perPage; // присваиваем лимит
        return array(
            'offset' => $offset,
            'limit' => $limit
            ); // возвращаем готовый к работе массив
    }

Есть готовые функции для выборки записей с лимитом, зачем нужен свой велосипед, да написанный далеко не лучшим образом.


Приведу пример из движка, чтобы было понятно, в чём разница.
PHP:
$whereConditions = $this->prepareThreadConditions($conditions, $fetchOptions);

        $sqlClauses = $this->prepareThreadFetchOptions($fetchOptions);
        $limitOptions = $this->prepareLimitFetchOptions($fetchOptions);

        $forceIndex = (!empty($fetchOptions['forceThreadIndex']) ? 'FORCE INDEX (' . $fetchOptions['forceThreadIndex'] . ')' : '');

        return $this->fetchAllKeyed($this->limitQueryResults(
            '
                SELECT thread.*
                    ' . $sqlClauses['selectFields'] . '
                FROM xf_thread AS thread ' . $forceIndex . '
                ' . $sqlClauses['joinTables'] . '
                WHERE ' . $whereConditions . '
                ' . $sqlClauses['orderClause'] . '
            ', $limitOptions['limit'], $limitOptions['offset']
        ), 'thread_id');


Сам $fetchOptions
PHP:
$fetchOptions = array(
            'order' => 'post_date',
            'direction' => 'desc',
            'join' => XenForo_Model_Thread::FETCH_FORUM | XenForo_Model_Thread::FETCH_FIRSTPOST | XenForo_Model_Thread::FETCH_USER | XenForo_Model_Thread::FETCH_AVATAR,
            'readUserId' => XenForo_Visitor::getUserId(),
            'includeForumReadDate' => true,
            'perPage' => $perPage,
            'page' => $page
        );
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу