【问题标题】:Change block content based on changes in another block根据另一个块中的更改更改块内容
【发布时间】:2012-09-08 14:02:55
【问题描述】:

我是经验丰富的 Java/C++ 程序员,但对 Drupal/PHP 完全陌生。

小问题:

如何根据特定块的输入刷新页面中的所有块?

具体场景:

我希望创建一个显示和行为类似于http://www.google.com/finance 的网站。我已经开始在 Drupal 7 中为此创建一个自定义模块,所以我们想要:

  1. 顶部的输入块,用户可以在其中输入特定公司的名称。
  2. 主区块,以一般内容(例如表格以及有关经济的最新消息等)开头。一旦在块 1 中选择了一家公司,这将更改为有关所选公司的新闻和表格。
  3. 侧面图表块显示一些相关图表等。同样,当没有选择公司时,这可以显示一般图表(例如标准普尔、道琼斯、纳斯达克),以及选择公司时,这将显示所选公司的详细信息。

在我看来,网站在用户的“当前环境”中运行。那么,也许我可以在 Drupal 中设置一个会话级别的变量,并根据该变量的当前值刷新所有块?

但是,我不确定如何实现这一点,最好的方法是什么? (AJAX?分类法?)

欢迎提供任何指针、提示、建议、示例、示例代码。

【问题讨论】:

  • 实际上,任何 Java 程序员都应该查看 google 的工具包,它比基于 php 的 CMS(如 drupal 等)更强大、更易于使用。

标签: drupal drupal-7 partial-page-refresh drupal-blocks


【解决方案1】:

这就是我将根据您的描述来解决此问题的方法。 Views 模块处理的大部分功能。

我假设您有以下设置:

  • 称为“公司”的分类词汇表,公司名称为 条款。
  • 一种名为“新闻”的内容类型,其中包含有关以下内容的新闻信息 公司。最重要的是,它需要一个分类字段,您可以在其中 可以选择与之相关的公司(让我们将此字段称为“company_reference”)
  • 一种名为“表格”(?) 的内容类型。我不确定你有什么信息 想要在你的“表格”中,但最重要的是有一个 参考公司的分类领域。 (可以是同一字段“company_reference”)

您正在寻找的大部分功能都可以使用 Views 模块构建。

我会创建一个视图(我们称之为“公司数据”)。该视图将具有三个不同的显示,每个显示类型为“block”。

显示 1:输入块

  • 将显示名称设置为有意义的名称,例如“user_input_block”
  • 对于这个块,保持 FORMAT 设置不变。
  • 对于 FIELDS 设置,只需具有“内容:标题”(不 对这个块来说真的很重要)。
  • 对于 FILTER CRITERIA 设置,添加一个过滤器并选择您的 “company_reference”字段,将其设置为自动完成,公开过滤器 访问者并(在“更多”部分下)更改其过滤器身份 到“公司”。
  • 对于 PAGER 设置,将其设置为显示特定数量的项目并将其设置为“1”。 (这将限制此块检索的数据)
  • 高级 部分下,更改“机器名称”以便有意义,例如“user_input_block”
  • 仍然在高级部分点击“主题:信息”。这将显示您可以为此视图拥有的不同自定义模板文件的列表。对于“显示输出”,写下列表中的最后一个模板建议,它将类似于“views-view--company-data--user-input-block.tpl.php”(“views-view--{your查看名称}--{您的显示名称}.tpl.php")。单击“显示输出”并复制它列出的 PHP。 (这是视图的默认 PHP 视图)。
  • 在文本编辑器/IDE(无论您使用什么)中粘贴复制的 PHP 代码,并使用您记下的模板名称将其保存在您的自定义主题中。编辑 PHP 并注释掉或删除“<?php if ($rows): ?>...<?php endif; ?>”部分(这将从显示中删除返回的内容)

因此,要查看刚刚创建的视图显示,将(使用自定义模板)显示一个只有一个字段的块,当用户输入公司名称时,它将自动完成。然后它将提交表单并将其作为 GET 变量传递给当前 url (www.yoursite.com/yourpage?company=users company")。

显示 2:** 主块**

  • 将显示名称设置为有意义的名称,例如“company_news”。
  • FORMAT设置设为您喜欢(或保持原样)的任意设置
  • 对于 FILTER CRITERIA,添加“Content:type”过滤器并选择“新闻”和“表格”内容类型。
  • 高级部分点击“上下文过滤器”旁边的“添加”。 )在 URL 中传递了一个上下文过滤器,我们将获取从 Input 块传递的值。)选择“Content: field_company_reference”作为字段并单击“应用”
  • 对于“当过滤器值不可用时”部分选择“提供默认值”
  • 对于“类型”选择“PHP 代码”,PHP 代码将类似于“return isset($_GET['company']) ? $_GET['company']:false;
  • 对于“提供默认值的过滤器可用时”,选中“指定验证条件”,将“验证器”设置为“分类术语”,检查“公司”词汇表,并为“过滤器值类型选择”术语名称转换为术语 ID”
  • 对于“如果过滤器值未验证要采取的措施”,请选择“显示所有结果”

要查看,此视图显示将显示一个列出“新闻”和“表格”内容的块。如果(从输入块)传递了 GET 变量“company”,则该块的内容将被过滤以仅显示与该块关联的内容。

显示 3:** 图形块**

我不确定你想在这个块中显示什么数据(或者更确切地说它来自哪里)但是如果你像我描述的那样设置它 主块它将按公司过滤(使用具有公司分类参考字段的相同上下文过滤器和内容)。

这种方法的一个区别是,当用户在输入块中输入公司时,它需要重新加载页面。如果您想避免这种情况,则可以进行以下更改;

  • 对于 主块图形块,不要使用上下文过滤器,而是为公司参考字段使用常规过滤器(与输入块中设置的设置相同) .对于高级部分下的这两个块,将“使用 AJAX”设置为“是”,并使用自定义 CSS 隐藏暴露的过滤器。
  • 使用自定义模块(或使用您的自定义主题)向页面添加额外的 JS。让 输入块 中的字段触发 JS,当用户在其中输入一个值时,JS 将该值复制到其他块的公开(但隐藏)字段中,触发 Drupal 重新加载他们通过 AJAX 与传递的过滤器。

我还没有测试过任何这些,它只是基于我对 Drupal 的了解的理论,但它应该会让你走上正确的道路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2020-10-29
    • 1970-01-01
    • 2020-12-14
    • 2021-10-04
    相关资源
    最近更新 更多