根据其他块中的更改更改块内容



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

简短问题:

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

精确场景:

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

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

在我看来,网站是在用户的"当前上下文"中工作的。所以,也许我可以在Drupal中设置一个会话级别的变量,并根据该变量的当前值刷新所有块?

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

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

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

我假设你有以下设置:

  • 一个名为"companies"的分类词汇表,其公司名称为条款
  • 一种名为"新闻"的内容类型,其中包含有关公司。最重要的是,它需要一个分类字段可以选择与之相关的公司(将此字段称为"company_reference")
  • 一种称为"表格"(?)的内容类型。我不确定你有什么信息想要在你的"桌子"里,但同样重要的是,它有一个引用公司的分类字段。(可以是相同的字段"company_reference")

您正在寻找的大多数功能都可以使用视图模块构建。

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

显示1:输入块

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

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

显示2:**主块**

  • 将显示名称设置为有意义的名称,如"company_news">
  • FORMAT设置为您喜欢的格式(或保持原样)
  • 对于过滤器标准,添加一个"内容:类型"过滤器,并选择"新闻"one_answers"表格"内容类型
  • 高级部分,单击"上下文过滤器"旁边的"添加"。)在URL中传递上下文过滤器,我们将获取从Input块传递的值。)选择"Content:field_company_reference"作为字段,然后单击"应用">
  • 对于"过滤器值不可用时"部分,选择"提供默认值">
  • 对于"类型",选择"PHP代码",PHP代码将类似于"return isset($_GET['company']) ? $_GET['company']:false;">
  • 对于"当提供默认值的筛选器时",请选中"指定验证条件",将"Validator"设置为"Taxonomy term",检查"Companies"词汇表,对于"filter value type",请选择"term name converted to term ID">
  • 对于"如果筛选值未验证则要采取的操作",选择"显示所有结果">

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

显示3:**图形块**

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新