html_headのreCAPTCHAスクリプトタグを変更する方法
Aug 22 2020
reCaptchaモジュールは、hook_captcha()を使用してJavascriptを追加します。このスクリプトタグに別の属性「type」を追加したいと思います。これを達成するためのフックが見つかりません。
これがrecaptcha.moduleのコードです(118行目):
$captcha['form']['recaptcha_widget'] = [ '#markup' => '<div' . new Attribute($attributes) . '></div>',
'#suffix' => $noscript, '#attached' => [ 'html_head' => [ [ [ '#tag' => 'script', '#attributes' => [ 'src' => Url::fromUri($recaptcha_src, ['query' => ['hl' => \Drupal::service('language_manager')->getCurrentLanguage()->getId()], 'absolute' => TRUE])->toString(),
'async' => TRUE,
'defer' => TRUE,
],
],
'recaptcha_api',
],
],
],
];
たとえばhook_page_attachments_alter()または他のhook_preprocess_xxxx()を使用してスクリプトタグにアクセスしようとすると、スクリプトタグが表示されません。また、モジュールの重量を増やそうとしました。
回答
1 StefanosPetrakis Nov 16 2020 at 18:06
#processコールバックを使用して、コードの重複を避けることをお勧めします。これは、そのようなソリューションがどのように見えるかです。
/**
* Implements hook_element_info_alter().
*/
function my_module_element_info_alter(array &$element) { if (isset($element['captcha'])) {
$element['captcha']['#process'][] = '_custom_recaptcha_process'; } } /** * Add type attribute to recaptcha form element. * * @return array * The processed element. * * @see captcha_element_info() * @see image_captcha_element_info_alter() */ function _custom_recaptcha_process($element) {
$recatchaWidgetHtmlHead = &$element['captcha_widgets']['recaptcha_widget']['#attached']['html_head'] ?? [];
array_walk($recatchaWidgetHtmlHead, function(&$captcha_widget) {
if ($captcha_widget[1] === 'recaptcha_api') { $captcha_widget[0]['#attributes']['type'] = 'value';
}
});
return $element;
}
これが出力になります:

幸運を!
NoSssweat Aug 22 2020 at 17:36
hook_captcha()はフックであるため、独自のカスタムモジュールに実装することでオーバーライドできます。
モジュールの重みが大きい限り、recaptcha_captchaの後に実行されます。
したがって、基本的には、recaptcha_captcha内のすべてのコードをコピーし、関数名の名前をに変更して配列にmymodule_captcha
追加するtype
と、#attributes
ゴールデンになります。
このまれなケースでは、唯一の方法はモジュールに直接パッチを適用することであるように見えます。
うまくいけば、あなたはコンポーザー管理サイトを使用していて、あなたがしなければならないのはパッチを作成し、コンポーザーにそれを自動適用させることだけです。