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区块,而不是放在预处理函
你可以把这段代码整理成Drupal区块,而不是放在预处理函书中。或者直接放在节点模板里面。
预处理函数是为模板准备变量的,你的分页输出,没有存放在任何一个变量里面,可能是输出不了的原因。
谢谢老葛的回复!我按照你的提示,放这段代码进一步简化,放
谢谢老葛的回复!
我按照你的提示,放这段代码进一步简化,放在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;
?>
这下显示有分页了,但是没有关联起来。意思是说,点击上一页和下一页,上面的列表都是同样的内容,请问要改哪里呢?
没有看出来代码有什么问题了。 为什么不用views
没有看出来代码有什么问题了。
为什么不用views 实现呢?这样自己就不用写分页了。
pager_default_initialize(10,
pager_default_initialize(10, 2, $element = 0);,这句是做什么的,我看核心里面这样输出的:
$form['pager'] = array('#markup' => theme('pager'));
没有你的这么复杂。
另外一个页面,由多个分页器的时候,也会出现你说的问题。
谢谢葛老师的回复!上述的代码我做了改进,还是写在temp
谢谢葛老师的回复!
上述的代码我做了改进,还是写在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分页,请问有什么好建议吗?
我想在某个组下列出该组所有的组内容列表并分页,于是,上面的
我想在某个组下列出该组所有的组内容列表并分页,于是,上面的代码便应运而生了。
这个使用Views就可以了,OG模块自带的Views就有这个功能。
Ajax的话,使用Views的即可。
谢谢老葛, 我确实在views找到了 OG
谢谢老葛,
我确实在views找到了
小组,小组帖子、小组成员,他们本身是通过entity re
小组,小组帖子、小组成员,他们本身是通过entity reference进行关联的。如果你弄明白了实体之间的引用关系,以及Views里面上下文参数的传递,再去解决你现在的问题就比较简单了,原理是一样的。
Drupal实战的第8章,里面有讲图书、书评之间的关系,使用的就是entity reference,此外,在图书页面,获取当前图书的所有书评,这与在一个小组下面,列出该小组下面的所有帖子/成员,是一个道理。都可以通过Views+ Panels实现。
可以只用views实现么?我怎么觉得配置views好难呢?
可以只用views实现么?我怎么觉得配置views好难呢?尤其是列出该小组下面的所有帖子/成员这一步,不知道从何下手。谢谢老葛!
可以的,你可以参一下OG extras模块。
可以的,你可以参一下OG extras模块。