web-dev-qa-db-fra.com

Comment passez-vous une valeur booléenne à wp_localize_script

Quelle est la meilleure façon de passer unbooleandans wp_localize_script à partir de ce que je peux voir, tout est interprété comme des chaînes.

J'ai un formulaire d'options utilisateur d'arrière-plan pour un plugin. Lorsque les valeurs sont renvoyées, je les utilise pour un script jQuery. L'un d'entre eux est un booléen. L'utilisateur sélectionne true ou false dans une liste déroulante. booléens) "true" ou "false" qui échouera ce paramètre dans le script.

<?php

  $options = get_option('ng_slicknavmenu');
  // Add PHP plugin variables to the $params[] array to pass to jQuery
  $data = array (
    'ng_slicknav_menu'         => $options['ng_slicknav_menu'],
    'ng_slicknav_parent_links' => $options['ng_slicknav_parent_links'], // this is a boolean true/false
    'ng_slicknav_speed'        => $options['ng_slicknav_speed'] ,
  );

  // Pass PHP variables to jQuery script
  wp_localize_script( 'slickinit', 'phpVars', $data );

Voici comment je le fais en ce moment dans mon fichier js init

   if( phpVars.ng_slicknav_parent_links === "true" )
        $links = true;
    else
        $links = false;


jQuery(document).ready(function($){

ng_slicknav_speedInt = parseInt(phpVars.ng_slicknav_speed, 10);

jQuery(document).ready(function($) {
            $(phpVars.ng_slicknav_menu).slicknav({
                allowParentLinks: $links,
                duration:ng_slicknav_speedInt,
            });
            });
 });

Mais y a-t-il une meilleure façon?

J'ai essayé des solutions de Passer des valeurs booléennes avec wp_localize_script ...

'ng_slicknav_parent_links' => ($options['ng_slicknav_parent_links']) ? true : false,

et

'ng_slicknav_parent_links' => (bool)$options['ng_slicknav_parent_links'],

Mais la réponse ne fonctionne pas. Les réponses ici pour les deux résultent en une chaîne de "1" pour les deux valeurs qui est incorrecte.

2
neilgee

Malheureusement, wp_localize_script() jette tous les scalaires (types simples) dans le tableau passé en chaînes (puis exécute html_entity_decode() sur eux?!), De sorte que les conversions mentionnées par la réponse que vous citez & @TheDeadMedic seront tronquées "1"/"" si booléen, et nombre si ints, ce qui ne fonctionnera pas avec les plugins javascript qui exigent des valeurs exactes.

Une solution consiste à placer vos arguments dans un tableau à l'intérieur du tableau transmis, pour éviter qu'ils ne soient mutilés, par exemple:

$data = array (
    'ng_slicknav' => array(
        'menu'         => $options['ng_slicknav_menu'],
        'parent_links' => (bool) $options['ng_slicknav_parent_links'],
        'speed'        => (int) $options['ng_slicknav_speed'] ,
    ),
);

Et vous pouvez les référencer directement dans votre javascript:

jQuery(document).ready(function($) {
    $(phpVars.ng_slicknav.menu).slicknav({
        allowParentLinks: phpVars.ng_slicknav.parent_links,
        duration:phpVars.ng_slicknav.speed,
    });
});
5
bonger