Есть дополнение Smarty для нумерации страниц.
Вы можете найти его здесь: http://www.phpinsider.com/php/code/SmartyPaginate/
Для быстрого примера, извлеченного из связанной страницы:
index.php
session_start();
require('Smarty.class.php');
require('SmartyPaginate.class.php');
$smarty =& new Smarty;
// required connect
SmartyPaginate::connect();
// set items per page
SmartyPaginate::setLimit(25);
// assign your db results to the template
$smarty->assign('results', get_db_results());
// assign {$paginate} var
SmartyPaginate::assign($smarty);
// display results
$smarty->display('index.tpl');
function get_db_results() {
// normally you would have an SQL query here,
// for this example we fabricate a 100 item array
// (emulating a table with 100 records)
// and slice out our pagination range
// (emulating a LIMIT X,Y MySQL clause)
$_data = range(1,100);
SmartyPaginate::setTotal(count($_data));
return array_slice($_data, SmartyPaginate::getCurrentIndex(),
SmartyPaginate::getLimit());
}
index.tpl
{* display pagination header *}
Items {$paginate.first}-{$paginate.last} out of {$paginate.total} displayed.
{* display results *}
{section name=res loop=$results}
{$results[res]}
{/section}
{* display pagination info *}
{paginate_prev} {paginate_middle} {paginate_next}
Относительно вашего вопроса о смешении класса DB и класса Paginator, все в порядке:
Ваш класс БД будет обрабатывать выборку данных из БД
Класс SmartyPaginate будет обрабатывать нумерацию страниц
А ваш index.php просто делает вызовы каждому из них, где это уместно, чтобы все изложить.
Идея состоит в том, чтобы держать обязанности изолированными.
Ваш класс БД не будет обрабатывать нумерацию страниц, и ваш класс пагинации не будет содержать код БД.
Из вашего второго вопроса, я думаю, вы пытались сделать что-то слишком сложное для рассматриваемой проблемы.
Я бы предложил вам переместить весь код, связанный с БД, внутри вашего класса обработки БД и за пределы вашего index.php
Это, например:
$limit = "LIMIT " .($page_num - 1)*$items_pp . "," . $items_pp . ""; //if 5 results pre page and we on page 3 then LIMIT 10,5 that is record 10,11,12,13 and 14
Это логика БД, она генерирует (часть) строку SQL, поэтому перемещайте ее.
Это зависит от 2 параметров, поэтому найдите способ сделать их доступными.
В этом случае я бы предложил просто передать оба параметра в качестве параметров.
Вместо:
$result = $db->get_images_gallery($category,$limit);
Использование:
$result = $db->get_images_gallery($category,$no_items, $page);
Кроме того, ваше правило навигации на пейджере должно быть в вашем классе пагинатора.
if($total > 0 && $pages_required >= 1){//only display this navigation if there are images to display and more than one page
$smarty->assign('page_scroll',$page_num . ' of ' . $pages_required);
$page_scroll_first = "<a href='".$_SERVER['REDIRECT_URL'] . "?page_num=1"."' >FIRST</a> <a href='".$_SERVER['REDIRECT_URL'] . "?page_num=" . ($page_num-1)."' ><<PREVIOUS</a>";
$page_scroll_last = " <a href='".$_SERVER['REDIRECT_URL'] . "?page_num=". ($page_num+1) . "'>NEXT>></a> <a href='" . $_SERVER['REDIRECT_URL'] . "?page_num=".$pages_required."'>LAST</a>";
if($page_num == 1){$page_scroll_first = "FIRST <<PREVIOUS";}
if($page_num == $pages_required){$page_scroll_last = "NEXT>> LAST";}
$smarty->assign('page_scroll_first',$page_scroll_first);//just use if statements to set the values for page scroll first and page scroll last and then assign them here
$smarty->assign('page_scroll_last',$page_scroll_last);
$smarty->assign('page_num',$page_num);
}
В этом случае, я надеюсь, что надстройка автоматически обработает его для вас.
Затем вы можете переместить весь этот блок, который выполняет всю логику для извлечения и подготовки данных изображений для функции (внутри вашего класса ImageGalery, если он у вас есть)
$total = $db->num_images_gallery($category); //returns the number of records in total('null') or in a particular category('category_name')
$pages_required = ceil($total/$items_pp); //total records / records to display per page rounded up
if($page_num > $pages_required){//in case the current page number is greater that the pages required then set it to the amount of pages required
$page_num = $pages_required;
}
if($page_num < 1){//in case the current page num is set to less that one set it back to 1
$page_num = 1;
}
$limit = "LIMIT " .($page_num - 1)*$items_pp . "," . $items_pp . ""; //if 5 results pre page and we on page 3 then LIMIT 10,5 that is record 10,11,12,13 and 14
$result = $db->get_images_gallery($category,$limit);
$i = 0;
while($row = $result->fetch_assoc()){
$images[$i]['file'] =$row['file'];
$images[$i]['file_thumb'] = str_replace('.','_thumbnail.',$row['file']);//show the thumbnail version of the image on the page
$images[$i]['title'] = $row['title'];
$images[$i]['description'] = $row['description'];
$i++;
}
Наконец, на вашем index.php все, что вам нужно сделать, это:
Проверьте параметры, которые вы получили
Вызовите свой класс ImageGalery, чтобы получить данные галереи (передайте необходимые параметры)
Позвоните своему классу Pagination, чтобы выполнить нумерацию страниц (настройка навигационных ссылок и т. Д.)
Установите необходимые переменные шаблона Smarty
И покажи это.
Есть еще много возможностей для улучшения, но я надеюсь, что эти несколько шагов помогут сделать ваш код Image Galery более четким.