我正在尝试创建两个视图。
View-1是一个节点列表。
View-2是与每个节点关联的图库。
我基本上想要将View-1中的节点标题传递给程序化View-2,这样View-1中的每一行都会加载View-2(结果集按View-1的标题过滤!)
我对这种方法感到困惑。这应该发生在自定义模块,预处理函数还是它们的某种组合中?
我遇到了很多 - 希望将参数从主视图传递到显示每个结果的辅助视图。
我意识到这个问题有点笼统,但我很好奇有更多经验的人会如何解决这个问题。
答案 0 :(得分:1)
我之前在D6上做过这个,基本上我只是为我的View-1创建了一些模板tpl.php文件。
在我的View-1模板中显示输出(视图 - 视图 - 现在D7中的default.tpl.php) 我只是以编程方式查找View-1为此行传递或返回的值。
在每个行的情况下,您将检查View-1返回哪个节点,然后我在View-1模板中添加代码,以编程方式加载基于当前View-1行的View-2(即你的情况下的节点。)
有意义吗?响应迟了5个月,但我正在寻找复习,看看现在是否有更好的方法在D7中做到这一点。
更新:
刚刚在我的新D7安装上执行此操作。作为一个例子,我将解释它与我的Ubercart实现的关系。
Ubercart,安装后,它的主要“主页”商店页面位于mysite.com/catalog
此页面加载后会调用由Ubercart创建的名为uc_catalog_terms
的视图。它是一个基于分类的视图,它所做的就是获取所有目录分类法类别并进行渲染。
E.g
作为服装店,当您导航到mysite.com/catalog
时,您在此页面上看到的所有网格结构都是:
毛衣衬衫牛仔裤
我的要求是我需要在此页面上显示商店目录类别/条款,但 ALSO 显示每个目录类别下面的类别/术语的3个随机产品(图像)。
E.g
毛衣
随机毛衣#1 - 随机毛衣#2 - 随机毛衣#3
牛仔裤
随机吉恩#1 - 随机吉恩#2 - 随机吉恩#3
这是如何完成的?
我创建了自己的全新自定义视图(没有页面或锁定,只是默认),它根据分类术语ID参数抓取3个随机产品图像,并呈现3个链接的产品图像。我会称之为自定义视图random_catalog_items
。如果15
是毛衣的术语ID,当使用参数15
调用此视图时,它将仅渲染3个随机链接的毛衣产品图像。
我现在回到uc_catalog_terms
视图并创建了一个views-view-fields--uc-catalog-terms.tpl.php
(行样式输出)模板文件。
此文件的默认视图版本(修改前)是:
<?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; ?>
修改后的版本:
<?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; ?>
因此,您可以在第一个View中看到,对于呈现的每一行,我都会通过可用的行结果对象$row->tid
显示当前的分类术语ID,然后我只需为每个行调用我创建的视图行,传递此术语ID作为其参数。我在那里留下了很多默认代码,但在我的视图配置中,LABELS等设置为 HIDDEN ,所以它们甚至都不会渲染。
在您的情况下,它应该非常容易适应只传递节点NID而不是分类术语ID。
VOILA一切正常!在视图中查看!希望这会有所帮助:)
从那时起,在这些View模板中加载Devel模块会有所帮助,您可以调试并通过print krumo($row)
之类的内容查看可用的变量。
答案 1 :(得分:0)
就个人而言,我会完全避免这里的观点。
使用hook_menu
定义菜单项的简单模块和两个处理所需参数的简单菜单 - 回调函数。
另一种方法是使视图知道所有自定义参数和自定义查询过滤和表。
我的(pseronal)经验法则是:
这方面的基础非常简单,而且编写和开发的次数很少,然后编写视图扩展。
/** 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。
答案 2 :(得分:0)
这听起来像是一个使用ajax回调的好机会。您可以将主视图放在页面的一部分上,就像正常一样,也可以在自定义块或其他内容中使用辅助视图。当焦点落在主要项目上时(以按钮单击或悬停或其他形式),您可以使用ajax回调使用您的参数将次要视图替换自定义块的内容。
你是否正在使用drupal 6或7?我的理解是他们这样做的方式不同。