Supporto » Varie ed eventuali » Passaggio variabili da js a php

  • Risolto africano86

    (@africano86)


    Buonasera,
    sto cercando di implementare uno script che all’inserimento di determinati input inseriti dall’utente esegua una chimata ajax al server pre passare le variabili e restituire il risultato.
    Vi posto il codice che ho inserito nel file functions.php di wordpress:
    http://codepad.org/JN2m9IKA

    il file custom.js invece è questo:

    jQuery(document).ready(function($){
      $('#datiluce').submit(function(e){
          e.preventDefault();
          var dati =  $(this).serialize();
            $.ajax ({
            url: my_vars.ajaxurl,
            method: "POST",
            dataType: "html",
            data: {
              'action': 'calcolo',
              'data':'dati'
            },
            success:function(data){
              $("#risultato").html(data);
    
            },
          });
    });
    });
    

    la form è invece questa:

    <form action="" method="post" id="datiluce"  enctype="multipart/form-data">
    Costo al kW/h : <input id="costo "name="costo" required="" type="number" />
    Ore funzionam.: <input id="ore" name="ore" required="" type="number" />
    gg funzionam.: <input id="giorni" name="giorni" required="" type="number" />
    Potenza in KW : <input id="potenza" name="potenza" required="" type="number" />
    Genere :<select id="luce" name="luce" required="">
    <option selected="selected" value="Alogena">Alogena</option>
    <option value="Fluorescenza">Fluorescenza</option>
    <option value="Incandescenza">Incandescenza</option>
    </select>
    <button >Invia</button></form>
    <div id="risultato"></div>
    

    Praticamente funziona tutto tranne il passaggio delle variabili da js a php.
    Lo script mi restituisce tutti gli echo nel div risultato tranne le variabili.

    Sapete indicarmi dove sbaglio?

Stai vedendo 2 repliche - dal 1 al 2 (di 2 totali)
  • Ho corretto un pò di errori ed ho modificato il file funtions.php in questo modo:

    
    function calcolo(){
    foreach ($_POST as $key=>$valore){
    if ($key=='data')
    $str=$valore;}
    parse_str($str, $output);	
    foreach ($output as $key=>$valore){
    if($key=='costo')$costo=$valore;
    elseif($key=='ore')$ore=$valore; 
    elseif($key=='giorni')$giorni=$valore;
    elseif($key=='potenza')$potenza=$valore;
    elseif($key=='luce')$luce=$valore;
    }

    Non so, sicuramente c’è una soluzione più elegante.

    Ciao @africano86,

    Quando passi i dati serializzati al server questi come hai ben fatto devono essere riparserizzati usando appunto la funzioen parse_str, quello che ti consiglio in caso è una soluzione più simile a questa https://pastebin.com/rqmAguGJ

    Vi sono degli aspetti da considerare:

    1. Ogni richiesta al server deve essere sempre accompagnata da un nonce, nel tuo caso un nonce che poi deve essere verificato all’interno del contesto ajax.

    Quindi, intanto verificherei con wp_doing_ajax() se stiamo lavorando in contesto ajax, dopo di che verificherei il nonce che devi aggiungere allo script js, vedi https://codex.wordpress.org/Function_Reference/check_ajax_referer per info.

    2. Validazione dei dati, una volta che abbiamo confermato che la richiesta è una richiesta valida, i dati vanno validati/sanitificati, un primo step può essere l’uso delle funzioni filter_var e filter_var_array con cui puoi usare i filtri definiti in http://php.net/manual/it/filter.filters.sanitize.php per poter validare i dati, in generale trovi che se un dato non è valido il valore assegnato sarà un dato evaluato come false.

    Ulteriormente puoi anche usare funzioni custom di WordPress se devi ad esempio passare dati come email, o url particolari o html.

    3. Immagino che la quantità di markup che vuoi inviare sia irrisoria, ma in generale è buona pratica sfruttare il formato json e poi usando magari un template stampato in pagina passare i dati del json a questo template. Se vuoi a tal proposito Underscore mette a disposizione una funzione che ti permette di definire un template semplice semplice. Ad ogni modo, più comodo passare i dati sempre in json anche se devi inviare un html, in questo modo in futuro se hai necessità di aggiungere dati ti verrà più semplice.

    4. Ho aggiunto una chiamata a wp_send_json_success e wp_send_json_error appunto perchè in questo modo puoi informare il client se è tutto ok o se qualcosa è andato storto (ad esempio non sei riuscito a creare l’output $html tale che potrai eseguire success  o error dell’oggetto di jQUery.

    Successivamente, andrebbe modificato dataType: "html", indataType: ‘json’`.

    Quindi la callback success dovrebbe essere una cosa del genere:

    
    success: function(data) {
        if('html' in data) {
             $("#risultato").html(data.html);
        }
    },
    

    Il codice non l’ho testato quindi potrebbe esserci qualche errore, ma è per darti l’idea di un’alternativa.

    La funzione principale da chiamare è controller che si occupa di tutto.

    • Questa risposta è stata modificata 1 settimana, 2 giorni fa da  Guido Scialfa. Ragione: Formattazione codice ed aggiunto qualche info
Stai vedendo 2 repliche - dal 1 al 2 (di 2 totali)
  • Devi essere collegato per rispondere a questo topic.