欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

drupal anywhere 13: views_get_view,drupal开发神器,适用于drupal 6 7 8 set_arguments 有大用

shiping1 的头像

[例子二:传入argument(参数)] 这是指的是views的url参数 不是views的filter

只输出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;


?>

看这节之后,你将成为views的高手;你需要将drupal 和插件views 安装成功并会创建基本的view.
有兴趣请回顾:三分钟上手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/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下只有下面的代码:
<?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.com
buy me a coffee:http://me.alipay.com/trackself
 
Posted in drupal
Tags:   
You can follow any responses to this entry through the RSS 2.0 Feed. Both comments and pings are currently closed.

29 comments

 
 
  1. down
    Array
    (
    [0] => stdClass Object
    (
    [nid] => 2884
    [node_title] => 《Angel Beats!》高清图集-35P
    )
    [1] => stdClass Object
    楼主这样有序的结果是怎么输出的?我输出的全是连在了一起,不利于阅读。
    $views=NULL;$results=NULL;
    要是不释放结果,有坏处吗?谢谢分享
     
    • 晕,请查看源码……朋友你应该多动点手
       
    • 一般来说不释放结果没坏处的,过一段时间PHP会自动帮你释放的,只是这样的话你的内存会消耗得很快。因为我是用bluehost这个空间的,内存只有128MB,所以我比较在意内存的使用
       
  2. 塞北苍狼
    兄弟内容很好.有QQ或MSN 吗?方便交流哈
     
  3. 我印象中没有现成的模块,但我做过这方面的事情
    你需要做views hack
    就是说写一个module或者说在任意的一个*.module文件里增加一个函数,这个函数好像是hook_views xxxx
    你查查views api吧,如果你找不着,我再找找我以前的项目代码即可。
     
  4. 师父称不上,交流一下。
    1.请将你这个页面的源码粘出来,或者将这段关于views的代码粘出来
    2.你的原因多并是没有定义views object , preview 的调用一般是$viewsObjectName->preview();不能单纯写preview
     
  5. views_get_view 得到一个空数组?你的views的名字是呀
    看第一个例子:
    $views=views_get_view(“viewtest”);
    $views->preview();
    $results=$views->result;
     //可以不用  $result = $view->result; 而用 //$views->render(); 或者 $view->preview();得到结果
    你必须在执行preview()或者execute()后才会得到非空的数组
     
  6. 我极少使用action,一般都直接hook,你这个忙我帮不了了。
     
  7. 晕,这不是drupal的问题,是你没引用这个FUNCTION的页面,或者根本没有加载这个模块的INC文件
    你要fixed的话,直接include一下这个文件就好了。
     
  8. dreamour
    谢谢分享。我有一见事情,请楼主不惜赐教。
    在views expose中,当用户提交搜索查询后(地标的列表),我想把另外一个view也更新(Gmap),即触发一个事件,怎么做?
     
  9. 像是你的服务器配置问题,测试的时候用XAMPP就好了,我也喜欢用这软件
     
  10. yanyan
    对于[例子一:用代码输出views]的代码:我在测试时出现下面的错误:
    Fatal error: Call to a member function preview() on a non-object in D:\P8-Server\local\AppServ\www\drupal619\apitest\printviews.php on line 8
    在网上找了一些资料也不知道如何解决?请师父帮忙看一下吧,,
     
  11. 追忆
    你好,
    为什么我使用例子一的时候,创建views后, 通过views_get_view取出的views的result为一个空数组,array() ?
     
  12. 你要明白第二个的“分类ID是3”是什么意思,你要在手动生成views界面的时候选择分类为argument。经测试,代码无问题。
     
  13. 你要明白第二个的“分类ID是3”是什么意思,你要在手动生成views界面的时候选择分类为argument。
    经测试,代码无问题。
    你的问题应该在于,你还不会在界面上手动创建views
     
  14. 对views全盘搜索一下不就行了?
     
  15. 追忆
    谢谢你了, 我知道了。
    再帮我个忙。
    就是我定义了一个action,但是没有定义具体他作用于什么样的类型。
    然后我又在其他的模块里面去修改它。
    我的代码是:
    function user_action_info() {
    return array(
    ‘user_block_user_action’ => array(
    ‘type’ => ‘user’,
    ‘description’ => ’321′,
    ‘configuration’ => FALSE,
    ‘hooks’ => array()
    ),
    ‘user_block_ip_action’ => array(
    ‘type’ => ‘user’,
    ‘description’ => ’123′,
    ‘configuration’ => FALSE,
    ‘hooks’ => array()
    ),
    );
    }
    function beep_action_info_alter(&$info) {
    if(isset($info['user_block_user_action']['hooks']['comment'])) {
    array_merge($info['user_block_user_action']['hooks']['comment'],
    array(‘insert’));
    }else {
    $info['user_block_user_action']['hooks']['comment'] = array(‘insert’);
    }
    }
    然后我刷新后,我的页面就报错了:
    Fatal error: Call to undefined function user_access() in D:\company\php-workspace\drupal2\modules\node\node.module on line 2026
     
  16. 追忆
    哦, 很感谢。
    那你在用drupal开发的时候,碰到过fatal error: call to undefined function … 这一类的错么?
    我经常遇到, 然后就解决不了。 只能把drupal重新装过。
     
  17. 追忆
    谢谢高手了。
     
  18. 追忆
    师傅您好!
    为什么我的drupal安装到出现滚动条的时候就停止了,等多长时间都一样。
    但是数据库中的表已经建好了。。。
     
  19. 文章太给力了!
     
  20. 布兰卡
    自从第一次读到你的博客,就爱不释手。
    关于views api,有个问题,按照你的方法,都实验了,只能获得node的数据,cck的数据好像得不到。不知道是哪里问题?
     
  21. 布兰卡
    不要回复了,上面的问题解决了。
    原来要把文件放到跟index.php一个目录才可以。
    虽然使用了你的chdir,还是不行滴。移动个目录就好了
     
  22. 我用Drupal6学习的,但从第二个开始就都做不出来。而且第一个里面print $results[2][node_title];也没有输出,后来改成了print $results[2]->node_title;才可以。
    刚接触drupal,还望指点…
     
  23. 我想知道views_get_view()这个函数的源文件是哪个,我想看看。请指教,谢谢。
     
  24. stu
    $views->display_handler->set_option(‘use_pager’,1);
    $views->set_display(‘default’);
    $views->display_handler->set_option(‘items_per_page’, 50);为啥我这几个输入没效果,也没报错·
     
  25. stu
    之前的问题解决了·views_get_view如何改变view内容? 还有node_api和界面添加内容相比如何提高了速度。
来自  http://www.trackself.com/archives/641.html


function views_get_view_result

6 views.moduleviews_get_view_result($name, $display_id = NULL)
7 views.moduleviews_get_view_result($name, $display_id = NULL)
  • Get the result of a view.

*

  •  

Parameters

string $name:

  • The name of the view to retrieve the data from.
  • @param string $display_id
  • The display id. On the edit page for the view in question, you'll find
  • a list of displays at the left side of the control area. "Defaults"
  • will be at the top of that list. Hover your cursor over the name of the
  • display you want to use. An URL will appear in the status bar of your
  • browser. This is usually at the bottom of the window, in the chrome.
  • Everything after #views-tab- is the display ID, e.g. page_1.

...: Any additional parameters will be passed as arguments.

  • @return
  • array
  • An array containing an object for each view item.

File

 

./views.module, line 1623
Primarily Drupal hooks and global API functions to manipulate views.

 

Code

function views_get_view_result($name, $display_id = NULL) {
  $args = func_get_args();
  array_shift($args); // remove $name
  if (count($args)) {
    array_shift($args); // remove $display_id
  }

  $view = views_get_view($name);
  if (is_object($view)) {
    if (is_array($args)) {
      $view->set_arguments($args);
    }
    if (is_string($display_id)) {
      $view->set_display($display_id);
    }
    else {
      $view->init_display();
    }
    $view->pre_execute();
    $view->execute();
    return $view->result;
  }
  else {
    return array();
  }
}

Comments

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 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 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

5 views.moduleviews_get_view($view_name)
6 views.moduleviews_get_view($name, $reset = FALSE)
7 views.moduleviews_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.

18 calls to views_get_view()
1 string reference to 'views_get_view'

File

 

./views.module, line 1606
Primarily Drupal hooks and global API functions to manipulate views.

 

Code

function views_get_view($name, $reset = FALSE) {
  if ($reset) {
    $cache = &drupal_static('ctools_export_load_object');
    if (isset($cache['views_view'][$name])) {
      unset($cache['views_view'][$name]);
    }
  }

  ctools_include('export');
  $view = ctools_export_crud_load('views_view', $name);
  if ($view) {
    $view->update();
    return $view->clone_view();
  }
}

Comments

Since this method is considered to be "private" it comes with a manual. Please make sure to call

<?php
 $view->pre_execute() 
?>

before calling

<?php
 $view->execute(); 
?>

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:

<?php
  $view = views_get_view('view_name');
  $view->set_display('view_block_name');
  $view->set_arguments(array($tid));
  // change the amount of items to show
  $view->set_items_per_page(4);
  $view->pre_execute();
  $view->execute();
  print $view->render();
?>

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

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;
?>

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 been created. Try to check the name of the view and try again.

 

How to set exposed filters programmatically within views_get_view function (D7)? Thanks.


普通分类: