You are here

请教template.php如何写分页的问题?

moumouguoguo 的头像
Submitted by moumouguoguo on 星期一, 2013-09-16 10:45

template.php文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function tao_preprocess_node(&$variables, $hook) {
if($variables['type'] == 'group'){
    $query = db_select ( 'node', 'n' )->extend('PagerDefault')->limit(3);
    $query->fields ( 'n' );
    $objects = $query->execute ()->fetchAll ();
    $rows = array ();
    foreach ( $objects as $key => $object ) {
        $row = array ();
        $row ['nid'] = $object->nid;
        $rows[] = $row;
    }
    $variables['group_list'] = $rows;
    $args = array('element' => 1, 'parameters' => array('node' => $variables['nid']));
    print theme('pager',$args);
  }
}

node--group.tpl.php文件:

?
1
2
3
4
5
<?php
      foreach ($group_list as $value) {?>
      <h3><?php echo $value['nid']?></h3>
       <?php }
 ?>

我参照了https://api.drupal.org/api/drupal/includes!pager.inc/function/theme_pager/7这里的提示来做。
用devel的dpr方法,打印theme('pager',$args)的结果是

<h2 class="element-invisible">页面</h2>

 

但是没有显示分页的地方,请问哪里没写好呢?

论坛:

Drupal版本:

moumouguoguo 的头像

谢谢老葛的回复!

我按照你的提示,放这段代码进一步简化,放在node.tpl.php的某个位置

   <?php
            $query = db_select('node', 'n')->extend('PagerDefault');
             $query->fields('n', array('title'))->limit(1);
            $result = $query->execute ()->fetchAll ();
            $output = '';
            foreach ($result as $row) {
                $output .= $row->title."<br/>";
            }
            pager_default_initialize(10, 2, $element = 0);
            $output .= theme('pager', array('quantity' => 10));
            print $output;
      ?>

这下显示有分页了,但是没有关联起来。意思是说,点击上一页和下一页,上面的列表都是同样的内容,请问要改哪里呢?

g089h515r806 的头像

pager_default_initialize(10, 2, $element = 0);,这句是做什么的,我看核心里面这样输出的:

 $form['pager'] = array('#markup' => theme('pager'));

没有你的这么复杂。

另外一个页面,由多个分页器的时候,也会出现你说的问题。

moumouguoguo 的头像

谢谢葛老师的回复!

上述的代码我做了改进,还是写在template.php里,不过赋给了变量数组

      if($variables['type']=='group'){
          $gid = $variables['id'];
          $page = isset($_GET['page'])?intval($_GET['page']):0;
          $limit = 5;
          $offset = $page*$limit;
          $query = db_select('og_membership', 'm')->condition('entity_type','node')->condition('gid',$gid);
          $total = $query->countQuery()->execute()->fetchField();
          $page = pager_default_initialize($total, $limit);
          $result = db_query_range("SELECT n.{nid},n.{title} FROM {og_membership} AS m
                  LEFT JOIN {node} AS n ON m.{etid}=n.{nid}
                  WHERE m.{entity_type}='node' AND m.{gid}=$gid", $offset, $limit);
          $output = '';
          foreach ($result as $row) {
              $output .= '<a href="/node/'.$row->nid.'">'.$row->title."</a><br/>";
          }
          $output .= theme('pager');
          $variables['group_list'] = $output;
      }

这样才可以完完全全是分页了。但是有个大问题,这个页面的评论下面,也出现了分页框,意思是说,这里是多余的,这是为什么呢?

 

另外,我为什么不用views呢?我只会简单的views操作,遇到两个content type有关联的配置,就不会弄了。上面的需求就是两个不同的content type有关联的,所以我想直接写代码。

需求如下:
其实就是OG模块的关系,一个content type为group组,另一个为group content组内容,组与组内容是一对多的关系。我想在某个组下列出该组所有的组内容列表并分页,于是,上面的代码便应运而生了。

葛老师,您理解这个需求了吗?根据您的经验,有什么更好的建议吗?其实我想做成block的,但不知道node的nid如何得到?呵呵。

另外,因为这是局部才有变化,我想做成ajax分页,请问有什么好建议吗?

moumouguoguo 的头像

谢谢老葛,

我确实在views找到了

OG content
In code
类型: 内容
 
这个东西,但不清楚怎么调用呢?网上也没有找到相关介绍。请您指点一下,好吗?谢谢了。
另:您的《drupal实战》这书今天已到,看了下,觉得不错,我得细细阅读了。
g089h515r806 的头像

小组,小组帖子、小组成员,他们本身是通过entity reference进行关联的。如果你弄明白了实体之间的引用关系,以及Views里面上下文参数的传递,再去解决你现在的问题就比较简单了,原理是一样的。

Drupal实战的第8章,里面有讲图书、书评之间的关系,使用的就是entity reference,此外,在图书页面,获取当前图书的所有书评,这与在一个小组下面,列出该小组下面的所有帖子/成员,是一个道理。都可以通过Views+ Panels实现。