Comment puis-je modifier la balise de script reCAPTCHA dans html_head

Aug 22 2020

Le module reCaptcha ajoute un Javascript avec hook_captcha (). Je souhaite ajouter un autre attribut "type" à cette balise de script. Je ne trouve pas de crochet pour y parvenir.

Voici le code du recaptcha.module (ligne 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',
            ],
          ],
        ],
      ];

Quand j'essaye d'accéder à la balise de script avec par exemple hook_page_attachments_alter () ou tout autre hook_preprocess_xxxx (), il manque. J'ai également essayé d'augmenter le poids de mon module.

Réponses

1 StefanosPetrakis Nov 16 2020 at 18:06

Je suggère d'utiliser un rappel #process et d'éviter la duplication de code. Voici à quoi pourrait ressembler une telle solution:

/**
 * 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;
}

et ce serait la sortie:

Bonne chance!

NoSssweat Aug 22 2020 at 17:36

Puisque hook_captcha () est un hook, vous pouvez le remplacer en l'implémentant dans votre propre module personnalisé.

Tant que votre module a un poids plus élevé, il fonctionnera après recaptcha_captcha .

Copiez donc fondamentalement tout le code dans recaptcha_captcha et renommez le nom de la fonction mymodule_captchaet ajoutez-le typeau #attributestableau et vous êtes en or.


Dans ce cas rare, le seul moyen semble être de patcher directement le module.

J'espère que vous utilisez un site géré par composer et que tout ce que vous avez à faire est de créer un correctif et de demander à composer automatiquement de l'appliquer pour vous.