2012-07-20 94 views
0

我是rss feeds和php分页的新手。我试图解析rss提要,并在单独的页面上显示每个提要的详细信息。我复制并粘贴了http://www.phpeasystep.com/phptu/29.html的分页代码。当我在localhost上运行index.php时,什么都不显示。显示rss feed与php分页

我没有问题使用curl下载rss feed。我也尝试了print_r($ data)并且数据显示正常。

有人能指点我哪里出错吗?谢谢。

我的代码:

<?php 
if (function_exists("curl_init")){ 
    $ch=curl_init(); 
    curl_setopt($ch,CURLOPT_URL,"http://feeds.feedburner.com/rb286"); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    $data=curl_exec($ch); 
    curl_close($ch); 
    $doc=new SimpleXmlElement($data); 
    //print_r($doc); 
} 

function parseRSS($xml){ 
    $items=$xml->xPath('/rss/channels/item'); 

    $count=count($items); 

    // How many adjacent pages should be shown on each side? 
    $adjacents =3; 


    $total_pages = $count; 

    /* Setup vars for query. */ 
    $targetpage = "index.php"; //your file name (the name of this file) 
    $limit = 1;         //how many items to show per page 
    $page = $_GET['page']; 
    if($page) 
     $start = ($page - 1) * $limit;   //first item to display on this page 
    else 
     $start = 0;        //if no page var is given, set start to 0 


    /* Setup page vars for display. */ 
    if ($page == 0) $page = 1;     //if no page var is given, default to 1. 
    $prev = $page - 1;       //previous page is page - 1 
    $next = $page + 1;       //next page is page + 1 
    $lastpage = ceil($total_pages/$limit);  //lastpage is = total pages/items per page, rounded up. 
    $lpm1 = $lastpage - 1;      //last page minus 1 

    /* 
     Now we apply our rules and draw the pagination object. 
     We're actually saving the code to a variable in case we want to draw it more than once. 
    */ 
    $pagination = ""; 
    if($lastpage > 1) 
    { 
     $pagination .= "<div class=\"pagination\">"; 
     //previous button 
     if ($page > 1) 
      $pagination.= "<a href=\"$targetpage?page=$prev\">� previous</a>"; 
     else 
      $pagination.= "<span class=\"disabled\">� previous</span>"; 

     //pages 
     if ($lastpage < 7 + ($adjacents * 2)) //not enough pages to bother breaking it up 
     { 
      for ($counter = 1; $counter <= $lastpage; $counter++) 
      { 
       if ($counter == $page) 
        $pagination.= "<span class=\"current\">$counter</span>"; 
       else 
        $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
      } 
     } 
     elseif($lastpage > 5 + ($adjacents * 2)) //enough pages to hide some 
     { 
      //close to beginning; only hide later pages 
      if($page < 1 + ($adjacents * 2))   
      { 
       for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++) 
       { 
        if ($counter == $page) 
         $pagination.= "<span class=\"current\">$counter</span>"; 
        else 
         $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
       } 
       $pagination.= "..."; 
       $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>"; 
       $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>";  
      } 
      //in middle; hide some front and some back 
      elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2)) 
      { 
       $pagination.= "<a href=\"$targetpage?page=1\">1</a>"; 
       $pagination.= "<a href=\"$targetpage?page=2\">2</a>"; 
       $pagination.= "..."; 
       for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++) 
       { 
        if ($counter == $page) 
         $pagination.= "<span class=\"current\">$counter</span>"; 
        else 
         $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
       } 
       $pagination.= "..."; 
       $pagination.= "<a href=\"$targetpage?page=$lpm1\">$lpm1</a>"; 
       $pagination.= "<a href=\"$targetpage?page=$lastpage\">$lastpage</a>";  
      } 
      //close to end; only hide early pages 
      else 
      { 
       $pagination.= "<a href=\"$targetpage?page=1\">1</a>"; 
       $pagination.= "<a href=\"$targetpage?page=2\">2</a>"; 
       $pagination.= "..."; 
       for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++) 
       { 
        if ($counter == $page) 
         $pagination.= "<span class=\"current\">$counter</span>"; 
        else 
         $pagination.= "<a href=\"$targetpage?page=$counter\">$counter</a>";     
       } 
      } 
     } 

     //next button 
     if ($page < $counter - 1) 
      $pagination.= "<a href=\"$targetpage?page=$next\">next �</a>"; 
     else 
      $pagination.= "<span class=\"disabled\">next �</span>"; 
     $pagination.= "</div>\n";  
    } 

     foreach($items as $item){ 
       echo("<a href='".$item[0]->link."'>".$item[0]->title."</a>"); 
     } 
} 
if (isset($doc->channel))parseRSS($doc); 

?> 
<?php 
echo($pagination); 
?> 
</body> 

回答

1

好了,所以有一些问题,与此代码:

首先变量$pagination;是在函数里创建并为此在全球范围内不可用之外。快速修复这个是:

在页面加载的开头:

<?php 
$pagination = ''; 

里面的函数add:

function parseRSS($xml){ 
    global $pagination; 

接下来的XPath位置是错误

更改:

$items=$xml->xPath('/rss/channels/item'); 

$items=$xml->xPath('/rss/channel/item'); 

这些变化应该给你一些输出上手,我觉得有更多的问题与您的分页,但你应该管理的,一旦你有一些输出梳理出来。

编辑: 为了只获取需要的链接,你应该改变:

<?php 
foreach($items as $item){ 
    echo("<a href='".$item[0]->link."'>".$item[0]->title."</a>"); 
} 

到:

<?php 
foreach($items as $key => $item){ 
    if(($key >= $start) && ($key < $start + $limit)){ 
     echo("<a href='".$item[0]->link."'>".$item[0]->title."</a>"); 
    } 
} 
+0

谢谢你的帮助。至少链接正在显示。你知道$ adjacents = 3的目的是什么吗?这是什么意思?“每边应该显示多少个相邻的页面?”? – vaanipala 2012-07-20 08:07:35

+0

邻接可能意味着,例如,如果你在第5页,那么分页将是'2 | 3 | 4 | 5 | 6 | 7 | 8',但这只是一个猜测,只有找到方法是改变它,看看会发生什么。 – martincarlin87 2012-07-20 08:14:54

+0

adjacents只是计算分页对象的页码1 | 2 | 3 | 4 | ...将如何显示。 – vaanipala 2012-07-20 09:09:42

0

DonSeba,你的第二foreach循环工作正常。每个链接都在不同的页面上显示。然而,你能否告诉我你的if语句有两个条件的目的是什么? 我尝试了,只有1,如果条件下,它工作太细:

foreach($items as $key => $item){ 
//if(($key >= $start) && ($key < $start + $limit)){ //your if statement 
    if ($key==$start){ 
    echo("<a href='".$item[0]->link."'>".$item[0]->title."</a>"); 
    } 
} 

谢谢。