тек-с. Вернемся к этому вопросу. Неужели не существует какого-либо решения для создания обратной нумерации страниц, что б элементы не перескакивали с одной на другую?
на русском попробуй описать. если ссылки с прямой нумерацией, а визуально показывать обратную - то в чем проблема?
[vs] он хочет, чтобы ссылка на 5-ю с конца страницу как получилась. так и не менялась. но как это описать в логике, да еще в вариантами удаления записей - пока я не увидел. )
armadillo Если новости - то можно выводить все за конкретную дату на одной странице. Если слишком редко доавбляются новые записи, то по неделям. В любом случае, если надо чтобы записи по страницам не смещались при удалении, одинаковое количество записей на страницу сохраняться не будет. Можно еще сделать сециальную таблицу pages, с двумя полями. Во второе через запятую перечислать номера записей для конкретной страницы.
маленький пример.. хотелось бы отметишь, что юрл не обязательно вводить, а можно выдирать и так.. Код (Text): <table width="100%"> <tr> <td class="pages-list"> <?php $number = 1000; - количество элементов всего $pcount = 20 - количество жлементов на странице $pg_all=20; // только чётное количество (количество цифирок страничек) $a=CEIL(($number-$pcount)/$pcount); //phpinfo(); $bs= $HTTP_SERVER_VARS[QUERY_STRING]; //проверка если ли в конце юрла переменная номера $i=strpos($bs,"&pg="); if ($i==0){$i=strlen($bs);} $bs=substr($bs,0,$i); $pag=0; $pg=$HTTP_GET_VARS['pg']; $c_pg=0; $ec=''; if ($pg<=($pg_all/2)){ $pag=0; if (($pag+$pg_all)<$a){$ec2=' ... <a href="?'.$bs.'&pg='.$a.'" >'.($a+1).'</a>';} }else{ $ec='<a href="?'.$bs.'&pg=0" >1</a> ... '; $pag=$pg-$pg_all/2; if (($pag+$pg_all)<$a){$ec2=' ... <a href="?'.$bs.'&pg='.$a.'" >'.($a+1).'</a>';} } WHILE (($pag <= $a)&&($c_pg<=$pg_all)){ $c_pg++; $pag++; if ($number>=$pcount){ if (($pag-1)==$HTTP_GET_VARS['pg']){$ec.= '<a class="curent">'.$pag.'</a> '; }else{ $ec.='<a href="?'.$bs.'&pg='.($pag-1).'" >'.$pag.'</a> '; } } } echo $ec.$ec2; ?> </td> </tr> </table>
Разруливайте, например, url'ом. Если у вас как идентификатор страницы в $_GET, скажем, id, то можно так PHP: <?php if($_GET['id'] == 'id') $image = '<img src="/data/img.jpg" />'; else $image = '<img src="/data/img2.jpg" />';
Мне вот как на этом сайте необходимо зделать, тут графика тоже меняется при переходе на страницы. (http://www.free-download-internet.com/)
Помогите новичку, совсем запутался с сабжем. проблема такая: из формы form.php посылаю значение переменных Код (Text): http://127.0.0.1/anex/pager.php?townfrom=Kiev&country=Turkiye&begin=&end=&nochimin=3&nochimax=14&adult=2&child=1&fbut=Go! и все работает нормально, получяю ссылки на свои N страниц, НО при переходе на страницу 2 адрес меняется на Код (Text): http://127.0.0.1/anex/pager.php?page=2 и конечно ничего не работает. пишет "error! Записей не найдено!" предпологаю что ошибка в строке PHP: echo ' <a '.$style.' href='.$_server['php_self'].'?page='.$page_link.'>'.$page_link.'</a> '.$sperator; а вот собственно и весь код PHP: <?php $nochimin=$_GET['nochimin']; $nochimax=$_GET['nochimax']; $country=$_GET['country']; $townfrom=$_GET['townfrom']; $adult=$_GET['adult']; $child=$_GET['child']; $pricefrom=$_GET['pricefrom']; $priceto=$_GET['priceto']; if ($pricefrom==""){$pricefrom=0;} if ($priceto==""){$priceto=1000000;} function universal_link_bar($page, $count, $pages_count, $show_link) { // $show_link - это количество отображаемых ссылок; // нагляднее будет, когда это число будет парное // Если страница всего одна, то вообще ничего не выводим if ($pages_count == 1) return false; $sperator = ' '; // Разделитель ссылок; например, вставить "|" между ссылками // Для придания ссылкам стиля $style = 'style="color: #808000; text-decoration: none;"'; $begin = $page - intval($show_link / 2); unset($show_dots); // На всякий случай :) // Сам постраничный вывод // Если количество отображ. ссылок больше кол. страниц if ($pages_count <= $show_link + 1) $show_dots = 'no'; // Вывод ссылки на первую страницу if (($begin > 2) && !isset($show_dots) && ($pages_count - $show_link > 2)) { echo '<a '.$style.' href='.$_server['php_self'].'?page=1> |< </a> '; } for ($j = 0; $j < $page; $j++) { // Если страница рядом с концом, то выводить ссылки перед идущих для того, // чтобы количество ссылок было постоянным if (($begin + $show_link - $j > $pages_count) && ($pages_count-$show_link + $j > 0)) { $page_link = $pages_count - $show_link + $j; // Номер страницы // Если три точки не выводились, то вывести if (!isset($show_dots) && ($pages_count-$show_link > 1)) { echo ' <a '.$style.' href='.$_server['php_self'].'?page='.($page_link - 1).'><b>...</b></a> '; // Задаем любое значение для того, чтобы больше не выводить в начале "..." (три точки) $show_dots = "no"; } // Вывод ссылки echo ' <a '.$style.' href='.$_server['php_self'].'?page='.$page_link.'>'.$page_link.'</a> '.$sperator; } else continue; } for ($j = 0; $j <= $show_link; $j++) // Основный цикл вывода ссылок { $i = $begin + $j; // Номер ссылки // Если страница рядом с началом, то увеличить цикл для того, // чтобы количество ссылок было постоянным if ($i < 1) { $show_link++; continue; } // Подобное находится в верхнем цикле if (!isset($show_dots) && $begin > 1) { echo ' <a '.$style.' href='.$_server['php_self'].'?page='.($i-1).'><b>...</b></a> '; $show_dots = "no"; } // Номер ссылки перевалил за возможное количество страниц if ($i > $pages_count) break; if ($i == $page) { echo ' <a '.$style.' ><b>'.$i.'</b></a> '; } else { echo ' <a '.$style.' href='.$_server['php_self'].'?page='.$i.'>'.$i.'</a> '; } // Если номер ссылки не равен кол. страниц и это не последняя ссылка if (($i != $pages_count) && ($j != $show_link)) echo $sperator; // Вывод "..." в конце if (($j == $show_link) && ($i < $pages_count)) { echo ' <a '.$style.' href='.$_server['php_self'].'?page='.($i+1).'><b>...</b></a> '; } } // Вывод ссылки на последнюю страницу if ($begin + $show_link + 1 < $pages_count) { echo ' <a '.$style.' href='.$_server['php_self'].'?page='.$pages_count.'> >| </a>'; } return true; } // Конец функции // Подключение к базе данных mysql_connect('localhost', 'root', '') or die('error! Нет соединения с сервером mysql!'); mysql_select_db('argus') or die('error! Нет соединения с базой данных!'); // Подготовка к постраничному выводу $perpage = 10; // Количество отображаемых данных из БД if (empty($_get['page']) || ($_get['page'] <= 0)) { $page = 1; } else { $page = (int) $_get['page']; // Считывание текущей страницы } // Общее количество информации $count = mysql_numrows(mysql_query("SELECT * FROM `t1` WHERE `townfrom` = \"$townfrom\" AND `country` = \"$country\" AND `nochi` >= \"$nochimin\" AND `nochi` <= \"$nochimax\" AND `vzr` = \"$adult\" AND `deti` = \"$child\" AND `price` >= \"$pricefrom\" AND `price` <= \"$priceto\"")) or die('error! Записей не найдено!'); $pages_count = ceil($count / $perpage); // Количество страниц // Если номер страницы оказался больше количества страниц if ($page > $pages_count) $page = $pages_count; $start_pos = ($page - 1) * $perpage; // Начальная позиция, для запроса к БД // Вызов функции, для вывода ссылок на экран universal_link_bar($page, $count, $pages_count, 10); // Вывод информации из базы данных echo '<p><b>Постраничный вывод информации</b></p>'; $result = mysql_query("select * from t1 WHERE `townfrom` = \"$townfrom\" AND `country` = \"$country\" AND `nochi` >= \"$nochimin\" AND `nochi` <= \"$nochimax\" AND `vzr` = \"$adult\" AND `deti` = \"$child\" AND `price` >= \"$pricefrom\" AND `price` <= \"$priceto\" limit ".$start_pos.", ".$perpage) or die('error!'); while ($row = mysql_fetch_array($result)) { echo '<p>'.$row['price'].'</p>'; } ?>
Ну какая ошибка? Эта строка написана так, чтобы формировать ссылку вида Код (Text): http://127.0.0.1/anex/pager.php?page=2 . Если ссылка тебе не подходит, формируй другую. Если кроме $_GET['page'] тебе нужна еще чертова уйма параметров, то пихай их в эту ссылку сам, больше они ниоткуда не возьмутся. Не в сессии же их хранить.
вот всегда интересно что в таких классах расположено?разнообразные часто используемые методы? или что
За одно и я свой выложу. Может что то новое будет function mpager($count, $cur=null, $url=null){ if ($cur === null) $cur = $_GET['p']; if ($url === null) $url = strtr($_SERVER['REQUEST_URI'], array("/p:{$_GET['p']}"=>'', "&p={$_GET['p']}"=>'')); if(2 > $count = ceil($count)) return; echo "<div class=\"pager\">". ($cur <= 0 ? "<span>← назад</span>" : "<a href=\"$url".($cur > 1 ? "/p:".($cur-1) : '')."\">← назад</a>"); for($i = max(0, min($cur-10, $count-20)); $i < min($count, max($cur+10, 20)); $i++) echo ' '. ($i == $cur ? "<span>".($i+1)."</span>" : "<a href=\"$url".($i ? (strpos($url, '&') || strpos($url, '?') ? "&p=$i" : "/p:$i") : '')."\">".($i+1)."</a>"); echo ' '; echo $cur+1 >= $count ? "<span>вперед →</span>" : "<a href=\"$url".($i ? (strpos($url, '&') || strpos($url, '?') ? "&p=".($cur+1) : "/p:".($cur+1)) : '')."\">вперед →</a>"; echo "</div>"; } Выборка из базы данных mpql(mpqw("SELECT SQL_CALC_FOUND_ROWS * LIMIT ". ((int)$_GET['p']*5). ",5"); $conf['tpl']['pcount'] = mpql(mpqw("SELECT FOUND_ROWS()/5 AS count"), 0, 'count'); Вывод в шаблоне. <div align=center><? mpager($conf['tpl']['pcount']); ?></div> Рабочий модуль вывод новостей на моем сайте: ftp://mpak.su/modules/news/ Стоит только пояснить что параметры передаются в движок таким образом /param:value/param2:value2/param3:value3 И пагер всегда дописывает к этой конструкции /p:num_page
у меня пейджер не простой разделен на бд пейджер - билдер запросови на вьюху от него - ну и там уже адаптеры могут делать форматирование выывода. кидану только бд листалку PHP: <?php class DB_Paged { protected $sql; protected $sqlTpl; protected $count; protected $countSql; protected $countSqlTpl; protected $pageName; protected $page; protected $perPage; /** * Database module * @var Db Database module object */ protected $db; function __construct(DB $db, $sql, $key = '*', $perPage = 25, $pageName = 'page') { $this->db = $db; $this->sqlTpl = $sql; $this->countSqlTpl = $this->buildCountSql(); $this->setPageName($pageName); $this->setPerPage($perPage); } public function buildCountSql($key = '*') { $sql = $this->sqlTpl; if(preg_match("#select.*?(distinctrow|distinct).*?from#ism", $sql, $distinct)) { $key = strtoupper($distinct[1])." ".$this->db->escape($key); } else { $key = $this->db->escape($key); } $countSql = "SELECT COUNT(".$key.") `count` "; $regex = "(?:\sHAVING\s|\sORDER\s|\sLIMIT\s|\sPROCEDURE\s|\sINTO\s|\sFOR\s+UPDATE\s|$)"; preg_match("#(FROM.*?)$regex#ism", $sql, $sqlInner); $countSql .= $sqlInner[1]; return $countSql; } public function execute() { $vars = func_get_args(); $cback = array($this->db,"buildSql"); $this->sql = call_user_func_array($cback,array_merge((array)$this->sqlTpl, $vars)); $this->countSql = call_user_func_array($cback,array_merge((array)$this->countSqlTpl, $vars)); $this->count = $this->db->scalar($this->countSql); $from = $this->perPage * ($this->page - 1); $this->sql .= " LIMIT ".$from.", ".$this->perPage; return $this->db->sql2arr($this->sql); } public function setPageName($pageName) { $this->pageName = $pageName; $page = (int)$_GET[$this->pageName]; $this->page = $page > 0 ? $page : 1; } public function getPageName() { return $this->pageName; } public function getSql() { return $this->sql; } public function getSqlTpl() { return $this->sqlTpl; } public function getCountSql() { return $this->countSql; } public function setCountSqlTpl($countSqlTpl) { $this->countSqlTpl = $countSqlTpl; } public function getCountSqlTpl() { return $this->countSqlTpl; } public function getCount() { return $this->count; } public function setPerPage($perPage = false) { if(!(int) $perPage) { $perPage = App::instance()->config->get("module.db.pager", 25); } $this->perPage = $perPage; } public function setPage($page) { $this->page = (int)$page > 0 ? (int)$page : 1; } }
как-бы классец сам биснуется, парсит скл запросик простым методом, так как у меня параметризация в скл запросах, то там стоп слова не попадутся, поэтому 100% рабочий метод для не особо хитро-выебаных запросов. работает на ура, я забыл что такое писать гавенный запрос с "оборванными" "select ... "from кусками или лепить неудачные конструкции ктонить может заюзать просто часть которая над скл работает и юзать у себя
пример использования - PHP: <?php public function getItems() { global $sqlFilter; $where = join(" AND ", $sqlFilter); return $this->getPager("SELECT * FROM `#__service_orders` WHERE $where ORDER BY `id` DESC")->getData()->getItems(); } protected function getPager($sql) { $this->pager = App::createModule("pager", $sql); return $this->pager; } PHP: require_once dirname(__FILE__).'/libs/DudePager.class.php'; require_once dirname(__FILE__).'/classes/Pager.class.php'; Pager::setConfig($config); return array("Pager", "create");
с легкостью жрет более сложные запросы PHP: public function getItems() { return $this->getPager("SELECT `m`.*, `o`.`title` `office` FROM `#__service_managers` `m` LEFT JOIN `#__service_offices` `o` ON `o`.`id`=`m`.`office_id`")->getData()->getItems(); } PHP: $pager = new Pager("SELECT `o`.*, `f`.`title` `office_title`, `m`.`fio` `master_title` FROM `#__service_orders` `o` LEFT JOIN `#__service_offices` `f` ON `f`.`id` = `o`.`office_id` LEFT JOIN `#__service_masters` `m` ON `m`.`id` = `o`.`master_id` WHERE $where ORDER BY `o`.`id` DESC"); $tpl->items = $pager->getData()->getItems();