¿Cómo puedo alterar la etiqueta de script reCAPTCHA en html_head?
El módulo reCaptcha agrega un Javascript con hook_captcha (). Quiero agregar otro atributo "tipo" a esta etiqueta de secuencia de comandos. No puedo encontrar un gancho para lograr esto.
Aquí está el código del recaptcha.module (línea 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',
],
],
],
];
Cuando intento acceder a la etiqueta del script con, por ejemplo, hook_page_attachments_alter () o cualquier otro hook_preprocess_xxxx (), falta. También intenté aumentar el peso de mi módulo.
Respuestas
Sugeriría usar una devolución de llamada #process y evitar la duplicación de código. Así es como podría verse una solución de este tipo:
/**
* 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;
}
y esta sería la salida:
¡Buena suerte!
Dado que hook_captcha () es un gancho, puede anularlo implementándolo en su propio módulo personalizado.
Siempre que su módulo tenga un peso mayor, se ejecutará después de recaptcha_captcha .
Así que, básicamente, copie todo el código en recaptcha_captcha y cambie el nombre de la función aymymodule_captcha agréguelo typea la #attributesmatriz y estará listo .
En este raro caso, la única forma parece ser parchear el módulo directamente.
Con suerte, estás usando un sitio administrado por el compositor y todo lo que tienes que hacer es crear un parche y que el compositor lo aplique automáticamente.