最近,我们更新了一个使用Drupal 8制作的网站。该更新是从核心8.6到8.7.8,同时所有模块也都进行了更新。这些模块中有Webform和Webform Mailchimp。
[此后,某些表单在提交表单后开始显示警告。发送电子邮件并保存表格数据。
strlen() expects parameter 1 to be string, array is given in Drupal\webform_mailchimp\Plugins\WebformHancler\WebformMailChimpHandler->postSave()
完整的错误详细信息可以在这里看到:https://prnt.sc/pn76pv
我是Drupal的新手,所以我认为我不应该进入源文件并自己进行更改。关于如何解决此问题的任何建议?
感谢您的帮助
从错误消息中,我们可以看到strlen()
收到一个数组而不是一个字符串:
strlen()期望参数1为字符串,数组在[...] WebformMailChimpHandler-> postSave()中给出([[...]的第320行]
在此模块的Line 320,我们已致电mailchimp_subscribe()
:
mailchimp_subscribe($configuration['list'], $email, array_filter($mergevars, 'strlen'), $configuration['interest_groups'], $double_optin);
错误是由作为第三个参数传递的内容引起的:array_filter($mergevars, 'strlen')
,表示$mergevars
-预期是要由strlen
过滤的字符串数组-包含一个数组而不是一个字符串一点。
如何修复$mergevars
?
我们可以看到它是从配置中加载的,然后被实现了一些alter hook的模块所改变:
$mergevars = Yaml::decode($configuration['mergevars']);
// Allow other modules to alter the merge vars.
// @see hook_mailchimp_lists_mergevars_alter().
$entity_type = 'webform_submission';
\Drupal::moduleHandler()->alter('mailchimp_lists_mergevars', $mergevars, $webform_submission, $entity_type);
\Drupal::moduleHandler()->alter('webform_mailchimp_lists_mergevars', $mergevars, $webform_submission, $this);
因此,您应该能够看到正在发生的事情,并在自己的hook_alter中进行修复:
function MODULE_mailchimp_lists_mergevars_alter(&$mergevars, &$webform_submission, &$entity_type) {
# debug/fix $mergevars
}
function MODULE_webform_mailchimp_lists_mergevars_alter(&$mergevars, &$webform_submission, &$WebformMailChimpHandler) {
# debug/fix $mergevars
}
此问题很可能是由于其中一个alter hook中的mergevars
错误更改引起的。注意变量通过引用传递。
如果您发现$mergevars
实际上是模块alter钩子内的字符串数组(看起来似乎还不错),则意味着另一个在您的after行动中的contrib模块(@see模块优先级)导致了问题。