1

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

简短的问题:

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

确切的场景:

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

  1. 顶部输入块,用户可以在其中输入特定公司的名称。
  2. 一个以一般内容开头的主要块(例如表格加上有关经济的最新消息等)。一旦在块 1 中选择了一家公司,这将更改为有关所选公司的新闻和表格。
  3. a side graph block displaying some relevant graphs etc. Again, when no company is chosen, this could display the general graphs (eg S&P, Dow Jones, NASDAQ), and when a company is chosen, this displays the details for the chosen company.

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

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

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

4

1 回答 1

2

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

我假设你有以下设置:

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

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

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

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

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

显示 3:** 图形块**

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

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

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

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

于 2012-09-25T16:10:22.980 回答