Programmatic Views in Drupal 7
我正在尝试创建两个视图。
View-1是节点列表。
View-2是与每个节点关联的图像库。
我基本上想将节点标题从View-1传递给编程的View-2,以便View-1中的每一行都将加载View-2(结果集按View-1的标题过滤!) 。
我对这种方法感到困惑。这是否应该在自定义模块,预处理功能或它们的某种组合中发生?
我经常遇到这个问题-希望将参数从主视图传递到显示每个结果的辅助视图。
我意识到这个问题有点笼统,但是我很好奇拥有更多经验的人们将如何解决这个问题。
我之前在D6上已经做到了,基本上我只是为View-1创建了几个模板tpl.php文件。
在我的View-1模板内以显示输出(现在D7中是views-view--default.tpl.php)
我只是以编程方式找到此行的View-1传递或返回的值。
在您的情况下,您需要检查每一行以查看View-1返回了哪个节点,然后在View-1模板中添加代码以基于当前View-1行以编程方式加载View-2(即您的节点。)
有道理吗?回复晚了5个月,但我一直在寻找更新,并且正在D7中查看是否有更好的方法可以执行此操作。
更新:
这是在我新安装的D7上完成的。作为示例,我将解释它与我的Ubercart实现之间的关系。
安装后,Ubercart的主"主页"商店页面位于
此页面在加载后会调用由Ubercart创建的名为
例如
作为服装店,当您导航到
毛衣衬衫牛仔裤
我的要求是我需要在此页面上显示商店目录类别/术语,但是ALSO还在每个目录类别下方显示3个来自该类别/术语的随机产品(图像)。
例如
毛衣
随机毛衣#1-随机毛衣#2-随机毛衣#3
牛仔裤
随机吉恩#1-随机吉恩#2-随机吉恩#3
这是如何实现的?
我创建了自己的全新自定义视图(没有页面或锁,仅是默认视图),该视图基于分类术语ID参数获取了3个随机产品图像,并渲染了3个链接的产品图像。我将此自定义视图称为
我现在返回到
此文件的默认视图版本(修改前)为:
1 2 3 4 5 6 7 8 9 10 | <?php foreach ($fields as $id => $field): ?> <?php if (!empty($field->separator)): ?> <?php print $field->separator; ?> <?php endif; ?> <?php print $field->wrapper_prefix; ?> <?php print $field->label_html; ?> <?php print $field->content; ?> <?php print $field->wrapper_suffix; ?> <?php endforeach; ?> |
修改后的版本变为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php foreach ($fields as $id => $field): ?> <?php if (!empty($field->separator)): ?> <?php print $field->separator; ?> <?php endif; ?> <?php print $field->wrapper_prefix; ?> <?php print $field->label_html; ?> <?php $title = str_replace('/','-',strtolower($field->raw)); print '<img src="'.drupal_get_path('theme','my_theme').'/images/catalog/'.$title.'-header.png" />'; print '<hr style="width: 100%; background: #000; height: 2px; margin-top: 3px;"/>'; // get the taxonomy term ID $tid = $row->tid; // render the 3 random items if ($random_products = views_get_view('random_catalog_items' )) { print $random_products->execute_display('default', array($tid)); } ?> <?php print $field->wrapper_suffix; ?> <?php endforeach; ?> |
因此,您可以在第一个视图中看到,对于呈现的每一行,我都会通过可用的行结果对象-
在您的情况下,应该很容易适应,只需传递节点NID而不是分类术语ID。
一切顺利!在视图中查看!希望这会有所帮助:)
自从在这些View模板内进行调试之后,您便可以调试并查看可用的变量,例如
这听起来像是一个使用ajax回调的好机会。您可以像平常一样在页面的一部分上拥有主视图,而在自定义块或其他内容中可以拥有副视图。当焦点集中在主要项目上(以按钮单击或悬停等形式)时,您可以使用ajax回调使用自变量用辅助视图替换自定义块的内容。
您是否正在使用drupal 6或7?我的理解是他们这样做的方式不同。
就我个人而言,我将完全避免在此发表意见。
使用
替代方法是使视图了解所有自定义参数和自定义查询过滤表。
我的(经验性)经验法则是:
- 如果确定您会在以后的项目中多次重复使用该代码,那么值得使用视图附加组件。
- 如果您要使用views-interface进行更多设置,则可以一次性设置(一般用途),例如在编辑器/网站管理员工作流程中定义或更改视图是有道理的。
这的基础非常简单,与编写视图扩展相比,它的编码和开发可能要少得多。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | /** Implementation of hook_menu(). */ function gallery_menu() { $items = array(); $items['gallery'] = array( 'title' => 'Gallery', 'page callback' => '_gallery_list', 'access arguments' => array('access content'), ); $items['gallery/%gallery'] = array( 'title' => 'For dynamic titles, see title_callback documentation', 'page callback' => '_gallery_view', 'access arguments' => array('access content'), ); return $items; } /** Load a gallery from database. Name follows %parameter_load hook. */ function gallery_load($id) { return db_query("SELECT * FROM {galleries} WHERE id = %d", $id); } /** Render a list of galleries. */ function _gallery_list() { $html =""; $galleries = pager_query("SELECT * FROM {galleries}", 10); foreach($galleries as $gallery) { $html .= check_plain($gallery->title); //You would actually build vars here and push them to theme layer instead. } $html .= theme("pager"); return $html; } /** Load a gallery from database. Name follows %parameter_load hook. */ function gallery_load($id) { return db_query("SELECT * FROM {galleries} WHERE id = %d", $id); } /** Render a list of galleries. */ function _gallery_view($gallery) { $html =""; $images = pager_query("SELECT * FROM {images} WHERE gallery_id = %d", 10, $gallery->id); foreach($images as $image) { $html .= check_plain($image->title); //You would actually build vars here and push them to theme layer instead. } $html .= theme("pager"); return $html; } |
很显然,如评论中所述,您将另外创建一些主题函数来处理渲染,以:1)避免在模块中使用硬编码的spagetty-HTML,以及b)在创建主题时使前端程序保持其主题不变。 HTML。