web-dev-qa-db-fra.com

Créer son propre shortcode - écho variable php basée sur la variable JS

J'essaie de créer un shortcode simple qui me permet d'afficher une liste déroulante sur une page. Selon l'option choisie, il devrait afficher un formulaire de contact spécifique.

Le shortcode sur le backend: [formularze form = "561,559,560" name = "Form 1, Form 2, Form 3"] L'attribut "form" est le formulaire de contact 7 ID, l'attribut "name" est le nom d'une liste déroulante.

Le code:

function formularze_func( $atts ) {
$a = shortcode_atts( array(
    'form' => '',
    'name' => '',
), $atts );

$form = $a['form'];
$name = $a['name'];

$ids_array = explode(',', $form);
$names_array = explode(',', $name);

$dropdown = "<select id=\"selectForm\">";
for($i=0;$i<count($ids_array);$i++) {
    $dropdown .= "<option value=\"";
    $dropdown .= $i;
    $dropdown .= "\">";
    $dropdown .= $names_array[$i];
    $dropdown .= "</option>";    
}
$dropdown .= "</select>";

$formDiv = "<div id=\"form\"></div>";

$formDisplay = "
         <script>
        var dropdown = document.getElementById(\"selectForm\");
        var value = dropdown.options[dropdown.selectedIndex].value;
        var formId = " . json_encode($ids_array(\\\\TOTALLY STUCK HERE\\\\)) . "
        document.getElementById(\"form\").innerHTML = \"[contact-form-7 id=\"formId\"]\";
    </script> 

";


$ready = $dropdown . $formDiv . $formDisplay;

if( count($ids_array) == count($names_array) ) {
    return $ready;
} else return "Error.";
}
add_shortcode( 'formularze', 'formularze_func' );

Le code n'est peut-être pas la plus jolie du monde, je serais donc ravi de toute amélioration.

Le problème est à cet endroit - \\ TOTALLY STUCK ICI \\ Comment puis-je y transmettre la variable JS valeur ?

1
Dandy

Vous ne pouvez pas ajouter de logique pour changer de cette façon. Vous devez réagir à l'événement "front-end" de l'utilisateur avec js.

Aussi cette construction fonctionnera mal:

 document.getElementById(\"form\").innerHTML = \"[contact-form-7 id=\"formId\"]\";

Sera toujours imprimé [contact-form-7 id =\"formId \"], car js ne peut pas faire la fonction do_shortcode elle-même.

Si vous voulez faire simple (sans processus ajax), vous avez besoin de:

1) Imprimez tous les formulaires avec php et style "display: none;"

2) Ajouter un événement onchange pour select

3) Sur les options de modification, "afficher" le formulaire requis

Exemple rapide: comment imprimer des formulaires:

 $formDivs = '';
    forearch($ids_array as $i=>$id) {
      $formDivs .= do_shortcode("<div id=\"form_{$i}\" style="display: none;">[contact-form-7 id=\"{$id}\"]</div>");
    }
0
Igor Sorish