背景:
我正在构建一个网站,该网站使用网络表单从用户收集信息,使用收集的值来计算某些结果,然后使用结果从列表中选择建议的解决方案(或者抱怨程序无法提供答案)提供的参数)。
当用户点击提交时,计算通过hook_webform_submission_presave()完成,我将计算结果存储在$ _SESSION数组的元素中(容量数字,编码为“无法提供答案”的负值)上面提到的情况),如果有解决方案,则带有建议型号的字符串。在Webform提交发生后,Drupal将链接到一个新的(标准内容页面),这个(我原本打算)将被hook_page_alter()更改。那么,现在问题是:
我原本打算让hook_page_alter去寻找普通内容页面的元素(字符串xxxxxx),并用该字符串替换页面实际应该包含的内容(关于所选解决方案的注释,或者询问错误消息)用户要么再试一次,要么通过电子邮件或其他方式与我们联系。
问题:
hook_page_alter()接收一个庞大的数组$ page来操纵。我正在操作的部分是$ page ['content],但即使在那之内,我的触发字符串('xxxxxx')经常出现(21次,当我转储$ page ['content'] ['system_main '] [' 节点] [$ NID])。
更有意思的是(对我来说,无论如何)是如果我用'xxxxxx'将字符串'yyyyyy'替换为以下代码(是的,它很难看,但它已经很晚了,而且我已经完全调试了模式在这里:
$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,并且(甚至更有趣!)我发现8次出现yyyyyy 。不幸的是,页面渲染不受我的替换影响 - xxxxxx仍然存在。
我感兴趣的是找到哪个$ page数组元素是被渲染的元素 - 我想明天,我想通过消除(并在我找到它时发布)。那些巫师的暗示在哪里?
此外,是否有更多的“drupal-esque”方式,我应该考虑做这整个事情?
第二个问题是学术兴趣更多 - 我如何改变$ page数组的这一部分的一个元素: $ xx-> body ['und'] [0] ['value'] = $ zz; 被复制到我发现的其他7个地方? 见解?评论 ? (礼貌,请 - 我已经和Drupal一起工作了大约6个月,但是编写软件的时间比这长得多)
提前致谢,
德里克
答案 0 :(得分:0)
要在标题中回答您的问题,它本身就是$page
。
hook_page_alter
有一个参数,该参数是第一级的区域数组。
因此,如果您将参数命名为$ page,则$page['content']
是内容区域的内容(不要与此相混淆)
内容“部分。其他元素也是内容。”
如果没有看到整个hook_page_alter
函数,很难说出确切的问题。
作为旁注,我建议不要在这种情况下使用该钩子。对我来说,听起来应该有更好的(并且在服务器资源使用方面更便宜)解决方案。
Webform是另一个Drupal表单,因此所有hook_form_alter内容都适用于此处。
您可以在现有的webform中添加额外的提交处理程序,甚至可以在菜单注册表中添加新页面(使用通配符保留一些路径或一组路径),因此实际上不需要为您的IMO案例使用hook_page_alter
。