【问题标题】:Dynamically changing a portion of a Drupal page based on clicking links from a view根据单击视图中的链接动态更改 Drupal 页面的一部分
【发布时间】:2014-08-01 15:17:26
【问题描述】:

简介

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

期望的结束状态

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

当前设计

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

在此页面上,我为我要显示的内容(级别 1)添加了一个面板。此外,我添加了一个 VIEW 面板,它仅显示与内容(级别 1)关联的子内容(级别 2)图标。这行得通。

尝试的解决方案

我不知道如何显示所选子内容(2 级)图标的节点内容。我制作了一个带有适当参数的 PAGE,以准确显示我想要的内容。目的是我将 PAGE 作为面板添加到现有 PAGE 并通过重写图标链接和设置目标参数将参数传递给该 PAGE。我还没有找到在页面中嵌入页面的方法。

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

结论

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

这是我所描述的模型:

【问题讨论】:

    标签: drupal drupal-7


    【解决方案1】:

    我发现了一种非常有效的方法。

    我做了什么:

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

    2. 接下来,我为子内容图标创建了一个视图。子内容的字段之一是 Entity Reference 到内容类型 1 的特定节点。我利用 Views RelationshipViews Contextual 来利用这个引用过滤器 将我的视图的输出限制为与指定节点 ID 相关的子内容。我通过选择“Content ID”作为上下文,在 Panelizer Content 中的视图的面板设置中定义了这个节点 ID。

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

    4. 接下来,我为子内容的完整显示创建了另一个视图。我应用了与另一个视图相同的 Views RelationshipViews Contextual Filter,但是我没有在 Panelizer Content 设置中指定上下文,但我确实添加了一个 CSS ID。我在视图中添加了一个 Content Pane 并设置了窗格的名称。我还将“使用 AJAX”设置为“开启”。

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

    这设置了页面的所有结构,但我仍然必须制作一个模块来支持 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,以便显示初始内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      相关资源
      最近更新 更多