Quando unisci alcune funzionalità nette, fornite da PHP con l'intelligenza di jQuery, puoi ottenere risultati davvero interessanti. In questo tutorial creeremo un sondaggio usando PHP e XHTML, quindi useremo alcuni effetti Ajax di jQuery per eliminare la necessità di un aggiornamento della pagina e per dargli un bel po 'di animazione.
Prendiamo il nostro impostare:
Successivamente, creeremo un semplice modulo di sondaggio:
Sondaggio
Questo modulo verrà elaborato dal PHP per ora, e quando avremo il Javascript in esecuzione, da jQuery. PHP e Javascript sono progettati per estrarre l'ID opzione dal tag value.
è solo uno spazio con codifica di entità HTML, e →
è una freccia: →.
Se Javascript è disabilitato, il PHP:
Se Javascript è abilitato, il PHP:
Per il file flat DB utilizzeremo un pacchetto scritto da Luke Plant.
Innanzitutto, abbiamo bisogno di un array con i nomi e gli ID delle opzioni di sondaggio:
Il pacchetto flatfile utilizza numeri per gli identificatori di colonna, quindi consente di impostare alcune costanti per convertirle in nomi:
define ('OPT_ID', 0); define ('OPT_TITLE', 1); define ('OPT_VOTES', 2);Quando il modulo viene inviato, PHP deve sapere quale file inserire e restituire i risultati, quindi impostiamo un'altra costante:
define ('HTML_FILE', 'index.html');Dobbiamo includere flatfile.php e inizializzare un oggetto di database:
require_once ( 'flatfile.php'); $ db = new Flatfile ();I file flat sono solo file di testo memorizzati nella directory dei dati:
$ db-> datadir = 'data /'; define ('VOTE_DB', 'votes.txt'); define ('IP_DB', 'ips.txt');Se otteniamo una richiesta con il parametro del sondaggio, è la forma statica, quindi la elaboriamo. Se la richiesta ha un parametro di voto, è una richiesta Ajax. Altrimenti, restituiamo semplicemente il
HTML_FILE
.if ($ _GET ['poll'] || $ _POST ['poll']) poll_submit (); else if ($ _GET ['vote'] || $ _POST ['vote']) poll_ajax (); else poll_default ();poll_default ()
function poll_default () global $ db; $ ip_result = $ db-> selectUnique (IP_DB, 0, $ _SERVER ['REMOTE_ADDR']); if (! isset ($ _ COOKIE ['vote_id']) && empty ($ ip_result)) stampa file_get_contents (HTML_FILE); else poll_return_results ($ _ COOKIE ['vote_id']);
poll_default ()
elabora le richieste direttamente allo script senza richieste GET / POST valide.Il
globale
linea rende il$ db
oggetto disponibile nell'ambito della funzione.Lo script tiene traccia degli IP univoci per assicurarsi di poter votare solo una volta, quindi eseguiamo una query per verificare se si trova nel DB:
$ ip_result = $ db-> selectUnique (IP_DB, 0, $ _SERVER ['REMOTE_ADDR']);Se non abbiamo un cookie e la query IP risulta vuota, il client non ha ancora votato, quindi possiamo semplicemente inviare il file HTML che contiene il modulo. Altrimenti, inviamo semplicemente i risultati:
if (! isset ($ _ COOKIE ['vote_id']) && empty ($ ip_result)) stampa file_get_contents (HTML_FILE); else poll_return_results ($ _ COOKIE ['vote_id']);poll_submit ()
function poll_submit () global $ db; opzioni globali $; $ id = $ _GET ['poll'] || $ _POST [ 'poll']; $ id = str_replace ("opt", ", $ id); $ ip_result = $ db-> selectUnique (IP_DB, 0, $ _SERVER ['REMOTE_ADDR']); if (! isset ($ _ COOKIE ['vote_id']) && empty ($ ip_result)) $ row = $ db-> selectUnique (VOTE_DB, OPT_ID, $ id); if (! empty ($ row)) $ ip [0] = $ _SERVER ['REMOTE_ADDR']; $ db-> insert (IP_DB, $ ip); setcookie ("vote_id", $ id, time () + 31556926); $ new_votes = $ row [OPT_VOTES] +1; $ db-> updateSetWhere (VOTE_DB, array (OPT_VOTES = > $ new_votes), nuovo SimpleWhereClause (OPT_ID, '=', $ id)); poll_return_results ($ id); else if ($ options [$ id]) $ ip [0] = $ _SERVER ['REMOTE_ADDR'] ; $ db-> insert (IP_DB, $ ip); setcookie ("vote_id", $ id, time () + 31556926); $ new_row [OPT_ID] = $ id; $ new_row [OPT_TITLE] = $ opzioni [$ id] ; $ new_row [OPT_VOTES] = 1; $ db-> insert (VOTE_DB, $ new_row); poll_return_results ($ id); else poll_return_results ($ id);
poll_submit ()
prende la forma di sottomissione, controlla se il cliente ha già votato, e quindi aggiorna il DB con il voto.Queste linee ottengono l'ID dell'opzione selezionata e impostate
$ id
ad esso:$ id = $ _GET ['poll'] || $ _POST [ 'poll']; $ id = str_replace ("opt", ", $ id);Dobbiamo verificare se l'opzione è ancora nel DB:
$ row = $ db-> selectUnique (VOTE_DB, OPT_ID, $ id);Se è nel DB (risultato non vuoto), dobbiamo eseguire un
updateSetWhere ()
. Se non lo è, dobbiamo fare uninserire()
:if (! empty ($ row)) $ new_votes = $ row [OPT_VOTES] +1; $ db-> updateSetWhere (VOTE_DB, array (OPT_VOTES => $ new_votes), nuovo SimpleWhereClause (OPT_ID, '=', $ id)); poll_return_results ($ id); else if ($ options [$ id]) $ new_row [OPT_ID] = $ id; $ new_row [OPT_TITLE] = $ opzioni [$ id]; $ new_row [OPT_VOTES] = 1; $ db-> insert (VOTE_DB, $ new_row); poll_return_results ($ id);In ogni caso, dobbiamo inserire l'IP nel DB e impostare un cookie (scade tra un anno):
$ ip [0] = $ _SERVER ['REMOTE_ADDR']; $ db-> insert (IP_DB, $ ip); setcookie ("vote_id", $ id, time () + 31556926);poll_return_results ()
function poll_return_results ($ id = NULL) global $ db; $ html = file_get_contents (HTML_FILE); $ results_html = "$% Per cento\ n "; $ results_html. ="$% Per cento\ n "; else $ results_html. ="Risultati del sondaggio
\ n\ n "; $ rows = $ db-> selectWhere (VOTE_DB, nuovo SimpleWhereClause (OPT_ID,"! = ", 0), -1, nuovo OrderBy (OPT_VOTES, DECENDING, INTEGER_COMPARISON)); foreach ($ rows as $ row) $ total_votes = $ row [OPT_VOTES] + $ total_votes; foreach ($ rows as $ row) $ percent = round (($ row [OPT_VOTES] / $ total_votes) * 100); if (! $ row [OPT_ID] == $ id) $ results_html. = "
- ". $ row [OPT_TITLE]."
". $ row [OPT_TITLE]." Voti totali: ". $ Total_votes".
poll_return_results ()
genera i risultati del sondaggio, prende il file HTML, sostituisce il modulo con i risultati e restituisce il file al client.
Per prima cosa, prendiamo il file HTML e impostiamo $ html
ad esso:
$ html = file_get_contents (HTML_FILE);
Successivamente, iniziamo la struttura HTML dei risultati:
$ results_html = "$% Per cento\ n ";$% Per cento\ N ";Risultati del sondaggio
\ n\ N ";
Per creare l'HTML dei risultati dobbiamo ottenere tutte le righe (opzioni) dal DB ordinate per numero di voti:
$ rows = $ db-> selectWhere (VOTE_DB, new SimpleWhereClause (OPT_ID, "! =", 0), -1, new OrderBy (OPT_VOTES, DECENDING, INTEGER_COMPARISON));Abbiamo anche bisogno dei voti totali per calcolare le percentuali:
foreach ($ rows as $ row) $ total_votes = $ row [OPT_VOTES] + $ total_votes;Successivamente, calcoliamo la percentuale di voti che l'opzione corrente ha:
foreach ($ rows as $ row) $ percent = round (($ row [OPT_VOTES] / $ total_votes) * 100);L'HTML per i risultati sarà un elenco di definizioni (
) in stile CSS per creare grafici a barre:
$ results_html. = "- ". $ row [OPT_TITLE]."
Inoltre, dovremmo controllare se l'opzione corrente è quella scelta dal cliente e cambiare il colore:
if (! $ row [OPT_ID] == $ id) else $ results_html. = "". $ row [OPT_TITLE]."
Qui, aggiungiamo un conteggio totale dei voti e chiudiamo i tag html:
$ results_html. = "Voti totali: ". $ Total_votes".
Questa è una regex che trova il sondaggio-container L'ultimo passaggio in questa funzione è sostituire il modulo di sondaggio con i risultati utilizzando la regex e restituire il risultato: Ci sono alcune linee di codice che sono diverse da Le altre due linee selezionano l'intero DB e lo restituiscono come JSON: Questo CSS definisce i risultati restituiti da PHP o Javascript. Il Javascript intercetterà il pulsante di invio, invierà il voto con Ajax e animerà i risultati. Innanzitutto, alcune variabili globali. Dovresti riconoscere i primi tre dal PHP. Ora abbiamo bisogno di una funzione jQuery ready che viene eseguita al caricamento della pagina: All'interno di tale funzione registriamo il gestore per il pulsante di votazione che verrà eseguito Dobbiamo anche verificare se i risultati Se abbiamo un cookie dovremmo saltare direttamente alla generazione dei risultati perché l'utente ha già votato. Per fare ciò abbiamo bisogno di eliminare il modulo di sondaggio, ottenere l'id dal cookie, prendere i risultati dal PHP e passarli a Innanzitutto, dobbiamo impedire l'azione predefinita (invio del modulo): Successivamente, otteniamo l'ID dall'opzione attualmente selezionata: Ora che abbiamo l'ID, possiamo elaborarlo. Per iniziare, dissolviamo il modulo di polling e configuriamo una funzione anonima come callback che viene eseguita quando la dissolvenza è completa. Le animazioni non mettono in pausa lo script, quindi accadono cose strane se non lo fai in questo modo. Dopo che è scomparso, possiamo cancellare il modulo dal DOM usando In questo caso, jQuery ha alcune altre funzioni di scelta rapida, tra cui L'ultima cosa da fare è impostare il cookie: Voti totali: "+ total_votes +" Per prima cosa, impostiamo la percentuale sul testo dell'elemento accanto alla barra che è il Quindi ci assicuriamo che il $ results_regex = '/
$ return_html = preg_replace ($ results_regex, $ results_html, $ html); stampa $ return_html;
poll_ajax ()
function poll_ajax () global $ db; opzioni globali $; $ id = $ _GET ['vote'] || $ _POST [ 'voto']; $ ip_result = $ db-> selectUnique (IP_DB, 0, $ _SERVER ['REMOTE_ADDR']); if (vuoto ($ ip_result)) $ ip [0] = $ _SERVER ['REMOTE_ADDR']; $ db-> insert (IP_DB, $ ip); if ($ id! = 'none') $ row = $ db-> selectUnique (VOTE_DB, OPT_ID, $ id); if (! empty ($ row)) $ new_votes = $ row [OPT_VOTES] +1; $ db-> updateSetWhere (VOTE_DB, array (OPT_VOTES => $ new_votes), nuovo SimpleWhereClause (OPT_ID, '=', $ id)); else if ($ options [$ id]) $ new_row [OPT_ID] = $ id; $ new_row [OPT_TITLE] = $ opzioni [$ id]; $ new_row [OPT_VOTES] = 1; $ db-> insert (VOTE_DB, $ new_row); $ rows = $ db-> selectWhere (VOTE_DB, new SimpleWhereClause (OPT_ID, "! =", 0), -1, new OrderBy (OPT_VOTES, DECENDING, INTEGER_COMPARISON)); stampa json_encode ($ rows);
poll_ajax ()
accetta una richiesta dal Javascript, aggiunge il voto al DB e restituisce i risultati come JSON.poll_submit ()
. Il primo controlla se Javascript vuole solo i risultati, e nessun voto dovrebbe essere contato:if ($ id! = 'none')
$ rows = $ db-> selectWhere (VOTE_DB, new SimpleWhereClause (OPT_ID, "! =", 0), -1, new OrderBy (OPT_VOTES, DECENDING, INTEGER_COMPARISON)); stampa json_encode ($ rows);
CSS
.graph width: 250px; posizione: relativa; a destra: 30 px; .bar-title position: relativo; fluttuare: a sinistra; larghezza: 104 px; altezza della linea: 20px; margin-right: 17px; font-weight: bold; allineamento del testo: giusto; .bar-container position: relative; fluttuare: a sinistra; larghezza: 110 px; altezza: 10px; margine: 0px 0px 15px; .bar-container div background-color: # cc4400; altezza: 20px; .bar-container strong position: absolute; a destra: -32px; inizio: 0px; overflow: nascosto; # poll-results p text-align: center;
larghezza
sarà diverso per ogni sito.larghezza
è impostato con PHP o Javascript.
Javascript
introduzione
votedID
memorizza l'ID dell'opzione scelta dal cliente.var OPT_ID = 0; var OPT_TITLE = 1; var OPT_VOTES = 2; var votatoID;
$ (Document) .ready (function ()
formProcess
quando è attivato:. $ ( "# Sondaggio") presentare (formProcess);
if ($ ("# poll-results"). length> 0) animateResults ();
loadResults ()
.if ($ .cookie ('vote_id')) $ ("# poll-container"). empty (); votatoID = $ .cookie ('vote_id'); $ GetJSON ( "poll.php voto = nessuno?", LoadResults);
formProcess ()
function formProcess (event) event.preventDefault (); var id = $ ("input [@ name = 'poll']: controllato"). attr ("valore"); id = id.replace ("opt", "); $ (" # poll-container "). fadeOut (" slow ", function () $ (this) .empty (); votatoID = id; $ .getJSON ( "poll.php? vote =" + id, loadResults); $ .cookie ('vote_id', id, expires: 365););
formProcess ()
viene chiamato dall'evento submit che lo passa un oggetto evento. Impedisce al modulo di eseguire un invio normale, controlla / imposta i cookie, esegue invece un invio Ajax, quindi chiama loadResults ()
per convertire i risultati in HTML.event.preventDefault ();
var id = $ ("input [@ name = 'poll']: controllato"). attr ("valore"); id = id.replace ("opt", ");
Ingresso [@ 'poll' name =]: selezionata
è un selettore jQuery che seleziona a con un attributo di
name = 'sondaggio'
quello è controllato. attr ( "valore")
ottiene il valore dell'oggetto che nel nostro caso è optaren dove n è l'ID dell'opzione.$ ( "# Sondaggio-contenitore"). FadeOut ( "lento", function ()
vuoto()
:$ (This) .empty ();
$ (This)
è una scorciatoia jQuery per l'elemento DOM a cui è stata applicata la dissolvenza.$ GetJSON ()
quale GET richiede un oggetto JSON. Quando abbiamo l'oggetto, chiamiamo loadResults ()
con esso:$ GetJSON ( "? Poll.php votare =" + ID, loadResults);
$ .cookie ('vote_id', id, expires: 365);
loadResults ()
function loadResults (data) var total_votes = 0; var percento; for (id in data) total_votes = total_votes + parseInt (data [id] [OPT_VOTES]); var results_html = "
Risultati del sondaggio
\ n\ n "; for (id in data) percent = Math.round ((parseInt (data [id] [OPT_VOTES]) / parseInt (total_votes)) * 100); if (data [id] [OPT_ID]! == votatoID) results_html = results_html + "
loadResults ()
è chiamato da $ GetJSON ()
e viene passato un oggetto JSON contenente il DB dei risultati. È praticamente la stessa di PHP poll_return_results ()
con alcune eccezioni. La prima differenza è che impostiamo il larghezza
su tutte le barre allo 0% perché li animeremo. L'altra differenza è che stiamo usando un jQuery aggiungere()
invece di regex per mostrare i risultati. Dopo che i risultati si sono attenuati, la funzione chiama animateResults ()
. animateResults ()
function animateResults () $ ("# poll-results div"). each (function () var percentage = $ (this) .next (). text (); $ (this) .css (width: "0 % "). animate (width: percentage, 'slow'););
animateResults ()
scorre attraverso ciascuna delle barre e anima il larghezza
proprietà basata sulla percentuale.ogni()
è una funzione jQuery che scorre attraverso ogni elemento selezionato:$ ("# poll-results div"). each (function ()
contenente la percentuale.
var percentage = $ (this) .next (). text ();
larghezza
è impostato su 0% e lo anima:$ (this) .css (width: "0%"). animate (width: percentage, 'slow');