dashan 提交于
Drupal views api 使用,让开发更加方便快捷:
最新 views_get_view_result($name, $display_id = NULL) api 函数
参数 $name : views视图名称
$display_id 显示视图id。
返回views 视图item项。
......感谢TVdrupal提供视频....抄录备忘.......
require:
<?php
require (path_to_theme().'/templates/display/indexlist.tpl.php');//注意路径
?>
2、在模板文件夹里面添加indexlist.tpl.php文件,文件中添加以下代码(以下代码可多次复制粘贴后,修改taxoid的数字得到不同的分类内容):
<?php
$taxoid=1; //1为你的分类ID(taxoid)
require (path_to_theme().'/display/indexlist_ul.tpl.php');
?>
3、添加indexlist_ul.tpl.php文件,代码为:
----------------
得到对象:
新建一个views区块,并建 上下文过滤器 Has taxonomy term ID
$view = views_get_view('index_list');
$view->set_display('block_indexlist');
$view->set_arguments(array($taxoid)); //这就是Has taxonomy term ID
$view->set_items_per_page(8);
$view->pre_execute();
$view->execute();
//print $view->render();
//return $view->result;
----------------
foreach得到节点的字段:
if(sizeof($view->result)>0){
foreach($view->result as $id=>$v){
$nodeindex = node_load($v->nid); //得到节点对象,由于views_get_view得不到图片,所以通过node_load($v->nid)去得到节点的图片
$url = url('node/' . $v->nid); //得到链接
if(isset($nodeindex->field_image['und'][0]['uri'])){
$style = 'thumbnail';
$imgv = image_style_url($style, $nodeindex->field_image['und'][0]['uri']); //得到图片
}
else {
$imgv = $base_path.'/sites/default/files/grid.jpg';
}
if($id==0){ $img='<div class="first"> <img src="'.$imgv.'" /> </div>';}
else {$img='';}
?>
<li >
<?php echo $img?>
<span class="fr"><?php echo date('Y-m-d',$v->node_created);?></span> <!--这是日期-->
<a href="<?php echo $url;?>"><?php echo $v->node_title;?></a></li> <!--这是标题-->
<?php
}
}
else { echo '<li>no result..</li>';}
?>
----------------
关于分类--得到分类的字段:
<?php
$taxoid=11;
$term = taxonomy_term_load($taxoid);
//pre($term);
if(isset($term->field_image['und'][0]['uri'])){
$image_uri = $term->field_image['und'][0]['uri'];
$cateimg = file_create_url($image_uri);
}
else $cateimg = $base_path.'/sites/default/files/grid.jpg';
?>
标题: <?php echo $term->name;?>
链接:<a href="<?php echo url('taxonomy/term/' . $taxoid);?>">更多</a>
图片: <img src="<?php echo $cateimg?>" />
- 登录以发表评论
views_get_view,drupal开发神器
drupal 7 的views_get_view很简单,比drupal 6更加简洁了
鼠标创建一个views,就叫promotion,设置一定的fields等略过
就这样,这么简单的代码就能完成views的定制了,drupal7在views的开发上更加简单了。
高级点,改filter
同一个内容的三种实现方法:
views_embed_view
views_get_view_result
views_get_view
另一个高级示例:下面的示例混合了views_get_view以及views preview输出强大的HTML
这么做有什么好处?当你要接单,要自定义查模版的时候,views帮你做好了管理界面,这是很方便的一件事。
当然还有更多复杂的设置,
参考drupal 7 views api function :
https://api.drupal.org/api/views/views.module/7 -------这个页面上还有很多有趣的函数
https://api.drupal.org/api/views/views.module/function/views_get_view_re... ---一个很有意思的函数
https://api.drupal.org/api/drupal/functions
https://api.drupal.org/api/views/views.module/function/views_get_view/7
在这里记录一个很奇怪的现象,当你的代码没有按常规输出的时候,可能是权限问题
可以强制:global $user;$user->uid=1;当views输出结束后,再将uid改回来即可,这可能是权限没有设置好所致
————————同理,drupal 8的做法是一样的————————
但是api页面还没有出来,我们可以试试用D7的方法去做。
————————以下是drupal 6 views_get_view————————
下面的代码一定适用于drupal 6,也是该 文章最早的版本,解析也全面。
下面所有的代码将以一个名叫viewtest的view为基础,这个view很简单:以Taxonomy: Term ID为argument,以Node: Title Title为单一的输出结果;这里,你可以导入我创建的view:import;
一些与view没关的代码,将以chdir对drupal的好处为基础,
[例子一:用代码输出views]
创建printviews.php,这个PHP下只有下面的代码:
chdir('/home2/crawgirl/public_html/feedme/');//注释掉或者改为你自己的站的目录
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//下面的代码才是views相关的
$views=views_get_view("viewtest");
$views->preview();
$results=$views->result;
//下面的代码与views无关的
print_r($results);
//print $results[2][node_title];//只输出第三个结果的node的标题
$views=NULL;$results=NULL;
?>
(输出时要结果好看,请查看输出的HTML源码)
[例子二:传入argument(参数)]
只输出termId=3的结果,就是说输出那些是属于分类ID是3的结果,注意,只比上面的多了加红的一行:
新建argviews.php,只有下面几行代码:
chdir('/home2/crawgirl/public_html/feedme/');
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$views=views_get_view("viewtest");
$views->set_arguments(array(3));
$views->preview();
$results=$views->result;
print_r($results);
//print $results[2][node_title];//只输出第三个结果的node的标题
$views=NULL;$results=NULL;
?>
输出结果的结构与例子一的情况一样,只是结果变了
[例子三:控制输出的结果数]
目前我们的结果都是只输出10个结果,我现在想输出50个结果。
对比例子一:只增加了加红的两行
新建viewsnum.php,只输入下面的几行
chdir('/home2/crawgirl/public_html/feedme/');
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$views=views_get_view("viewtest");
$views->set_display('default');
$views->display_handler->set_option('items_per_page', 50);
$views->preview();
$results=$views->result;
print_r($results);
//print $results[2][node_title];//只输出第三个结果的node的标题
$views=NULL;$results=NULL;
?>
[例子四:输出views的HTML]
print $views->preview();
请自行举一反三,完成上面的代码
[例子五:控制是否分页]
$views->display_handler->set_option(‘use_pager’,1);
当为0时则不分页
[例子六:控制当前显示在views的第三页而不是默认的第一页结果]
$views=views_get_view("viewtest");
//$views->args=array(1);
$views->pager["use_pager"]=1;//要分页
$views->pager["items_per_page"]=40;//每页40个
$views->pager["current_page"]=3;//定位到第3页
$views->execute();//执行
print_r($views->result);
不要问我这里为什么分页的用的代码与前面不一样,我只能说这里的机制与上面几个例子的机制是不一样的,上面的几个例子用的是preview方法,而这里用
的是execute方法,这完全是views的设计者设计出来的。当然,你可以都改为这个例子的设定,但就我发现,在大规模测试的时候,我发现
execute的性能比preview要差一点点(并不明显).
[例子七:举一反三,输出总的结果数]
看例子六,在例子六的基础上,加上var_dump($views);看看输出的结果变化情况如何?在什么地方加?你自己去试吧,动手才是关键啊。
再想想,怎么输出分页的views的总的结果数。
有朋友曾经问我,这个方法能不能重写filter,我说可以,但我反问他一句,有argument放着不用,为什么要浪费时间重写filter?
[例子八:更上一层楼]
对比一下上面七个例子中的代码与这个view的源代码:view:import ,需要什么功能要用代码实现的,只需要先用viewsUI去生成一个模板的view,然后。。。。。
[应用:]
我最常用这个办法就是将drupal的数据批量修修改或者批量导出成我想要的格式。特别是批量处理,结果node_load,node_save,杀手啊
- 登录以发表评论
dashan 答复于 永久连接views_get_view_result 这个好用的很
- 登录以发表评论
dashan 答复于 永久连接