Pear::Pager分页类简介

PearPager分页类是一个很好用的php分页类,扩展性很强,能够适应各种分页情况的需求,至少我在几年间大大小小的项目里,基本上没有为分页额外写过代码,全部都是用的Pager,足见Pager的可用性之强.下面用代码来看看它的使用范例:

例子1

<?php
require_once 'Pager/Pager.php';
$params = array(
    'mode'       => 'Jumping',
    'perPage'    => 3,
    'delta'      => 2,
    'itemData'   => array('a','b','c','d','e',[...omissis...],'z')
);
$pager = & Pager::factory($params);
$data  = $pager->getPageData();
$links = $pager->getLinks();
//$links is an ordered+associative array with 'back'/'pages'/'next'/'first'/'last'/'all' links
//NB: $links['all'] is the same as $pager->links;

//echo links to other pages:
echo $links['all'];

//Pager can also generate  tags
echo $pager->linkTags;

//Show data for current page:
echo 'PAGED DATA: ' ; print_r($data);

//Results from methods:
echo 'getCurrentPageID()...: '; var_dump($pager->getCurrentPageID());
echo 'getNextPageID()......: '; var_dump($pager->getNextPageID());
echo 'getPreviousPageID()..: '; var_dump($pager->getPreviousPageID());
echo 'numItems()...........: '; var_dump($pager->numItems());
echo 'numPages()...........: '; var_dump($pager->numPages());
echo 'isFirstPage()........: '; var_dump($pager->isFirstPage());
echo 'isLastPage().........: '; var_dump($pager->isLastPage());
echo 'isLastPageComplete().: '; var_dump($pager->isLastPageComplete());
echo '$pager->range........: '; var_dump($pager->range);
?>

Pager的使用,只要调整$param数组的参数,就可以应付很多种分页情况了.代码中的$links数组包含了一些链接,如上一页/页码/下一页/第一页/末页/全部.

例2

如今许多网站为了SEO,把动态页使用rewrite规则伪造成静态页的形式,例如下面这个.htaccess配置:

RewriteEngine on
#Options FollowSymlinks

RewriteBase /
RewriteRule ^articles/([a-z]{1,12})/art([0-9]{1,4})\.html$ /article.php?num=$2&month=$1 [L]

即使在这种情况下,Pager分页仍然有办法工作,见下面的code

<?php
require_once 'Pager/Pager.php';

//first pager
$params1 = array(
    'perPage'    => 3,
    'urlVar'     => pageID_articles,  //1st identifier
    'itemData'   => $someArray
);
$pager1 = & Pager::factory($params1);
$data1  = $pager1->getPageData();
$links1 = $pager1->getLinks();

//second pager
$params2 = array(
    'perPage'    => 8,
    'urlVar'     => pageID_news,      //2nd identifier
    'itemData'   => $someOtherArray
);
$pager2 = & Pager::factory($params2);
$data2  = $pager2->getPageData();
$links2 = $pager2->getLinks();
?>

通过配置$param,就能够把链接 “/articles/march/art15.html”对应到链接”/article.php?num=15&month=march” ,比较灵活的表现

扩展性

Pager类的扩展性,平心而论,也是不错的.比如以前写的path方式的分页类 – Pager::Pathing(),这个方法就是从Pager上扩展而来,满足了当时的需求.

也说站内链接

一葉千鳥在BLOG中提到站内链接的几个意见:

1,地球人都知道的不链
2,重复关键词只链首次出现
3,与文章实质无关的信息不链
4,作者和作者文章同时出现,只链文章
5,关联信息量少时,引用比做链接好
6,逼不得已才链搜索引擎

回想这段时间来,站内链接或多或少也是遵循这个原则,不象从前一般,写了一些文字根本就不链.我觉得做站内链接有个更大的好处就是:

在垃圾网站大肆抄袭你的文字之后,至少还能有几个链接回来

至于某些搜索引擎瞎了眼,把垃圾网站的内容靠前摆放,那也是无可奈何的事情,咱也是老实人,做点踏实事,对的住社会,促进了社会发展.

用php简单实现Search Engine Friendly的URL

上次写了Search Engine Friendly的URL设计 – 俺在这个事上面折腾,要实现这个 http://www.myhost.com/foo.php?a=A&b=B&c=C -> http://www.myhost.com/foo.php/a/A/b/B/c/C的url转换,实际上还有不同的办法.

比如说我用的是虚拟主机,也想实现url优化,但是我没有服务器权限,这时候可以从PATH_INFO来下手.

访问http://www.myhost.com/foo.php/a/A/b/B/c/C这个url的时候,如果apache的AllowPathinfo已经打开,用php访问$_SERVER[‘PATH_INFO’]可以获得a/A/b/B/c/C这串字符 这时候再用php加以解析:

if(!empty($_SERVER['PATH_INFO'])) {
 $paths = explode('/', substr($_SERVER['PATH_INFO'], 1));
 for($i = 0, $cnt = count($paths); $i < $cnt; $i++)
  $_GET[$paths[$i]] = @(string)$paths[++$i];
}

这样就可以简单的将PATH_INFO转换为全局的$_GET数组,这样还有个好处

  • http://www.myhost.com/foo.php?a=A&b=B&c=C
  • http://www.myhost.com/foo.php/a/A/b/B/c/C
  • 上面的url同时可以访问,保证了通用性 

    Search Engine Friendly的URL设计 – 俺在这个事上面折腾

    最近的某个项目需要配合seo,改进php动态页面的url,这里首先参考了车东的
    如何提高在Google中的排名(3) —— Search Engine Friendly的URL设计

    其中有一段url rewrite的例子比较符合要求且改动最少:

    一个更通用的能够将所有的动态页面进行参数映射的表达式是:
    http://www.myhost.com/foo.php?a=A&b=B&c=C
    表现成
    http://www.myhost.com/foo.php/a/A/b/B/c/C
    RewriteRule (.*?\.php)(\?[^/]*)?/([^/]*)/([^/]*)(.+?)? $1(?2$2&:\?)$3=$4?5$5: [N,I]

    这段例子我在自家的apache上操练了很久,反复的调试,修改httpd.conf,查看error.log,rewrite.log,失败的一塌糊涂,几乎让我产生巨大的挫败感.后来查看了apache手册的rewrite指南,发觉里面根本没有[N,I]这个I flag,这下终于明白,这个rewrite规则8成是在IIS上面适用,IIS和apache向来是世仇,通用就甭考虑了.这里又去麻烦网管大哥,讨得下面这段rewrite规则,基本满足需求:

    RewriteEngine on
    RewriteMap quux-map prg:/root/t.sh
    RewriteRule ^/(.*)\.php/(.*) /$1.php?${quux-map:$2}

    cat t.sh

    #!/bin/sh

    LOGFILE=/tmp/percent_rewrite.log
    cat /dev/null > $LOGFILE

    while read URL
    do
    NEWURL=$(echo “$URL” | sed -e ‘s/\([^/]*\)\/\([^/]*\)\//\1=\2\&/g’ | sed ‘s/[/&]$//’ | sed ‘s/\//=/’ )
    echo “Changing $URL to $NEWURL” >> $LOGFILE
    echo $NEWURL

    path方式的分页类 – Pager::Pathing()

    最近的一个项目,用path方式表现页面的url:

    http://www.foo.com/index.php/p/user:photo
    http://www.foo.com/index.php/p/user:photo/page/1
    http://www.foo.com/index.php/p/user:photo/page/2

    正常的页面url:

    http://www.foo.com/index.php?p=user:photo
    http://www.foo.com/index.php?p=user:photo&page=1
    http://www.foo.com/index.php?p=user:photo&page=2

    之前使用的分页类是Pear:Pager,在这时候就玩不转了,不管如何调整参数分页链接总是错误,于是写了个Pathing.php,专门用于path方式的分页,调用方法:

    $pager = Pager::factory(array('mode' => 'Pathing'));

    Continue reading “path方式的分页类 – Pager::Pathing()”