1

背景:
我正在构建一个网站,该网站使用网络表单从用户那里收集信息,使用收集的值来计算一些结果,然后使用结果从列表中选择建议的解决方案(或抱怨程序无法提供从提供的参数中回答)。

当用户点击提交时,计算通过 hook_webform_submission_presave() 完成,我将计算结果存储在 $_SESSION 数组的元素中(容量数字,用负值编码,用于上述“无法提供答案”的情况),以及带有建议型号的字符串(如果有解决方案)。在 web 表单提交发生后,Drupal 将链接到一个新的(标准内容页面),(我原本打算)将由 hook_page_alter() 更改。所以,现在解决问题:

我曾计划让 hook_page_alter 去寻找纯内容页面的元素(字符串 xxxxxx),并用该字符串替换页面实际应该包含的内容(关于所选解决方案的注释,或要求用户或者再试一次,或者通过电子邮件或其他方式与我们联系)。

问题:
hook_page_alter() 接收到一个庞大的数组 $page 来操作。我正在操作的部分是 $page['content],但即使在其中,我的触发字符串 ('xxxxxx') 也经常出现(21 次,当我转储 $page['content']['system_main ']['节点'][$nid])。

更有趣的是(对我来说,无论如何)如果我用下面的代码替换字符串 'yyyyyy' 为 'xxxxxx' (是的,它很丑,但是已经很晚了,我在这里处于完全调试模式:

    $xx = $page['content']['system_main']['nodes'][5]['body']['#object'];
    $yy = $xx->body['und'][0]['value'];
    $zz = str_replace("xxxxxx", "yyyyyy", $yy);
    $xx->body['und'][0]['value'] = $zz;
    // dpr() below is like print_r, from the handy dandy Drupal 'devel' module
    dpr($page['content']['system_main']['nodes'][5]);

查看 dpr() 的输出并查看实际渲染的内容很有趣 - 通过这个小小的替换,xxxxxx 的出现次数减少到 11,并且(更有趣!)我发现 yyyyyy 出现了 8 次。不幸的是,页面呈现不受我替换的影响 - xxxxxx 仍然存在。

我有兴趣找到的是 $page 数组元素中的哪一个是被渲染的 - 我想明天我会通过消除来弄清楚(当我找到它时会发布)。你们那里的巫师有什么提示吗?

另外,我应该考虑一种更“drupal-esque”的方式来完成这件事吗?

第二个问题更具有学术兴趣——我是如何更改 $page 数组这一部分的一个元素的: $xx->body['und'][0]['value'] = $zz; 被复制到我找到的其他 7 个地方?洞察力?注释 ?(请保持礼貌——我已经使用 Drupal 大约 6 个月了,但编写软件的时间比这要长得多)

提前致谢,

德里克

4

1 回答 1

0

要在标题中回答您的问题,它$page本身就是。 hook_page_alter有一个参数,该参数是其第一级的区域数组。因此,如果您将参数命名为 $page,$page['content']则内容区域是内容(不要与此内容混淆)部分。其他元素也是内容)。

hook_page_alter如果不查看您的整个功能,很难说出确切的问题是什么。

作为旁注,我建议不要在这种情况下使用该钩子。对我来说,听起来应该有一个更好(在服务器资源使用方面更便宜)的解决方案。Webform 是另一个 Drupal 表单,所以所有 hook_form_alter 的东西都适用于此。您可以将额外的提交处理程序添加到现有的网络表单,甚至是菜单注册表中的新页面(使用通配符保留一些路径或一组路径),因此对于您的案例 IMO 确实不需要使用hook_page_alter

PS:听听LullaBot 的这个播客

于 2012-12-20T21:54:54.263 回答