基于单击视图中的链接动态更改Drupal页面的一部分

时间:2014-08-01 15:17:27

标签: drupal drupal-7

简介

我对Drupal有点新意,所以我仍然试图了解实现动态内容的所有不同方式是如何工作的。让我解释一下我想要的最终状态并解释我尝试过的一些方法。另外,我正在使用Drupal 7。

所需的最终状态

我想要一个从URL中提取上下文参数的页面,以根据URL中的Taxonomy Term ID显示内容(级别1)。在该页面上,显示来自所选内容节点的字段,并且视图在图标网格中显示相关联的子内容(级别2)。当点击子内容(级别2)图标之一时,页面的另一区域用来自子内容(级别2)节点的与所选图标匹配的字段更新。此窗格应使用AJAX更新以防止页面重新加载。

当前设计

到目前为止,我所使用的是一个PAGE,它使用上下文过滤器将分类术语ID作为参数传递给URL,以显示正确的页面内容。这有效。

在此页面中,我添加了一个面板,用于显示我要显示的内容(级别1)。此外,我添加了一个VIEW面板,仅显示与内容关联的子内容(级别2)图标(级别1)。这很有效。

尝试解决方案

我对如何显示所选子内容(级别2)图标的NODE内容感到很茫然。我使用适当的参数创建了一个PAGE,以准确显示我想要的内容。目的是我将PAGE作为面板添加到现有PAGE,并通过重写图标链接和设置目标参数将参数传递给此PAGE。我还没有找到在页面中嵌入页面的方法。

我的下一个想法是创建一个VIEW,使用上下文过滤器仅显示所选子内容的NODE内容,但我还没有找到一种方法将上下文过滤器从点击图标传递到VIEW

结论

我确信有很多方法可以做到这一点,但我正在寻找侵入性最小的方法。我的意思是,我正在寻找一种方法,使用面板,面板化工具,视图等内的现有技术(如果存在)。作为最后的手段,任何自定义代码修改都必须包含在模块中以便于维护。我不太确定我在寻找什么,因为Drupal中所有内容的术语仍然让我感到困惑,但正确方向的一些指针会很棒。

这是我正在描述的模型:Wireframe mockup of what I'm describing

1 个答案:

答案 0 :(得分:1)

我找到了一种方法,就像魅力一样。

我做了什么:

  1. 我使用 Panelizer 来修改内容类型1的节点的外观,并添加了我想要显示的字段。

  2. 接下来,我为子内容图标创建了 View 。子内容的一个字段是实体引用到内容类型1的特定节点。我利用视图关系视图上下文利用了此引用过滤以将视图的输出限制为与指定节点ID相关的子内容。我通过选择" Content ID"在 Panelizer内容中的视图的面板设置中定义了此节点ID。作为背景。

  3. 我添加了" Nid" (节点ID)字段到视图,但排除了输出。接下来,我将重写规则应用于Icon字段,并将链接路径更改为" ajax-viewer / nojs / [nid]"的绝对路径。

  4. 接下来,我创建了另一个视图,以完整显示子内容。我将相同的视图关系视图上下文过滤器应用为另一个视图,但我没有在 Panelizer内容中指定上下文设置,但我确实添加了一个CSS ID。我在视图中添加了内容窗格并设置了窗格的名称。我转过身来#34;使用AJAX"到"开"。

  5. 我为子子内容的图标创建了另一个视图,但使用了实体引用到子内容而不是内容。我也没有在 Panelizer内容中定义上下文,但确实定义了一个CSS ID。我将视图设为内容窗格并定义了窗格的名称。

  6. 这为页面设置了所有结构,但我仍然需要创建一个模块来支持AJAX调用。我引用了this page这个想法。但是,我为第二个视图制作了第二个辅助函数。在Sean的例子中,必须更改视图调用(我使用过)以匹配视图。

    return views_embed_view ('machine-name-of-view','name-of-content-pane-in-view', $nid);
    

    由于一个函数只能返回一个值,我稍微修改了ajax_link_response()函数...

    function ajax_link_response($type = 'ajax', $nid = 0) {
      /* These next two lines are different */
      $sub-content-output = _ajax_reader_load_noder_sub_content($nid);
      $sub-sub-content-output = _ajax_reader_load_noder_sub_sub_content($nid);
      if ($type == 'ajax') {
        $commands = array();
        /* These next two lines are different. The # and id= must match the CSS IDs set in Panelizer Content. */
        $commands[] = ajax_command_replace('#sub-content', '<div id="sub-content">' . $sub-content-output . '</div>');
        $commands[] = ajax_command_replace('#sub-sub-content', '<div id="sub-sub-content">' . $sub-sub-content-output . '</div>');
        $page = array(
          '#type' => 'ajax',
          '#commands' => $commands
        );
        ajax_deliver($page);
      }
      else {
        /* These next three lines are different. Same as above with the CSS IDs. */
        $sub-content-output = '<div id="sub-content">' . $sub-content-output . '</div>';
        $sub-sub-content-output = '<div id="sub-sub-content">' . $sub-sub-content-output . '</div>';
        $output = $sub-content-output + $sub-sub-content-output;
        return $output;
      }
    }
    

    我做的最后一件事是在Sean的例子中没有包含_init()函数,因为视图在我设置它之后就已经激活了AJAX。 包括_init()函数导致我的表单上的AJAX中断。

    这种设置就像一个魅力。我做的最后一件事是在 Views Contextual Filter 中为子内容和子子内容指定默认节点ID,以便显示初始内容。