根据另一个块的更改更改块内容

时间:2012-09-08 14:02:56

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

我是经验丰富的Java / C ++程序员,但对Drupal / PHP来说却是全新的。

简短问题:

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

完全情景:

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

  1. 顶部输入块,用户可以在其中输入特定公司的名称。
  2. 一个主要块,它以一般内容开头(例如表格加上有关经济的最新消息等)。一旦在块1中选择了公司,这将更改为关于所选公司的新闻和表格。
  3. 一边图块显示一些相关图表等。再次,当没有选择公司时,这可以显示一般图表(例如S& P,Dow Jones,NASDAQ),以及何时公司选择后,将显示所选公司的详细信息。
  4. 我看到它的方式,网站在用户的“当前上下文”中工作。那么,也许我可以在Drupal中设置会话级变量,并根据此变量的当前值刷新所有块?

    但是,我不知道如何实现这一目标,最好的方法是什么? (AJAX?分类法?)

    非常欢迎任何指针,提示,建议,示例和示例代码。

1 个答案:

答案 0 :(得分:2)

这就是我根据你如何描述它来解决这个问题的方法。视图模块正在处理大部分功能。

我假设你有以下设置:

  • 一个名为“#34;公司"公司名称为 术语
  • 一种名为" News"的内容类型,其中包含有关的新闻信息 公司。最重要的是,它需要一个分类领域 可以选择与之相关的公司(让我们称之为#34; company_reference")
  • 内容类型名为" Tables"(?)。我不确定你的信息 想要在你的"表"中,但它最重要的是有一个 分类学领域参考公司。 (可以是相同的字段" company_reference")

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

我会创建一个视图(让我们称之为"公司数据")。视图将有三个不同的显示,每个显示类型为" 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 view name} - {your display name} .tpl.php")。点击"显示输出"并复制它列出的PHP。 (这是视图的默认PHP视图)。
  • 在文本编辑器/ IDE(无论您使用什么)中粘贴复制的PHP代码,并使用您记下的模板名称将其保存在自定义主题中。编辑PHP并注释掉或删除标有&#34; <?php if ($rows): ?>...<?php endif; ?>&#34;的部分。 (这将从显示中删除返回的内容)

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

显示2:**主要区块**

  • 将显示名称设置为有意义的内容,例如&#34; company_news&#34;。
  • FORMAT 设置设置为您喜欢的(或保持原样)
  • 对于 FILTER CRITERIA ,添加&#34;内容:类型&#34;过滤并选择您的&#34;新闻&#34;和&#34;表&#34;内容类型。
  • 高级部分,点击&#34;添加&#34;旁边的&#34;上下文过滤器&#34;。 )在URL中传递上下文过滤器,我们将获取从Input块传递的值。)选择&#34;内容:field_company_reference&#34;作为字段并单击&#34;应用&#34;
  • 表示&#34;当过滤器值不可用时#34;部分选择&#34;提供默认值&#34;
  • for&#34; Type&#34;选择&#34; PHP代码&#34;并且PHP代码将是这样的&#34; return isset($_GET['company']) ? $_GET['company']:false;&#34;
  • 对于&#34;当过滤器可用时提供默认值&#34;,选中&#34;指定验证标准&#34;,设置&#34;验证器&#34;到&#34;分类学术语&#34;,检查&#34;公司&#34;词汇和&#34;过滤值类型选择&#34;术语名称转换为术语ID&#34;
  • for&#34;如果过滤器值未验证,则执行操作&#34;选择&#34;显示所有结果&#34;

要查看,此视图显示将显示一个列出&#34; news&#34;和&#34;表&#34;内容。如果GET变量&#34;公司&#34;传递(从输入块),然后将过滤此块的内容以仅显示与该块关联的内容。

显示3:**图块**

我不完全确定要在此块中显示哪些数据(或者更确切地说它来自哪里),但是如果您将其设置为我描述的设置主块它将按公司过滤(使用相同的上下文过滤器和具有公司分类标准参考字段的内容)。

这种方法的一个不同之处在于,当用户将公司输入到输入块时,它需要重新加载页面。如果您想避免这种情况,那么您可以进行以下更改;

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

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