Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    E' possibile eseguire una funzione javascript attraverso la header() ?

    Ciao ragazzi,
    mi spiego subito: sto realizzando un piccolo gestionale web based per un azienda, in una certa pagina ho un form molto complesso (nel senso di lungo da compilare) che mi richiede una miriade di controlli che faccio 1. da JS durante la compilazione e 2. successivamente nella pagina PHP dove poi tutti i dati vengono inviati al db.

    Arrivati alla pagina php, se sfortunatamente uno dei controlli mi risulta non valido devo ovviamente far tornare l'utente al form e notificare cosa è successo.
    Quello che mi preme però è non perdere i dati che l'utente aveva già inserito.

    All'inizio avevo pensato di reindirizzare l'utente ad una pagina javascript che simulasse l'evento "indietro" del browser. Tuttavia, siccome il form può essere letteralmente "modificato" dall'utente, nel senso che egli può aggiungere/sottrarre/nascondere un sacco di campi attraverso delle funzioni js, tornando indietro si vanno a perdere comunque tutti questi dati (o i campi) inseriti dinamicamente e che non sono di default del form.

    Dopo qualche ricerca però ho trovato un interessante "trucco", questo:
    codice:
    //nella pagina php, se viene trovato un errore:
    header("Location: javascript://history.go(-1)");
    exit;
    che in teoria dovrebbe anche questo simulare il tasto indietro del browser, in pratica invece mi fa rimanere nella stessa pagina! Quindi il form rimane ESATTAMENTE come era, il che è perfetto!

    Facendo dei test ho notato che praticamente qualsiasi funzione JS io passi a quell'header() ottengo sempre lo stesso risultato, ovvero la pagina rimane ferma dov'era (per ora sono riuscito a fare test solo con google chrome ma spero ardentemente che questo trucchetto sia crossbrowser ).

    Il problema che nasce ora quindi è capire come notificare all'utente qual'è il dato errato così che possa intervenire e rivalidare il form.
    Quindi volevo sapere se esiste un modo, oltre che per fermare la pagina come la funzione sopra citata, di far eseguire un js (ad esempio un semplice alert)

    Spero di essere stato chiaro, attendo con ansia qualche risposta, grazie!
    Vincenzo

  2. #2
    Secondo me l'unico modo corretto di procedere è quello di conservare tutti i valori passati in input e ripassarli alla pagina contenente il form e rivalorizzare i vari campi a codice.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  3. #3
    Dovresti impostare in maniera diversa il tuo script.
    Una soluzione molto comune e valida è quella di usare un'unica pagina (magari con una statica html a cui reindirizzare l'utente quando ha inviato i dati con successo).

    Codice PHP:
    <?php
    if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['nome_tasto_submit']) ){
        
    //ha inviato il form. Verifica i dati.
        
    $errori = array();
        if(
    strlen($_POST['username']) < 5){
            
    $errori['username'] = 'Il campo username deve contenere almeno 5 caratteri.';
        }
        if(
    $_POST['password'] != $_POST['conferma_password']){
            
    $errori['password'] = 'Le due password non coincidono';
        }
        
    //ecc.
        //se il form è corretto, ovviamente l'array $errori è rimasto vuoto...
        
    if(!empty($errori)){
            
    //esegue quello che deve eseguire (ad esempio inserire l'username nel database)
            
    header("Location: pagina-di-success.html");
            die();
        }
        else{
            
    //inizializza i dati con quelli già passati via POST, cosi puo pre-impostare il form
            
    $dati_precedenti $_POST;
        }
    }
    else{ 
    //non ha ancora inviato il form. Inizializza i dati con valori vuoti. Volendo, se ad esempio è una pagina di modifica dati, è possibile inizializzare questi valori con quelli ricavati dal database.
        
    $dati_precedenti = array('username'=>'Infocurci''citta'=>'Roma''professione'=>'Programmatore php'); //ecc ecc
    }
    //se arriva fin qui, vuol dire che NON è passato per l'header() inviato in occasione del form inviato con successo. Può quindi procedere direttamente alla stampa del form.
    ?>
    <form>
        <input type="text" name="username" size="20" value="<?php echo $dati_precedenti['username'];?>" />
        <?php
            
    if(isset($errori['username'])){
                echo 
    '<span class="error">'.$errori['username'].'</span>';
            }
        
    ?>
    </form>

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913
    Codice PHP:
    echo "<script>history.go(-1);</script>";exit; 
    No

  5. #5
    Grazie per le risposte, avevo pensato anche io ad un approccio sul modello del vostro Infocurci e satifal, ovvero di salvare i dati in qualche modo (io pensavo alle sessioni visto che la pagina non è la stessa) per poi ripristinarli, il problema però è che

    1. ripristinare il form diventerebbe un pochino complesso dato che come vi dicevo è "incrementabile" da parte dell'utente, non impossibile certo però mi scoraggia un po' l'idea di mettermici giù dico la verità :P
    2. nel form sono presenti anche campi multipli di tipo "file" e sinceramente non saprei proprio come fare a ripristinare anche quelli..

    Per questo optavo per una soluzione più "veloce", che mi sembrava anche la più valida, ovvero fare in modo che la pagina al quale punta il form si "blocchi" facendomi quindi rimanere nella stessa, notificandomi però cosa non va..

    Comunque con tutti i controlli JS che faccio prima dell'effettivo submit, il caso in cui la pagina php mi trovi un errore è davvero bassissimo quindi lo scopo di questa domanda è più didattico che altro (:
    sarò curioso di leggere altre risposte se ce ne saranno, grazie!

  6. #6
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    La butto lì: e se tu mandassi in richiesta asincrona i campi da validare dal form al PHP prima di eseguire in toto l'azione lato server?

    Una cosa tipo:
    - durante la compilazione controlli u dati con JS (niente interazione con il server;
    - al click sul submit del form, una chiamata ajax allo script di controllo sul server;
    - gestione delle risposte server sul client, se tutto OK blindi i campi e mostri un pulsante conferma inserimento che mandi tutto al server, altrimenti mostri i messaggi di errore

  7. #7
    Quote Originariamente inviata da clasku Visualizza il messaggio
    La butto lì: e se tu mandassi in richiesta asincrona i campi da validare dal form al PHP prima di eseguire in toto l'azione lato server?

    Una cosa tipo:
    - durante la compilazione controlli u dati con JS (niente interazione con il server;
    - al click sul submit del form, una chiamata ajax allo script di controllo sul server;
    - gestione delle risposte server sul client, se tutto OK blindi i campi e mostri un pulsante conferma inserimento che mandi tutto al server, altrimenti mostri i messaggi di errore
    effettivamente è un'ottima idea, terrò presente per il futuro!

  8. #8
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    rimane comunque il fatto che un controllo lato server lo devi prevedere anche dopo la conferma dati, visto che qualche furbetto potrebbe tentare di modificare i dati in modo poco "ortodosso"

    però in quel caso, errore fatale e lancio di missili verso l'IP del furbo

  9. #9
    Aahahahaha hai ragione! Ma nel qual caso succedesse allora lo reindirizzo al modulo completamente vuoto e mando un alert "ti sta bene, godooo!" :P :P

    Comunque dovrei fare un ultima domanda, in realtà è un altro argomento ma non ritengo ci sia bisogno di aprire una nuova discussione quindi ne approfitto al volo (:

    è possibile creare una nuova variabile nella clausola HAVING di una query mysql?

    Nella select ho diversi campi, e alcuni li calcolo io tra cui lo STATUS di una determinata commessa, ovvero una percentuale che mi viene fuori dalla proporzione tra i giorni totali di lavoro per una commessa e i giorni "mancanti", ovvero da oggi fino alla data di scadenza.

    Nella select ho quindi 2 campi "dinamici" fatti così:
    codice:
    ....
    DATEDIFF(com.data_scadenza, com.data_inizio) as giorni_totali,
    DATEDIFF(com.data_scadenza, DATE(NOW())) as giorni_mancanti
    ....
    il calcolo dello status è " STATUS = 100 - ((100*giorni_mancanti)/giorni_totali) ", siccome però nella "testa" della query il calcolatore non tiene conto dei nomi delle variabili non posso usare le diciture "giorni_totali", "giorni_mancanti" quindi stavo pensando di mettere nella HAVING a fine query una cosa tipo
    codice:
    SELECT ....(qui mi ricavo giorni_totali e _mancanti)....
    FROM ....
    
    GROUP BY ...
    HAVING (100 - ((100*giorni_mancanti)/giorni_totali)) as status
    ...Si può fare?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.