有兴趣请回顾:
三分钟上手views ,
views_embed_view ,
chdir对drupal的好处drupal 8都快出beta了,所以决定更新一下这里的代码,使之适合drupal 7\8,
[views的本质:SQL]
忽略drupal , 我们看一段常规的SQL: select * from node where nid>12
回到views 管理办面
views的几个大块:
fields:对应 select 什么字段
filter、context:对应where语法
sort:对应sort by
relationship:对应left join
views在D7后,设置一下DEBUG功能,就能在后台输出SQL用于排错!
[成为views编程高手]
1.想自由的编排由view生成出来的数据,就像使用
node_load一样?想自由地给view传参,并输出在页面的任意地方?想自由的控制当前view所显示的分页\分页数\页上多少个结果?同一个view在一个地方输出10行/页在另一个地方输出20行/页?
2.所有上面的功能以及viewsUI没法做到的都能由views scriptly完成,主要用到就是views_get_view这个API
3.将从例子来说,不要深究下面的代码每一行是什么意思,没意义,COPY就好,然后再改改,注意我注释的地方:
————————以下是drupal 7 views_get_view————————
drupal 7 的views_get_view很简单,比drupal 6更加简洁了
鼠标创建一个views,就叫promotion,设置一定的fields等略过
$view = views_get_view(‘promotion’);
$view->set_display(‘default’);
//$view->set_arguments(array($tid)); //如果你有设置argument的话
// change the amount of items to show
$view->set_items_per_page(15); //每页15个
$view->pre_execute();
$view->execute();
$result=$view->result;
//可以不用 $result = $view->result; 而用 //$views->render(); 或者 $view->preview();得到结果
$rows=$view->total_rows;//一共有多少条记录,用于手动制作分页
$currentpage=$view->query->pager->current_page;//当前页面
print_r($result);
就这样,这么简单的代码就能完成views的定制了,drupal7在views的开发上更加简单了。
高级点,改filter
$view = views_get_view(“map”);
$view->set_display(‘business_map_vertical’);
$view->exposed_input['field_locality_tid_i18n'] = ‘Any’;//将views filter expose的id放这里,默认值放后
$view->exposed_input['field_business_category_tid_i18n'] = ‘Any’;//我做了两个默认
//或者:$view->set_exposed_input(array());
$view->preview = TRUE;
$view->pre_execute();
$output = $view->display_handler->preview();
$view->post_execute();
print $output;
同一个内容的三种实现方法:
views_embed_view
views_get_view_result
views_get_view
示例:views的高级应用,如何显示不连续的多个nid,即怎么实现where in另一个高级示例:下面的示例混合了views_get_view以及views preview输出强大的HTML
$view = views_get_view(“crawler”);
$view->exposed_input['froms'] = ‘taobao2′;
$result.=$view->preview(“default”, array());
这么做有什么好处?当你要接单,要自定义查模版的时候,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_result/7 ---一个很有意思的函数
https://api.drupal.org/api/drupal/functionshttps://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下只有下面的代码:
<?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;
//可以不用 $result = $view->result; 而用 //$views->render(); 或者 $view->preview();得到结果//下面的代码与views无关的
print_r($results);
//print $results[2][node_title];//只输出第三个结果的node的标题
$views=NULL;$results=NULL;
?>
(输出时要结果好看,请查看输出的HTML源码)
所以,你会发现这是一个PHP的array.
如果你要输出views的第三行的结果的TITLE的话:去掉print地行的注释即可
OK,举一反三吧,试试将viewtest这个views变得尽可能复杂,然后输出结果看看!
[例子二:传入argument(参数)]
只输出termId=3的结果,就是说输出那些是属于分类ID是3的结果,注意,只比上面的多了加红的一行:
新建argviews.php,只有下面几行代码:
<?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;
//可以不用 $result = $view->result; 而用 //$views->render(); 或者 $view->preview();得到结果
print_r($results);
//print $results[2][node_title];//只输出第三个结果的node的标题
$views=NULL;$results=NULL;
?>
输出结果的结构与例子一的情况一样,只是结果变了
[例子三:控制输出的结果数]
目前我们的结果都是只输出10个结果,我现在想输出50个结果。
对比例子一:只增加了加红的两行
新建viewsnum.php,只输入下面的几行
<?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,杀手啊
[总结及废话,不喜略过]
我用views最多的地方就是“
我最常用的两个views函数”,跟大家share一下
views用到这地步了,还能说不牛X吗?
我认为就应用来说,已经是很牛X了,但还需要考虑很多,
例如性能,原始的views的性能是大家都知道的,不是一般的差,而是很差!特别是当你的数据库到达10万条的时候(没到这数就别操心了),
很多高手都建议你就不要用views的分页功能了,这也限制了drupal在国内的发展,但事实上真是这样吗?
其实views的性能是可以改得非常好的,关键在
Hook_views_data, 以后有机会的话将会介绍,另外则是drupal的cache也很灵活。如果你真的很认真看完“
db_query”这一节,你会发现,为何我还要用views呢?就目前来说,如果是不需要views帮我生成HTML的时候,我只是用views来帮我生成SQL,然后我几乎都是只用db_query了。当然,当需要定位分页时,我会毫不犹豫的使用例子六的形式(数据库大了再结合drupal cache和hook_views_data),views生成的HTML还是挺不错的,我喜欢,特别是引入的tpl.php特别灵活。
hope it helps更多drupal anywhere文章:
drupal 6~8 快速上手文章总结,drupal开发必看QQ群:227600605关于drupal anywhere \ drupal commerce\ drupal crawler cms
email:
lihaojiang_1@163.combuy me a coffee:http://me.alipay.com/trackself
Comments
I have tried this function,
I have tried this function, but it returning entire data that fetching by query even it is not displaying in views display. How can get the exact row of data that displaying in views display?
This function returns array
This function returns array of node objects.
drupal_render and render only accepts array to display HTML format.
So to display the views result use views_get_view, below is the example of using views_get_view to display views result in drupal format:
$view = views_get_view('VIEW_NAME');
$view->set_display('DISPLAY_ID');
$view->pre_execute();
$view->execute();
print $view->render();
Cheers...
How can pass multiple
How can pass multiple arguments in views_get_view_result function in drupal 6?
来自 https://api.drupal.org/api/views/views.module/function/views_get_view_result/6
function views_get_view
views_get_view(
$view_name)views_get_view($name, $reset = FALSE)
views_get_view($name, $reset = FALSE)
Get a view from the database or from default views.
This function is just a static wrapper around views::load(). This function isn't called 'views_load()' primarily because it might get a view from the default views which aren't technically loaded from the database.
Parameters
$name: The name of the view.
$reset: If TRUE, reset this entry in the load cache.
Return value
view A reference to the $view object. Use $reset if you're sure you want a fresh one.
File
Code
Comments
Be carefull when using this method
Since this method is considered to be "private" it comes with a manual. Please make sure to call
before calling
Failing to do so will end up with notices being thrown which in turn will avoid Drupal caching the page. This might also have an effect on external caching services such as Varnish.
For reference, here is how this method can be used to modify results before outputting it to the page:
More useful methods can be found by looking at the API docs:http://api.drupal.org/api/views/includes!view.inc/class/view/7
When the requirement is to just add a view (block) programmatically then please have a look at:http://api.drupal.org/api/views/views.module/function/views_embed_view/7
Are you sure pre_execute() will work?
Hi, I'm not too sure the function $view->pre_execute() is necessary for the later versions of Drupal because I got the White Screen of Death when I used that function. However, using all the other lines you provided worked great. Here's what my code looks like:
<?php
$view = views_get_view('my_view');
$view->set_current_page(5);
$view->set_items_per_page(10);
$view->execute();
$objects = $view->result;
?>
Hi
I am using same code in my texonomy.term.tpl file but getting Error like
Call to a member function set_display() on a non-object
Please Help.
Your $view object has not
Your $view object has not been created. Try to check the name of the view and try again.
Set exposed filters programmatically
How to set exposed filters programmatically within views_get_view function (D7)? Thanks.