Come posso modificare il tag script reCAPTCHA in html_head
Il modulo reCaptcha aggiunge un Javascript con hook_captcha (). Voglio aggiungere un altro attributo "tipo" a questo tag di script. Non riesco a trovare un gancio per raggiungere questo obiettivo.
Ecco il codice dal recaptcha.module (riga 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 provo ad accedere al tag dello script con ad esempio hook_page_attachments_alter () o qualsiasi altro hook_preprocess_xxxx () manca. Ho anche provato ad aumentare il peso del mio modulo.
Risposte
Suggerirei di utilizzare una richiamata #process ed evitare la duplicazione del codice. Ecco come potrebbe apparire una soluzione del genere:
/**
* 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 questo sarebbe l'output:

In bocca al lupo!
Poiché hook_captcha () è un hook, puoi sovrascriverlo implementandolo nel tuo modulo personalizzato.
Finché il tuo modulo ha un peso maggiore, verrà eseguito dopo recaptcha_captcha .
Quindi, in pratica, copia tutto il codice in recaptcha_captcha e rinomina il nome della funzione in mymodule_captcha
e aggiungi type
il file #attributes
all'array e sei d'oro.
In questo raro caso, l'unico modo sembra essere quello di patchare direttamente il modulo.
Si spera che tu stia utilizzando un sito gestito dal compositore e tutto ciò che devi fare è creare una patch e farlo applicare automaticamente al compositore.