Come sempre la logica viene per prima.
Qui siamo in ufficio così subito controlliamo se hai le chiavi.
si
Do
Finché ce n'è
prendi tutto il feedback che ancora non ha avuto risposta
mostralo
scegli quello a cui vuoi rispondere
dammi un area per la risposta
hai bisogno della conversazione precedente?
se si
mostrala in una nuova window
manda la risposta al cliente
entra la risposta nelil database
loop
no
messaggio "Fuori dal mio ufficio&46;&46;&46;!"
Guardando alla logica mi sembra che non possiamo proprio fare tutto senza fare un piccolo cambiamento al file di prima.
Poiché vogliamo vedere solo il feedback cui non è stato risposto abbiamo bisogno di un campo nel database che ci indica lo stato di quel particolare feedback. Diciamo tre stati diversi, oppure come vuoi tu, ma almeno due sono necessari.
Quindi inseriamo un campo in tbl_feedback chiamato "status" e nel nostro codice inseriamo un controllo per questi tre stati. Vedi subito che puoi aggiungerne altri senza dover cambiare il database.
- attivo
- risposto
- cancellato
La nostra Sub metti_dentro(a,b,c) in feedback_extra cambia così per tenere conto dello stato.
Naturalmente ho anche inserito il campo nella tbl_feedback in CRM.mdb:
<%
'-------------------------------------------------------
Sub metti_dentro(a,b,c)
'--------------------------------------------------------
'Purpose: inserisci i dati nel database
'Date: 10 March 2001
'Commenti:
'--------------------------------------------------------
Dim strsql, objConn, strConn, objRs
Dim status
strConn = Application("dbconn")
status = "attivo"
strsql = "INSERT INTO tbl_feedback ( nome, email, commenti, status)"
strsql = strsql & " Values('"
strsql = strsql & a & "','"
strsql = strsql & b & "','"
strsql = strsql & c & "','"
strsql = strsql & status & "')"
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConn
set objRs = objConn.Execute(strsql)
objConn.Close
set objConn = Nothing
end sub
%>
Adesso che abbiamo il campo status possiamo estrarre facilmente i nostri feedback non risposti con una query che abbia queste istruzioni:
select * from tbl_feedback where status='attivo'
Allora via senza perder tempo. facciamo
feedback_mostra che ce li lista tutti
feedback_rispondi - ci permette di rispondere quello che scegliamo
feedback_manda - che manda l'email e entra la risposta nelil database/
Ecco feedback_mostra.asp:
<%
come sempre usiamo per dichiarare tutte le variabile e per aiutarci nel trovare errori
Option Explicit
'--------------------------------------------------------
'Purpose: mostra tutto il feedback non risposto (attivo)
'Date: 13 Aprile 2001
'Commenti:
'--------------------------------------------------------
%>
includiamo le costanti di ADO
<!--#include file="adovbs.inc"-->
<html>
<head>
<title>Mostra il Feedback attivo</title>
</head>
<body>
<%
Dim objConn, strconn, strsql, objRs
Dim id, nome, email, commenti, status, ricevuto
If Session("login") then
strconn= Application("dbconn")
Nella nostra query, ordiniamo l'output così che la più vecchia viene fuori per prima, siccome non vogliamo fare aspettare I nostri clienti per troppo tempo.
<% strsql = "Select * from tbl_feedback where status = 'attivo' order by ricevuto"
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConn
Set objRs = Server.CreateObject("ADODB.Recordset")
set objRs = objConn.Execute(strsql)
Response.write "<table border='0' width='80%' cellpadding='2' cellspacing='2'>"
Do While NOT objRs.EOF
%>
Quando un oggetto è richiesto come in questo caso il Request, è sempre più efficiente estrarre il suo contenuto tutto in una volta. Nell'aprire un oggetto ci sono sempre dei costi e raccogliendo tutti i dati che ci servono in una volta li minimizziamo.
Avremmo anche potuto fare:
<% Response.write "<td width='5%'><font color=red>" & objRs("id") & "</font></td>"
%>
ma l'oggetto si sarebbe riaperto e chiuso per ogni linea di codice
<%
id = objRs("id")
nome = objRs("nome")
email = objRs("email")
commenti = objRs("commenti")
%>
E' per questo che io adopero funzioni come vendemmia(form) e raccolgo i dati dall'oggetto tutti in una volta. Questo concetto è valido per qualunque oggetto in ASP.
Questa è un funzione di VBScript per formattare una data in modo da non scrivere l'ora e i minuti ecc.
ricevuto = formatdatetime(objRs("ricevuto"),VBShortdate)
status = objRs("status")
Response.write "<tr bgcolor='#f5deb3'><td width='40'>"
Qui abbiamo messo una immagine come un ancora. Quando vi clicchiamo sopra chiamiamo la pagina per rispondere e passandogli l'id del feedback che abbiamo scelto
Response.write "<a href='feedback_rispondi.asp?id=id'>"
Response.write "<img src='folder.gif' width='32' height='30' alt='' border='0'>"
Response.write "</a></td>"
Response.write "<td width='5%'><font color=red>" & id & "</font></td>"
Response.write "<td width='40%'><font color=midnightblue>" & nome & "</font></td>"
Response.write "<td width='40%'><font color=midnightblue>" & email & "</font></td>"
Response.write "<td width='100%' align=right><font color=red>" & ricevuto & "</font></td>"
Response.write "</tr>"
Response.write "<tr bgcolor='#f8bf87'>"
Response.write "<td colspan='5'>"
Response.write "<font color='firebrick'><b>Commenti:</b></font><br>" & commenti & "</td></tr>"
objRs.MoveNext
Loop
per quando abbiamo finito o vogliamo interrompere il nostro lavoro
Response.write "<tr><td><a href='Javascript:history.back()>Torna indietro</a></td></tr>"
Response.write "</table>"
else
call niente_chiave()
end if
Sub niente_chiave()
'--------------------------------------------------------
'Purpose: mostra un messaggio ben format
'Date: 13 April 2001
'Commenti:
'--------------------------------------------------------
Response.write "<table border='0' width='80%' cellpadding='2' cellspacing='2'>"
Response.write "<tr><td>"
Response.write "Mi dispiace ma questo è il mio ufficio.<br>"
Response.write "Costruisciti il tuo!<br>"
Response.write "</td></tr>"
Response.write "<tr><td><a href='Javascript:history.back()>Torna indietro</a></td></tr>"
Response.write "</table>"
end sub
%>
</body>
</html>
Nessun problema finora? Allora avanti.
Adesso il file feedback_rispondi deve solo prendere l'Id che abbiamo passato nella collezione QueryString dell'oggetto Request e eseguire una query al database con quello. Poi deve mostrarci un'interfaccia che ci permetta di rispondere al nostro feedback. Per la nostra risposta possiamo entrare una textarea che ci permette di scrivere. Ecco tutto il programma
<%
Option Explicit
'Response.buffer = true
'--------------------------------------------------------
'Purpose: mostra un singolo feedback
'Date: 13 Aprile 2001
'Commenti:
'--------------------------------------------------------
%>
<html>
<head>
<title>Rispondi un Feedback</title>
</head>
<body>
<%
Dim objConn, strconn, strsql, objRs
Dim id, nome, email, commenti, ricevuto, risposta
If Session("login") then
Allora prendiamo subito l'id di cui abbiamo bisogno per trovare il feedback che vogliamo
id = Request.QueryString("id")
poi la connessione al database
strconn= Application("dbconn")
e l'id lo adoperiamo qui:
strsql = "Select * from tbl_feedback where id = " & id
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConn
Set objRs = Server.CreateObject("ADODB.Recordset")
set objRs = objConn.Execute(strsql)
%>
tutto fatto, ora formattiamo l'output così che lo vediamo e come vogliamo noi. Se tu vuoi puoi naturalmente usare del'HTML normale. Io mi sono abituato così' e sono ormai troppo vecchio per cambiare ;o)
Anche qui vedi, apriamo l'oggetto objRs una volta sola e lo vuotiamo di tutto
<%
id = objRs("id")
nome = objRs("nome")
email = objRs("email")
commenti = objRs("commenti")
ricevuto = formatdatetime(objRs("ricevuto"),VBShortdate)
%>
Ricordati che anche se rimaniamo nella stessa pagina il server la tratta come una pagina nuova. Quando il cliente clicca su Invia esegue una richiesta al server per questa pagina e il server la manda indietro. È solo la nostra logica che le fa fare cose diverse. Quindi dobbiamo passare l'id ancora per inviare la nostra risposta nel feedback giusto del database e in più abbiamo bisogno dell'email per mandargli la risposta:
Response.write "<form action='feedback_manda.asp?id='" & id & "&email=" & email & " method='post'>"
Response.write "<table border='1' width='95%' cellpadding='2' cellspacing='1' bgcolor='#f5deb3'>"
Response.write "<tr>"
Response.write "<td width='5%'><font color=red>" & id & "</font></td>"
Response.write "<td width='30%'><font color=midnightblue>" & nome & "</font></td>"
Response.write "<td width='30%'><font color=midnightblue>" & email & "</font></td>"
Response.write "<td width='100%' align=right><font color=red>" & ricevuto & "</font></td>"
Response.write "</tr>"
Response.write "<tr>"
Response.write "<td colspan='4'><font color=midnightblue>" & commenti & "</font></td>"
Response.write "</tr>"
Response.write "<tr>"
Response.write "<td colspan='4' align='center'>"
Response.write "<table border='1' width='100%' cellpadding='2' cellspacing='1' bgcolor='#f8bf87'>"
Response.write "<tr><td><textarea cols='90' rows='20' name='risposta'></textarea></td></tr>"
Response.write "<tr><td><input type='submit' name='submit' value='Rispondi'>"
Response.write "<input type='Reset' name='submit' value='Cancella'></td></tr>"
Response.write "</td></tr></table>"
Response.write "</td></tr></table>"
Response.write "</form>"
else
call niente_chiave()
end if
%>
E adesso tutto quello che ci è rimasto da fare è mettere la nostra riposta.
Oh, mi sono dimenticato! Non abbiamo un campo risposta nella nostro database o sì? Non mi ricordo, vado a controllare.
Non c'è. Mettiamolo e, già che ci siamo, mettiamo anche un campo per la data in cui abbiamo inviato la nostra risposta. Poi quando abbiamo usato questo programma per un po' e abbiamo un mucchio di dati, possiamo fare delle analisi per vedere quanto siamo efficienti nel rispondere ai nostri clienti. Per esempio:
"trovami il numero dei feedback in cui la differenza ( ricevuto, mandato) > 24 ore"
Ho messo due campi in tbl_feedback:
risposta - memo
mandata - date/time
allora la file feedback_manda.asp diventa così:
<%
Option Explicit
L'oggetto response deve essere dichiarato per primo se vogliamo usarlo nella pagina. Poche dichiarazioni come
Option explicit
Language&46;&46;&46;
riescono a stargli davanti. Tutto ciò riguarda il fatto che l'oggetto response deve inserire delle informazioni nell'header HTTP, quindi se è già scritta lui non può farlo.
Comunque te ne accorgerai subito perché il motore di ASP ti restituirà un brutto errore.
Se vuoi vedere queste cose, semplicemente commenta la prossima linea e poi vedi cosa succede. La prossima volta che ti succede non ti devi rompere la testa inutilmente poiché quell'errore lo sai già
Response.buffer = true
'--------------------------------------------------------
'Purpose: manda il feedback che abbiamo riposto
' entra la risposta e la data nelil database
' cambia lo status to 'risposto'
'Date: 13 Aprile 2001
'Commenti:
'--------------------------------------------------------
%>
<html>
<head>
<title>Manda una risposta</title>
</head>
<body>
<%
Dim objConn, strconn, strsql, objRs
Dim id, risposta, mandata, email
'If Session("login") then
prendiamo tutto il contenuto della querystring
id = Request.QueryString("id")
email = Request.QueryString("email")
e della form:
risposta = Request.Form("risposta")
il vecchio problema delle " più che altro per MS SQL credo&46;&46;&46;
risposta = Replace(risposta,"'","''")
usiamo la funzione date per ottenere la data di oggi
mandata = Date()
strconn= Application("dbconn")
strsql = "Update tbl_feedback "
strsql = strsql & " Set "
strsql = strsql & " risposta = '" & risposta & "',"
strsql = strsql & " mandata = #" & mandata & "#,"
e naturalmente cambiamo lo status del feedback così che non torna più:
strsql = strsql & " status = 'risposto'"
strsql = strsql & " where id = " & id
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open strConn
Set objRs = Server.CreateObject("ADODB.Recordset")
set objRs = objConn.Execute(strsql)
questa lo presa da una lezioni di prima e l'ho leggermente modificata:
call manda_posta(email, risposta)
e adesso che abbiamo fatto tutto, il response.redirect ci rimanda al nostro file che ci mostra tutti i feedback e, se tutto ha funzionato al meglio, quello che abbiamo appena risposto non dovrebbe apparire più.
response.redirect "feedback_mostra.asp"
else
call niente_chiave()
end if
'--------------------------------------------------------
Sub manda_posta(email,risposta)
'--------------------------------------------------------
'Purpose: manda la email
'Date: 10 March 2001
'Commenti:
'--------------------------------------------------------
Dim objMail
Set objMail = Server.CreateObject("CDONTS.NewMail")
objMail.From = "ilnostroindirizzo"
objMail.To = email
objMail.Subject = "Ilmiosito risponde"
objMail.Body = risposta
objMail.importance = 0
objMail.Send
Set objMail = Nothing
end sub
%>
Tutto qui. Non c'è male per un paio d'ore di lavoro, no? Adesso comincia a tenere il tuo portatile sul comodino così, quando ti svegli alla mattina, rispondi subito ai tuoi clienti che sono venuti durante la notte. Quindi, comincia pure a pianificare il tuo viaggio che ormai il sito te lo mantieni da dove vuoi.
Ho messo anche un campo al feedback nel mio ufficio.asp e siccome ci comincio a lavorare dentro l'ho fatto anche un po'
più bello ;o)
<%
Option Explicit
If session("login") then
%>
<html>
<head>
<title>Ufficio</title>
</head>
<body>
<table width="95%" border="0" cellspacing="4" cellpadding="4">
<tr>
<th align="left" width="170"><img src="NFM.GIF" width="158" height="100" alt="" border="0"></th>
<th align="left" width="100%"><font size=+2 color="firebrick">Il Mio Ufficio Virtuale " o Letto? "</font>
<hr size="1" color="firebrick" width="100%"></th>
</tr>
<td></td>
<td>
<!-----------comincia News---------------------->
<table width="60%" border="0" cellspacing="1" cellpadding="0" bgcolor="red"><tr><td>
<!--tanto per fare un border rosso-->
<table width="100%" border="0" cellspacing="0" cellpadding="4" bgcolor="white">
<th align="left" bgcolor="red" colspan="2"><font color="white">News</font></th>
<tr>
<td width="40"><img src="news1.gif" width="35" height="35" alt="" border="0"></td>
<td width="100%"><a href="news.asp"><font color="red">Entra un nuovo articolo nelle News</font></a></td>
</tr>
<tr>
<td width="40"><img src="chemistry.gif" width="30" height="32" alt="" border="0"></td>
<td width="100%"><a href="mantieni_news.asp"><font color="red">Cambia o cancella un articolo nelle News</font></a></td>
</tr>
<tr>
<td></td>
</tr>
</table>
</td></tr></table>
<!-----------finisce News-------------->
<!-----------comincia CRM---------------------->
<table width="60%" border="0" cellspacing="1" cellpadding="0" bgcolor="green"><tr><td>
<!--tanto per fare un border verde-->
<table width="100%" border="0" cellspacing="0" cellpadding="4" bgcolor="white">
<th align="left" bgcolor="green" colspan="2"><font color="white">CRM</font></th>
<tr>
<td width="40"><img src="news1.gif" width="35" height="35" alt="" border="0"></td>
<td width="100%"><a href="feedback_mostra.asp"><font color="green">Rispondi al feedback</font></a></td>
</tr>
<tr>
<td></td>
</tr>
</table>
</td></tr></table>
<!-----------finisce CRM-------------->
</td>
</tr>
</table>
</body>
</html>
<%
else
response.redirect "login.asp"
end if
%>