Drupal 6 上传模块参考警告
我正在测试一个新的Drupal项目构建,并在使用Upload模块将文件上传到节点时发现了这个奇怪的错误。这个错误产生了很多出现在屏幕上的警告信息(在这个过程中警告了我的项目经理),但似乎对模块的实际功能或上传的文件没有影响。本质上,上传文件时会产生以下错误。
warning: Parameter 2 to og_user_roles_form_alter() expected to be a reference, value given in \includes\common.inc on line 2892. warning: Parameter 2 to customerror_form_alter() expected to be a reference, value given in \includes\common.inc on line 2892. warning: Parameter 2 to date_form_alter() expected to be a reference, value given in \includes\common.inc on line 2892. warning: Parameter 2 to date_timezone_form_alter() expected to be a reference, value given in \includes\common.inc on line 2892. warning: Parameter 2 to location_node_form_alter() expected to be a reference, value given in \includes\common.inc on line 2892. warning: Parameter 2 to og_form_alter() expected to be a reference, value given in \includes\common.inc on line 2892. warning: Parameter 2 to wysiwyg_form_alter() expected to be a reference, value given in \includes\common.inc on line 2892. warning: Parameter 2 to searchfilter_form_alter() expected to be a reference, value given in \includes\common.inc on line 2892. warning: Parameter 2 to og_access_form_alter() expected to be a reference, value given in \includes\common.inc on line 2892.
请注意,此列表会因您安装的模块而异。
在互联网上进行了一些搜索后,似乎这是PHP5.2时代遗留下来的问题,而且这个错误现在才开始出现,因为我经常使用PHP5.3。问题是upload.module将"array()"作为参数之一传递给drupal_alter(),然后将其传递给当前挂接到显示表单的任何内容。这会导致错误看起来像是来自多个其他模块,而不是上传本身。
解决方案是更改/modules/upload/upload.module文件,使其不传递array()参数。这是upload.module导致此错误的文件中的代码。
//呈现用于输出的表单。 $form += array( '#post' => $_POST, '#programmed' => FALSE, '#tree' => FALSE, '#parents' => array(), ); drupal_alter('form', $form, array(), 'upload_js'); $form_state = array('submitted' => FALSE); $form = form_builder('upload_js', $form, $form_state); $output = theme('status_messages') . drupal_render($form);
将此代码更改为以下内容,主要更改是drupal_alter()函数调用。
//呈现用于输出的表单。 $form += array( '#post' => $_POST, '#programmed' => FALSE, '#tree' => FALSE, '#parents' => array(), ); $empty_form_state = array(); $data = &$form; $data['__drupal_alter_by_ref'] = array(&$empty_form_state); drupal_alter('form', $data, 'upload_js'); $form_state = array('submitted' => FALSE); $form = form_builder('upload_js', $form, $form_state); $output = theme('status_messages') . drupal_render($form);
这Drupal.org在http://drupal.org/node/925580上的支持请求中都有详细说明,以及一个允许自动进行这些更改的补丁。从支持请求看来,这并没有进入Drupal6.20,但有望进入下一次更新。
这个问题最近(2011年1月)在CCK模块中得到修复,补丁中使用的方法最初是为了解决该模块中的同类问题而创建的。