PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Описание: ООП
Поиск в теме | Версия для печати
Джур
Отправлено: 29 Февраля, 2012 - 15:09:52
Посетитель
Покинул форум
Сообщений всего: 423
Дата рег-ции: Март 2007
Помог: 0 раз(а)
Ну есть такой, правда там всего один метод, можете его просто воткнуть в нужный вам класс:
PHP:
скопировать код в буфер обмена
function paging( $url , $page , $len , $size = 10) {
$page = $page / $size ;
$len = ceil ( $len / $size ) - 1 ; $a = $size ;
$b = $size ;
if ( $page - $a < 0) {
$b += $a - $page ;
$a = $size - ( $a - $page ) ;
}
if ( $page + $b > $len ) {
$b = $len - $page ;
$a = $size * 2- $len + $page ;
}
if ( $page - $a < 0) {
$a = $page ;
}
$paging = range ( $page - $a , $page + $b ) ; if ( $paging [ 0] ) {
}
if ( $paging [ count ( $paging ) - 1
] != $len ) { $paging [ ] = - 1 ;
$paging [ ] = $len ;
}
$html = '' ;
if ( count ( $paging ) > 1 and
$len > 0
) { $html .= '<div class="paging">' ;
foreach ( $paging as $v ) {
if ( $v >- 1) {
$html .= '<a href="/' . $url . '/' . ( $v * $size ) . '/">' . ( $v + 1 ) . '</a>' ;
} else {
$html .= '<span>...</span>' ;
}
}
$html .= '</div>' ;
}
return $html ;
}
Код явно извращен но с своей задачей справляется.
-----Тамбовский каджит тебе товарищ
WebBegginer
Отправлено: 29 Февраля, 2012 - 15:15:35
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Февр. 2012
Откуда: Днепропетровск, Украина
Помог: 0 раз(а)
Джур пишет: Ну есть такой, правда там всего один метод, можете его просто воткнуть в нужный вам класс:
PHP:
скопировать код в буфер обмена
function paging( $url , $page , $len , $size = 10) {
$page = $page / $size ;
$len = ceil ( $len / $size ) - 1 ; $a = $size ;
$b = $size ;
if ( $page - $a < 0) {
$b += $a - $page ;
$a = $size - ( $a - $page ) ;
}
if ( $page + $b > $len ) {
$b = $len - $page ;
$a = $size * 2- $len + $page ;
}
if ( $page - $a < 0) {
$a = $page ;
}
$paging = range ( $page - $a , $page + $b ) ; if ( $paging [ 0] ) {
}
if ( $paging [ count ( $paging ) - 1
] != $len ) { $paging [ ] = - 1 ;
$paging [ ] = $len ;
}
$html = '' ;
if ( count ( $paging ) > 1 and
$len > 0
) { $html .= '<div class="paging">' ;
foreach ( $paging as $v ) {
if ( $v >- 1) {
$html .= '<a href="/' . $url . '/' . ( $v * $size ) . '/">' . ( $v + 1 ) . '</a>' ;
} else {
$html .= '<span>...</span>' ;
}
}
$html .= '</div>' ;
}
return $html ;
}
Код явно извращен но с своей задачей справляется.
Спасибо конечно большое, но мне нужно по такие требования:
выглядит так:
1 ... 17 18 19 [20] 21 22 23 ... 641
Весь код нужно оформить в виде класса Paginator и написать пример,
показывающий его работоспособность.
Класс должен обладать минимум методом установки текущей страницы, и методом установки показываемого количества страниц возле текущей (в приведенном выше примере это 3)
ugin_root
Отправлено: 29 Февраля, 2012 - 17:15:20
Частый гость
Покинул форум
Сообщений всего: 134
Дата рег-ции: Май 2011
Откуда: Киргизия
Помог: 5 раз(а)
PHP:
скопировать код в буфер обмена
class Paginator
{
public $_current = null ;
public $_count = null ;
public $left = 10 ;
public $s_url = '?page=[num]' ;
public $s_link = ' <a href="[url]">[num]</a> ' ;
public $s_next = ' <a href="[url]">...</a> ' ;
public $s_prev = ' <a href="[url]">...</a> ' ;
public $s_first = ' <a href="[url]">Первая</a> ' ;
public $s_last = ' <a href="[url]">Последняя</a> ' ;
public $s_current = ' [num] ' ;
public $s_return = '<div>[first] [prev] [links] [next] [last]</div>' ;
function __construct( $count , $current , $url = null ) {
$this -> _current = ( int) $current ;
$this -> _count = ( int) $count ;
if ( $url != null ) {
$this -> s_url = ( string) $url ;
}
}
function ToString( ) {
$first = '' ; $prev = '' ; $links = '' ; $next = '' ; $last = '' ;
for ( $i = 0 ; $i < $this -> _count ; $i ++ )
{
$patern = array ( '#\[url\]#Usi' , '#\[num\]#Usi' ) ; $replacement = array ( $url , $i + 1
) ;
if ( $this -> _current == $i + 1) {
$links .= preg_replace ( $patern , $replacement , $this -> s_current ) ; } else if ( $i < $this -> _current + $this -> left && $i > $this -> _current - $this -> left - 2) {
$links .= preg_replace ( $patern , $replacement , $this -> s_link ) ; }
if ( $i == 0
&& $this -> _current
- 1
!= $i ) $first = preg_replace ( $patern , $replacement , $this -> s_first ) ; if ( $this -> _current
- 2
== $i && $this -> _current
- 1
!= 0
) $prev = preg_replace ( $patern , $replacement , $this -> s_prev ) ; if ( $this -> _current
== $i && $this -> _current
!= $this -> _count
) $next = preg_replace ( $patern , $replacement , $this -> s_next ) ; if ( $this -> _count
- 1
== $i && $this -> _current
- 1
!= $i ) $last = preg_replace ( $patern , $replacement , $this -> s_last ) ; }
array ( '#\[first\]#Usi' , '#\[prev\]#Usi' , '#\[links\]#Usi' , '#\[next\]#Usi' , '#\[last\]#Usi' ) , array ( $first , $prev , $links , $next , $last ) , $this -> s_return
) ;
}
}
$count_page = 666 ;
$page = @ $_GET [ 'page' ] ;
if ( is_null ( $page ) || ( string
) ( int
) $page != $page || $page > $count_page || $page < 0
) $page = 0 ;
echo 'открыта страница номер: ' . ( $page + 1) ;
$pagin = new Paginator( $count_page , $page + 1 , '?forum=23&page=[num]' ) ;
$pagin -> s_current = ' [[num]] ' ;
$pagin -> s_first = ' <a href="[url]">[num]</a> ' ;
$pagin -> s_last = ' <a href="[url]">[num]</a> ' ;
echo $pagin -> ToString ( ) ;
$pagin -> left = 3 ;
$pagin -> s_current = ' [num] ' ;
$pagin -> s_first = '' ;
$pagin -> s_last = '' ;
$pagin -> s_next = ' <a href="[url]">туда</a> ' ;
$pagin -> s_prev = ' <a href="[url]">сюда</a> ' ;
echo $pagin -> ToString ( ) ;
(Отредактировано автором: 29 Февраля, 2012 - 17:41:41)
WebBegginer
Отправлено: 29 Февраля, 2012 - 21:30:46
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Февр. 2012
Откуда: Днепропетровск, Украина
Помог: 0 раз(а)
ugin_root пишет: PHP:
скопировать код в буфер обмена
class Paginator
{
public $_current = null ;
public $_count = null ;
public $left = 10 ;
public $s_url = '?page=[num]' ;
public $s_link = ' <a href="[url]">[num]</a> ' ;
public $s_next = ' <a href="[url]">...</a> ' ;
public $s_prev = ' <a href="[url]">...</a> ' ;
public $s_first = ' <a href="[url]">Первая</a> ' ;
public $s_last = ' <a href="[url]">Последняя</a> ' ;
public $s_current = ' [num] ' ;
public $s_return = '<div>[first] [prev] [links] [next] [last]</div>' ;
function __construct( $count , $current , $url = null ) {
$this -> _current = ( int) $current ;
$this -> _count = ( int) $count ;
if ( $url != null ) {
$this -> s_url = ( string) $url ;
}
}
function ToString( ) {
$first = '' ; $prev = '' ; $links = '' ; $next = '' ; $last = '' ;
for ( $i = 0 ; $i < $this -> _count ; $i ++ )
{
$patern = array ( '#\[url\]#Usi' , '#\[num\]#Usi' ) ; $replacement = array ( $url , $i + 1
) ;
if ( $this -> _current == $i + 1) {
$links .= preg_replace ( $patern , $replacement , $this -> s_current ) ; } else if ( $i < $this -> _current + $this -> left && $i > $this -> _current - $this -> left - 2) {
$links .= preg_replace ( $patern , $replacement , $this -> s_link ) ; }
if ( $i == 0
&& $this -> _current
- 1
!= $i ) $first = preg_replace ( $patern , $replacement , $this -> s_first ) ; if ( $this -> _current
- 2
== $i && $this -> _current
- 1
!= 0
) $prev = preg_replace ( $patern , $replacement , $this -> s_prev ) ; if ( $this -> _current
== $i && $this -> _current
!= $this -> _count
) $next = preg_replace ( $patern , $replacement , $this -> s_next ) ; if ( $this -> _count
- 1
== $i && $this -> _current
- 1
!= $i ) $last = preg_replace ( $patern , $replacement , $this -> s_last ) ; }
array ( '#\[first\]#Usi' , '#\[prev\]#Usi' , '#\[links\]#Usi' , '#\[next\]#Usi' , '#\[last\]#Usi' ) , array ( $first , $prev , $links , $next , $last ) , $this -> s_return
) ;
}
}
$count_page = 666 ;
$page = @ $_GET [ 'page' ] ;
if ( is_null ( $page ) || ( string
) ( int
) $page != $page || $page > $count_page || $page < 0
) $page = 0 ;
echo 'открыта страница номер: ' . ( $page + 1) ;
$pagin = new Paginator( $count_page , $page + 1 , '?forum=23&page=[num]' ) ;
$pagin -> s_current = ' [[num]] ' ;
$pagin -> s_first = ' <a href="[url]">[num]</a> ' ;
$pagin -> s_last = ' <a href="[url]">[num]</a> ' ;
echo $pagin -> ToString ( ) ;
$pagin -> left = 3 ;
$pagin -> s_current = ' [num] ' ;
$pagin -> s_first = '' ;
$pagin -> s_last = '' ;
$pagin -> s_next = ' <a href="[url]">туда</a> ' ;
$pagin -> s_prev = ' <a href="[url]">сюда</a> ' ;
echo $pagin -> ToString ( ) ;
Спасибо Вам огромное, а не могли бы вы реализовать index файл, который будет обрабатывать данный класс, с выводом информации на страницах ? Буду безумно благодарен!!!
altvirus
Отправлено: 29 Февраля, 2012 - 22:13:22
Новичок
Покинул форум
Сообщений всего: 3
Дата рег-ции: Февр. 2012
Помог: 0 раз(а)
DeepVarvar пишет: Ахах, сумашедшие....
Вот вам 12 заветных строк, делающих то же самое что и полотна кода выше:
http://forum.php.su/topic.php?forum=1&topic=5095&postid=1302696202#1302696202
Да, но по условию надо в ООП одним классом...
DeepVarvar
Отправлено: 29 Февраля, 2012 - 22:33:07
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008
Откуда: Альфа Центавра
Помог: 353 раз(а)
altvirus пишет: но по условию надо в ООП одним классом
В котором один метод.... Зачем?
Это похоже на: "выбить комару глаз кувалдой"
altvirus
Отправлено: 29 Февраля, 2012 - 22:34:57
Новичок
Покинул форум
Сообщений всего: 3
Дата рег-ции: Февр. 2012
Помог: 0 раз(а)
DeepVarvar пишет: altvirus пишет: но по условию надо в ООП одним классом
В котором один метод.... Зачем?
Это похоже на: "выбить комару глаз кувалдой"
ну, вот такое задание. а еще хорошо бы пример применения пагинатора...в общем, нужна помощь=)
ugin_root
Отправлено: 01 Марта, 2012 - 18:28:37
Частый гость
Покинул форум
Сообщений всего: 134
Дата рег-ции: Май 2011
Откуда: Киргизия
Помог: 5 раз(а)
WebBegginer пишет: Спасибо Вам огромное, а не могли бы вы реализовать index файл, который будет обрабатывать данный класс, с выводом информации на страницах ? Буду безумно благодарен!!!
для этого нужно знать что выводить, и много чего ещё! К вам приходит переменная с номером страницы, и вы вычисляете максимальное число страниц, что ещё нужно???
З.Ы. тестовая страничька итак выводится:
используйте ($page + 1) для вывода нужной вам страницы.
WebBegginer
Отправлено: 01 Марта, 2012 - 18:30:23
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Февр. 2012
Откуда: Днепропетровск, Украина
Помог: 0 раз(а)
altvirus пишет: WebBeginner, тестовое задание на работу делаешь?=)
Почему Вы так решили? В институте часть лабораторки ;)
(Добавление)
Вообще я уже начал писать, но у меня не особо складывается, слишком объемно и поэтому я завис
Вот пример моего кода
PHP:
скопировать код в буфер обмена
<?PHP
class Paginator{
var $items_per_page ;
var $items_total ;
var $current_page ;
var $num_pages ;
var $mid_range ;
var $low ;
var $high ;
var $limit ;
var $return ;
var $default_ipp = 25 ;
var $querystring ;
function Paginator( )
{
$this -> current_page = 1 ;
$this -> mid_range = 7 ;
$this -> items_per_page = ( ! empty ( $_GET [ 'ipp' ] ) ) ?
$_GET [ 'ipp' ] : $this -> default_ipp ; }
function paginate( )
{
if ( $_GET [ 'ipp' ] == 'All' )
{
$this -> num_pages = ceil ( $this -> items_total / $this -> default_ipp ) ; $this -> items_per_page = $this -> default_ipp ;
}
else
{
if ( ! is_numeric ( $this -> items_per_page ) OR
$this -> items_per_page <= 0
) $this -> items_per_page = $this -> default_ipp ; $this -> num_pages = ceil ( $this -> items_total / $this -> items_per_page ) ; }
$this -> current_page = ( int) $_GET [ 'page' ] ; // must be numeric > 0
if ( $this -> current_page < 1 Or
! is_numeric ( $this -> current_page ) ) $this -> current_page = 1 ; if ( $this -> current_page > $this -> num_pages ) $this -> current_page = $this -> num_pages ;
$prev_page = $this -> current_page - 1 ;
$next_page = $this -> current_page + 1 ;
if ( $_GET )
{
$args = explode ( "&" , $_SERVER [ 'QUERY_STRING' ] ) ; foreach ( $args as $arg )
{
if ( $keyval [ 0 ] != "page" And $keyval [ 0 ] != "ipp" ) $this -> querystring .= "&" . $arg ;
}
}
if ( $_POST )
{
foreach ( $_POST as $key => $val )
{
if ( $key != "page" And $key != "ipp" ) $this -> querystring .= "&$key =$val " ;
}
}
if ( $this -> num_pages > 10)
{
$this -> return = ( $this -> current_page != 1 And $this -> items_total >= 10 ) ? "<a class=\" paginate\" href=\" $_SERVER[PHP_SELF] ?page=$prev_page &ipp=$this->items_per_page $this->querystring \" >« Previous</a> " : "<span class=\" inactive\" href=\" #\" >« Previous</span> " ;
$this -> start_range = $this -> current_page - floor ( $this -> mid_range / 2
) ; $this -> end_range = $this -> current_page + floor ( $this -> mid_range / 2
) ;
if ( $this -> start_range <= 0)
{
$this -> end_range += abs ( $this -> start_range ) + 1 ; $this -> start_range = 1 ;
}
if ( $this -> end_range > $this -> num_pages )
{
$this -> start_range -= $this -> end_range - $this -> num_pages ;
$this -> end_range = $this -> num_pages ;
}
$this -> range = range ( $this -> start_range , $this -> end_range ) ;
for ( $i = 1 ; $i <= $this -> num_pages ; $i ++ )
{
if ( $this -> range [ 0] > 2 And $i == $this -> range [ 0] ) $this -> return .= " ... " ;
// loop through all pages. if first, last, or in range, display
if ( $i == 1 Or
$i == $this -> num_pages Or
in_array ( $i , $this -> range ) ) {
$this -> return .= ( $i == $this -> current_page And $_GET [ 'page' ] != 'All' ) ? "<a title=\" Go to page $i of $this->num_pages \" class=\" current\" href=\" #\" >$i </a> " : "<a class=\" paginate\" title=\" Go to page $i of $this->num_pages \" href=\" $_SERVER[PHP_SELF] ?page=$i &ipp=$this->items_per_page $this->querystring \" >$i </a> " ;
}
if ( $this -> range [ $this -> mid_range - 1] < $this -> num_pages - 1 And $i == $this -> range [ $this -> mid_range - 1] ) $this -> return .= " ... " ;
}
$this -> return .= ( ( $this -> current_page != $this -> num_pages And $this -> items_total >= 10) And ( $_GET [ 'page' ] != 'All' ) ) ? "<a class=\" paginate\" href=\" $_SERVER[PHP_SELF] ?page=$next_page &ipp=$this->items_per_page $this->querystring \" >Next »</a>\n " : "<span class=\" inactive\" href=\" #\" >» Next</span>\n " ;
$this -> return .= ( $_GET [ 'page' ] == 'All' ) ? "<a class=\" current\" style=\" margin-left:10px\" href=\" #\" >All</a> \n " : "<a class=\" paginate\" style=\" margin-left:10px\" href=\" $_SERVER[PHP_SELF] ?page=1&ipp=All$this->querystring \" >All</a> \n " ;
}
else
{
for ( $i = 1 ; $i <= $this -> num_pages ; $i ++ )
{
$this -> return .= ( $i == $this -> current_page ) ? "<a class=\" current\" href=\" #\" >$i </a> " : "<a class=\" paginate\" href=\" $_SERVER[PHP_SELF] ?page=$i &ipp=$this->items_per_page $this->querystring \" >$i </a> " ;
}
$this -> return .= "<a class=\" paginate\" href=\" $_SERVER[PHP_SELF] ?page=1&ipp=All$this->querystring \" >All</a> \n " ;
}
$this -> low = ( $this -> current_page - 1) * $this -> items_per_page ;
$this -> high = ( $_GET [ 'ipp' ] == 'All' ) ? $this -> items_total : ( $this -> current_page * $this -> items_per_page ) - 1 ;
$this -> limit = ( $_GET [ 'ipp' ] == 'All' ) ? "" : " LIMIT $this->low ,$this->items_per_page " ;
}
function display_items_per_page( )
{
$items = '' ;
$ipp_array = array ( 10 , 25 , 50 , 100 , 'All' ) ; foreach ( $ipp_array as $ipp_opt ) $items .= ( $ipp_opt == $this -> items_per_page ) ? "<option selected value=\" $ipp_opt \" >$ipp_opt </option>\n " : "<option value=\" $ipp_opt \" >$ipp_opt </option>\n " ;
return "<span class=\" paginate\" >Items per page:</span><select class=\" paginate\" onchange=\" window.location='$_SERVER[PHP_SELF] ?page=1&ipp='+this[this.selectedIndex].value+'$this->querystring ';return false\" >$items </select>\n " ;
}
function display_jump_menu( )
{
for ( $i = 1 ; $i <= $this -> num_pages ; $i ++ )
{
$option .= ( $i == $this -> current_page ) ? "<option value=\" $i \" selected>$i </option>\n " : "<option value=\" $i \" >$i </option>\n " ;
}
return "<span class=\" paginate\" >Page:</span><select class=\" paginate\" onchange=\" window.location='$_SERVER[PHP_SELF] ?page='+this[this.selectedIndex].value+'&ipp=$this->items_per_page $this->querystring ';return false\" >$option </select>\n " ;
}
function display_pages( )
{
return $this -> return ;
}
}
(Отредактировано автором: 01 Марта, 2012 - 18:51:44)
ugin_root
Отправлено: 01 Марта, 2012 - 20:09:03
Частый гость
Покинул форум
Сообщений всего: 134
Дата рег-ции: Май 2011
Откуда: Киргизия
Помог: 5 раз(а)
WebBegginer
рад помочь несчастным студентам!
но вы видать не поняли...
//есть 2 переменных номер страницы [num] и [url] до этой самой страницы
PHP:
скопировать код в буфер обмена
public $s_url = '?page=[num]' ;
public $s_link = ' <a href="[url]">[num]</a> ' ;
public $s_next = ' <a href="[url]">...</a> ' ;
public $s_prev = ' <a href="[url]">...</a> ' ;
public $s_first = ' <a href="[url]">Первая</a> ' ;
public $s_last = ' <a href="[url]">Последняя</a> ' ;
public $s_current = ' [num] ' ;
не нужно в самом классе задавать лишние! Вот что это за х-ня? никто не поймёт!
PHP:
скопировать код в буфер обмена
return "<span class=\" paginate\" >Items per page:</span><select class=\" paginate\" onchange=\" window.location='$_SERVER[PHP_SELF] ?page=1&ipp='+this[this.selectedIndex].value+'$this->querystring ';return false\" >$items </select>\n " ;
а это понять намного проще!
(Добавление)
тем более подобные конструкции нежелательно использовать внутри класса! задавайте стандарт, т.е. то что будет работать всегда.
CODE (
htmlphp ):
скопировать код в буфер обмена
style=\"margin-left:10px\"
< option selected value= \"$ipp_opt \"
onchange=\" window.location='$_SERVER[PHP_SELF] ?page='+this[this.selectedIndex].value+'&ipp=$this -> items_per_page$this->querystring';return false\"
class=\"paginate\"
подобного хлама в классе задавать не следует
(Добавление)
не факт что всем нужно переместить блок на 10px от левого края
не факт что всем нужно отобразить это в виде <select>
не факт что всем нужно действие Java Script-ов на нажатие ссылки
не факт что у всех прописан сласс "paginate" в стилях
все эти "параметры" доложны задаваться локально!
(Добавление)
класс для того и нужен что-бы отделить весе полезности (данного класса), от того что вы в него добавили(гов..., нехорошего кода для класса)
на месте вашего преподавателя ставил бы смело 2 за такой класс...(Отредактировано автором: 01 Марта, 2012 - 20:24:20)
Поиск в теме | Версия для печати
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB