views_get_view

论坛: 
$view = views_get_view('promotion');  //--promotion 是指views的名称

Drupal views api 使用,让开发更加方便快捷:

最新 views_get_view_result($name, $display_id = NULL) api 函数

参数 $name : views视图名称

$display_id 显示视图id。

返回views 视图item项。


......感谢TVdrupal提供视频....抄录备忘.......


1、在需要显示的页面添加以下代码

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?>" />

Tags: 

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;

$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_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_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下只有下面的代码:

<?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源码)

点击看完整的输出的结果。
所以,你会发现这是一个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;

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帮我生成HTML的时候,我只是用views来帮我生成SQL,然后我几乎都是只用db_query

dashan 答复于

views_get_view_result($name, $display_id = NULL)
用这个获取Views的结果,然后foreach输出,自己控制每个字段的显示。
如下面的代码是从名称为news、display_id为page的view中获取结果
使用foreach将结果列出,用node_load将node的内容列出。
<?
$result = views_get_view_result('news','page');
foreach ($result as $record){
$node = node_load($record->nid);
?>
<li><a href="#<? print $node->nid; ?>"><? print $node->title; ?></a></li>
<?
}
$result=NULL;
?>
dashan 答复于