Como posso alterar a tag de script reCAPTCHA em html_head
O módulo reCaptcha adiciona um Javascript com hook_captcha (). Quero adicionar outro atributo "tipo" a esta tag de script. Não consigo encontrar um gancho para conseguir isso.
Aqui está o código do recaptcha.module (linha 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',
],
],
],
];
Quando tento acessar a tag do script com, por exemplo, hook_page_attachments_alter () ou qualquer outro hook_preprocess_xxxx (), ela está faltando. Também tentei aumentar o peso do meu módulo.
Respostas
Eu sugeriria usar um retorno de chamada #process e evitar duplicação de código. Esta é a aparência dessa solução:
/**
* 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;
}
e esta seria a saída:
Boa sorte!
Como hook_captcha () é um gancho, você pode sobrescrevê-lo implementando-o em seu próprio módulo personalizado.
Enquanto seu módulo tiver peso maior, ele será executado após recaptcha_captcha .
Então, basicamente, copie todo o código em recaptcha_captcha e renomeie o nome da função para mymodule_captchae adicione o typeao #attributesarray e você estará certo.
Nesse caso raro, a única maneira parece ser patchear o módulo diretamente.
Com sorte, você está usando um site gerenciado pelo composer e tudo o que precisa fazer é criar um patch e fazer com que o composer o aplique automaticamente para você.