首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Drupal7中的编程视图

Drupal7中的编程视图
EN

Stack Overflow用户
提问于 2011-04-13 01:37:31
回答 3查看 3.1K关注 0票数 0

我正在尝试创建两个视图。

View-1是一个节点列表。

View-2是与每个节点相关联的图片库。

我基本上希望将节点标题从View-1传递给编程式的View-2,以便View-1中的每一行都将加载View-2(结果集由View-1的标题过滤!)。

我对这种方法感到困惑。这应该发生在自定义模块、预处理函数或它们的组合中吗?

我经常遇到这种情况--想要将一个参数从主视图传递到与每个结果一起显示的次视图中。

我意识到这个问题有点笼统,但我很好奇有更多经验的人会如何处理这个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-13 03:47:24

就我个人而言,我会在这里避免所有的观点。

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

另一种方法是使所有自定义参数、自定义查询筛选和表为视图所知。

我的经验法则是:

  • 如果你确信你会在未来的项目中多次重用这些代码,那么这个视图插件是值得投资的。
  • 如果您要使用视图界面进行多次设置(通常使用),例如,在编辑器/网站管理员工作流程中定义或更改视图,这是有意义的。

这样做的基本原理非常简单,而且与编写视图扩展相比,编写代码和开发的工作量可能要少得多。

代码语言:javascript
复制
/** 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时停留在其主题中。

票数 0
EN

Stack Overflow用户

发布于 2011-09-27 21:29:19

我以前在D6上这样做过,基本上我只为我的View-1创建了几个模板tpl.php文件。

在用于显示输出的View-1模板(现在D7中是views-View--default.tpl.php)中,我只需通过编程方式找到View-1为此行传递或返回的值。

在您的示例中,在每一行上,您将检查View-1返回哪个节点,然后我将在View-1模板中添加代码,以编程方式基于当前View-1行(即,.在您的例子中。)

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

更新

这是在我新安装的D7上完成的。作为一个例子,我将解释它与我的Ubercart实现之间的关系。

安装后,优步车的主页位于mysite.com/catalog

加载此页面时,它调用由Ubercart创建的名为uc_catalog_terms的视图。它是一个基于分类法的视图,它所做的就是抓取所有的Catalog分类法类别并呈现它们。

E.g

作为一家服装店,当您导航到mysite.com/catalog时,您将在此页面看到的是一个网格结构,如下所示:

毛衣、衬衫、牛仔裤

我的要求是,我需要在此页面上显示商店目录类别/术语,但还需要在每个目录类别下面显示该类别/术语的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 (行样式输出)模板文件。

此文件的默认视图版本(修改前)为:

代码语言:javascript
复制
<?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; ?>

修改后的版本变为:

代码语言:javascript
复制
<?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; ?>

因此,正如您在第一个视图中看到的那样,对于呈现的每一行,我通过可用的行结果对象$row->tid获取当前分类术语ID,然后我简单地为每一行调用我创建的视图,并将此术语ID作为参数传递。我在其中保留了很多默认代码,但在我的视图配置中,标签等被设置为隐藏,因此它们甚至不会呈现。

在您的例子中,只传递Node而不是Taxonomy Term ID应该非常容易适应。

瞧,它都起作用了!视图中的视图!希望这能有所帮助:)

从那时起,在这些视图模板中加载Devel模块是有帮助的,您可以通过print krumo($row)之类的东西来调试和查看哪些变量可用。

票数 1
EN

Stack Overflow用户

发布于 2011-04-13 15:17:12

这听起来是一个使用ajax回调的好机会。你可以把你的主视图放在页面的某一部分,就像在普通页面上一样,在一个自定义的块或其他东西上放一个辅助视图。当焦点停留在主要项目上(以按钮单击或悬停等形式)时,可以使用ajax回调使用参数将自定义块的内容替换为次要视图。

您使用的是Drupal6还是Drupal7?我的理解是,他们做这件事的方式不同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5639328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档