这就是我根据您的描述来解决这个问题的方法。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 的了解的理论,但它应该让你走上正确的道路。