2011-04-12 71 views
0

我试图创建两个视图。Drupal 7中的编程视图

View-1是一个节点列表。

视图 - 图2是与每个节点相关联的图像库。

我基本上想将节点标题从View-1传递给编程式View-2,这样View-1中的每一行都会载入View-2(结果集由View-1的标题过滤! )。

我对这种方法感到困惑。如果这发生在自定义模块,预处理函数或其组合中?

我碰上这个有很多 - 想从主视图,与每个结果显示次视图传递参数。

我意识到问题有点一般,但我很好奇,如何与更多的经验,人们会解决这个问题。

回答

0

就我个人而言,我会在这里一起避免看法。

使用hook_menu定义菜单项的简单模块以及处理所需参数的两个简单菜单回调函数

另一种方法是使所有的自定义参数和自定义查询的过滤和已知的意见表。

拇指我(pseronal)的规则是:

  • 如果您确定您将重新使用的代码多次在未来的项目视图,插件是值得投资的。
  • 如果您将使用views-interface进行一次性设置(一般使用),例如在编辑/网站管理员工作流程中定义或更改视图,这是有道理的。

这样做的基础很简单,而且很可能很少编码和开发,然后编写视图扩展。

/** 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)允许frontenders留在自己的创建HTML时的主题。

0

这听起来像使用一个Ajax回调的好机会。您可以在页面的一部分上显示主要视图,就像普通视图一样,在自定义块或辅助视图中显示其他视图。当焦点落在主项目上(以按钮单击或悬停的形式)时,您可以使用ajax回调来使用您的参数用辅助视图替换自定义块的内容。

您使用Drupal的6或7的呢?我的理解是,他们这样做是不同的方式。

1

我之前在D6上完成了这项工作,基本上我为View-1创建了一对夫妇模板tpl.php文件。

在我的视角1模板显示输出(视图视图 - default.tpl.php在D7现在) 我就简单编程找到此行传递或返回由View-1的值。

在你的案例中,你将检查每一行,看看View-1返回哪个节点,然后在我的View-1模板中添加代码,以编程方式根据当前View-1行加载View-2 (即你的情况下的节点)。

有意义吗? 5个月后的回应,但我正在寻找一个复习,看看现在是否有更好的方式来做到这一点在D7。

UPDATE
刚刚在我的新D7安装上做了这个。作为一个例子,我将解释它与Ubercart实现的关系。

的Ubercart,安装的时候,有它的主要“家”店铺页面位于mysite.com/catalog

本页面加载时,调用由的Ubercart创建的视图称为uc_catalog_terms。它是一个基于分类的视图,它所做的就是抓取所有的目录分类法分类并进行渲染。

作为一家服装店,当你浏览到mysite.com/catalog,你会在这个页面看到的是网格结构,如:

毛衣衬衫牛仔裤

我的要求是我需要显示此页面上的商店目录类别/条款,但显示来自每个目录类别下面的该类别/术语的3个随机产品(图像)。

例如

毛衣
随机毛衣#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; ?> 

所以你可以第一个视图中看到,对于每一行被渲染时,我得到当前的分类术语ID通过可用的行结果对象 - $row->tid显示,然后我简单地为每行调用我创建的视图,传递此术语ID作为它的参数。我在那里留下了很多默认代码,但在我的视图配置中,LABELS等设置为HIDDEN,所以它们甚至无法呈现。

在你的情况下,它应该很容易适应只传递一个节点NID而不是分类术语ID。

VOILA IT ALL WORKS!在视图中查看!希望这有助于:)

它有助于使Devel模块加载,因为在这些视图模板内部,您可以通过类似print krumo($row)的东西来调试并查看哪些变量可用。

+0

这听起来像我在找什么 - 你可以提供一个代码片段,它看起来像调用一个视图中的变量加载到不同的模板? – starsinmypockets 2011-09-27 13:39:22

+0

刚刚更新了完整的用例示例和代码。希望能帮助到你。 @starsinmypockets – 2011-09-29 16:35:26