Что то или лыжи не едут то ли я торможу. Есть небольшой сайтик с партнерскими
товарами. Пагинация для товаров в категориях работает нормально.
А вот для страницы поиска никак не могу ее сделать,
очень нужна ваша помошь.
Есть файл настроек, где прописывается максимальный вывод товаров из поиска
// Настройки
$settings = array(
// Настроийки подключения к БД
// Количество товаров на странице
'items_per_page' => 14,
// Количество товаров на странице поиска
'items_per_page2' => 4,
//Еще настройки
// Валюта
'currency' => 'RUR',
);
Вот вот это
'items_per_page2' => 4,
Использую для страницы поиска
Теперь есть класс для работы с БД и в нем есть вот такие функции, правда я их
немного переписал под пагинацию
// Получение списка категорий
public function CategoryGetAll() {
$rv = array();
// Пытаемся получить данные
if ($result = $this->query("SELECT * FROM `" . self::TABLE_NAME_CATEGORIES . "` WHERE `count` > 0")) {
// Если есть результаты
if ($result->num_rows) {
// Используем их
while ($row = $result->fetch_assoc()) {
$rv[] = $row;
}
}
// Освобождаем ресурсы
$result->free();
}
// Возвращаем результат
return $rv;
}
// Поиск товаров
public function OffersSearchForQuery($query, $offset, $limit) {
// Нормализуем входные данные
$count = $this->IntValue($count);
$query = preg_replace('/[^\pL\pN]+/u', '%', $query);
$query = preg_replace('/^[^\pL\pN]+/u', '', $query);
$query = preg_replace('/[^\pL\pN]+$/u', '', $query);
$query = $this->real_escape_string("%$query%");
$offset = $this->IntValue($offset);
$limit = $this->IntValue($limit);
// Возвращаемый результат
$rv = array();
// Строим запрос
$sql_query = "SELECT * FROM `" . self::TABLE_NAME_OFFERS . "`
WHERE `name` LIKE '$query'
LIMIT $offset, $limit";
// Пытаемся получить данные
if ($result = $this->query($sql_query)) {
// Если есть результаты
if ($result->num_rows) {
// Используем их
while ($row = $result->fetch_assoc()) {
$rv[] = $row;
}
}
// Освобождаем ресурсы
$result->free();
}
// Возвращаем результат
return $rv;
}
// Обёртка для SELECT FOUND_ROWS()
public function SelectFoundRows() {
// Возвращаемый результат
$rv = 0;
// Пытаемся получить данные
if ($result = $this->query("SELECT FOUND_ROWS() AS `rows`")) {
// Если есть результаты
if ($result->num_rows) {
// Используем их
$rv_tmp = $result->fetch_assoc();
$rv = $rv_tmp['rows'];
}
// Освобождаем ресурсы
$result->free();
}
// Возвращаем результат
return $rv;
}
Использую их для вывода инфы из поиска
Теперь сам файл search.php
//Этот файл цепляет с собой еще несколько файлов
include_once $_SERVER['DOCUMENT_ROOT'].'/conects/common.php';
// Получаем поисковый запрос
$search_query = isset($_GET['q']) ? $_GET['q'] : '';
$page = isset($_GET['page']) ? $_GET['page'] : 1;
if ($page < 1) $page = 1;
// Получаем список категорий
$categories_list = $DBAccess->CategoryGetAll();
// Здесь будет хэш id => info
$categories_hash = array();
// Дополняем данные
foreach ($categories_list as $key => $value) {
$categories_list[$key]['link'] = $Path->Category($value['id'], $value['title']);
$categories_list[$key]['current'] = FALSE;
$categories_hash[$value['id']] = $categories_list[$key];
}
////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Выполняем поиск
$offers = $DBAccess->OffersSearchForQuery($search_query, ($page-1)*$settings['items_per_page2'], $settings['items_per_page2']);
$total_offers = $DBAccess->SelectFoundRows();
// Дополняем информацию о товарах
foreach ($offers as $key => $value) {
// Информация о категории
$offers[$key]['category'] = isset($categories_hash[$value['id_category']]) ? $categories_hash[$value['id_category']]['title'] : '';
$offers[$key]['category_link'] = isset($categories_hash[$value['id_category']]) ? $categories_hash[$value['id_category']]['link'] : '';
// "Прямая" ссылка
$offers[$key]['url'] = $Path->Go($value['id']);
// Ссылка на более подробную информацию
$offers[$key]['link'] = $Path->Offer($value['id'], $value['name']);
// Конвертируем цену
$price_tmp = $CBRF->Convert($value['price'], $value['currency'], $settings['currency']);
$offers[$key]['price'] = $price_tmp['sum'];
$offers[$key]['currency'] = $price_tmp['currency'];
}
////////////////////////////////////////////////////////////////////
//Пытаюсь Сделать пагинацию
$pages = array();
// Общее число страниц
$page_count = ceil($total_offers / $settings['items_per_page2']);
// А нужен ли вообще пейджер
if ($page_count > 1) {
$page_min = $page - 4;
if ($page_min < 1) $page_min = 1;
$page_max = $page + 4;
if ($page_max > $page_count) $page_max = $page_count;
if ($page_min > 1) {
$pages[] = array(
'page' => '<<',
'link' => $Path->Search($search_query, 1),
);
}
if ($page > 1) {
$pages[] = array(
'page' => '<',
'link' => $Path->Search($search_query, $page - 1),
);
}
for ($i = $page_min; $i <= $page_max; $i++) {
$pages[] = array(
'page' => $i,
'link' => $i == $page ? '' : $Path->Search($search_query, $i),
);
}
if ($page < $page_count) {
$pages[] = array(
'page' => '>',
'link' => $Path->Search($search_query, $page + 1),
);
}
if ($page_max < $page_count) {
$pages[] = array(
'page' => '>>',
'link' => $Path->Search($search_query, $page_count),
);
}
}
// Цепляем шаблон
include_once $Common->getTpl('pages/search');
Вот так выглядит функция из класса для работы с путями
$Path->Search
const PATH_SEARCH = 'search';
// Путь к поиску
public function Search($query = '', $page = 1) {
$rv = self::PATH_SEARCH;
if ($query != '') {
$rv .= '?q=' . rawurlencode($query);
if ($page > 1) {
$rv .= '&page=' . $this->IntValue($page);
}
}
return $rv;
}
Ну и собственно часть шаблона где я то все вывожу
if ($search_query == '') {
?>
<div class="alert alert-danger" role="alert"><strong>Поисковый запрос не может быть пустым!</strong> </div>
<?php } else { ?>
<div class="row"><!-- for conclusion -->
<div class="col-md-12 col-sm-12">
<div class="name-search"><h1><span class="glyphicon glyphicon-ok search-oks"></span>
Результаты поиска по запросу:</h1></div>
<div class="name-search2"><h3>«<?php echo htmlCh($search_query); ?>»</h3></div>
</div>
<div class="clearfix"></div>
<?php
if (!sizeof($offers)) {
print "<br />Извините, но ничего не найдено.";
}
foreach ($offers as $offer_info) {
?>
<div class="col-md-6 col-sm-6 col-xs-12 wr-good">
<div class="panel panel-primarys panel-bl">
<div class="panel-heading name-good"><?php print htmlCh($offer_info['name']); ?></div>
<div class="panel-body text-center">
<?php if ($offer_info['picture'] != '') { ?>
<p class="wr-img"><a class="thumbnail" href="<?php print HOST.htmlCh($offer_info['link']); ?>">
<img class="good-img" src="<?php print htmlCh($offer_info['picture']); ?>" /></a></p>
<?php } ?>
<table class="table table-condensed table-striped">
<tbody><tr>
<td class="tab-b"><span class="glyphicon glyphicon-usd"></span> Цена:</td>
<td class="tab-b2"><?php print htmlCh($offer_info['price'].' '.$offer_info['currency']); ?></td>
</tr>
<tr>
<td class="tab-b">Категория:</td>
<td class="tab-b3"><a href="<?php print HOST.htmlCh($offer_info['category_link']); ?>"><?php print htmlCh($offer_info['category']) ?></a></td>
</tr></tbody>
</table>
<div class="btn-toolbar" role="toolbar">
<div class="btn-group btn-group-justified">
<span class="btn btn-warnings2" title="<?php print htmlCh($offer_info['name']); ?>" onclick="GoTo ('<?php print HOST.htmlCh($offer_info['url']); ?>')">
<span class="glyphicon glyphicon-shopping-cart"></span> Купить</span>
<a class="btn btn-primarys2" href="<?php print HOST.htmlCh($offer_info['link']); ?>">Подробнее</a>
</div>
</div>
</div>
</div>
</div>
<?php
} ?>
<div class="clearfix"></div>
<?php
if (sizeof($pages))
{
print "<div class=\"col-md-12 col-sm12\"><ul class=\"pagination\">";
foreach ($pages as $page_data) {
if ($page_data['link'] != '') {
print "<li><a href=\"".HOST.htmlCh($page_data['link'])."\">".htmlCh($page_data['page'])."</a></li>\n";
} else {
print "<li class=\"active\"><span>".htmlCh($page_data['page'])." <span class=\"sr-only\">(current)</span></a></li>\n";
}
}
print "</ul></div>\n";
}
print "</div><!-- end conclusion -->\n";
}
Запарился, от жары уже башка не варит что не так.
Результат запроса выводится но только с настройками указаными выше
// Количество товаров на странице поиска
'items_per_page2' => 4,
Пропишу 12, выведет 12, пропишу 10 выведет 10.
Но почему не выводится пагинация не могу понять
_