AJAX
Database
Eksempler > Vinkjeller >Vinutvalg

Vinutvalg

Hva
Vinutvelgelse ved hjelp av AJAX

Dataene som er brukt er beskrevet i modulen Noen datasett . Det er bygget en løsning som benytter AJAX for å hente fram informasjon om et utvalg av viner fra en database til en del av en HTML-side.

Løsningen er prinsippielt slik:

vindb
Vin fra database

Javascript

Javascriptkoden som kjører på klienten bestiller et vinutvalg, tar i mot ferdig formatert tekst og plasserer denne teksten som "innerHTML". Skriptet er slik:

// relies on jquery.js
function getIt(address,targetNodeId)
{
    box = document.forms[0].vintype;
    winetype = box.options[box.selectedIndex].value;
    box = document.forms[0].land;
    prodland = box.options[box.selectedIndex].value;
    box = document.forms[0].volum;
    volum = box.options[box.selectedIndex].value;
    box = document.forms[0].terning;
    terning = box.options[box.selectedIndex].value;
    params='winetype='+winetype+'&prodland='+
           prodland+'&volum='+volum+'&terning='+terning;
    
    $.ajax({
    url:address,
    data:params,
    success:function(data)
    {
        $('#'+targetNodeId).html(data);
    },
    error:function(data)
    {
        $('#'+targetNodeId).html("Could not access content");
    }
    });
}

Serverskriptet

Serverskriptet tolker forespørselen fra Javascriptkoden, slår opp i databasen, formaterer dataene i HTML-fragmenter og returnerer bestillingen. Skriptet er skrevet i Python og ser slik ut:

#! /usr/bin/python
import MySQLdb,cgi
""" Retrieve data from MySql-base vin
 The return is selected wines wapped for HTML
 The HTML(fragments) uses some classes for styles, see fragments below
"""
SQL_SELECTED_WINES="""SELECT * FROM wines WHERE
                      type='%s' AND
                      country='%s' AND
                      volume='%s' AND
                      dice='%s';
"""
HTML_WINE_DESCRIPTION="""
<div class="wine">
<div style="float:left"><img src="%s" alt="dice"></div>
<div class="wine-name">%s</div>
<div class="wine-country">%s
  <span class="wine-price">: kr %s / %scl
  </span>
</div>
<div style="clear:left">
</div><div class="wine-desc">%s</div>
</div>
"""
HTML_WINE_SELECTION="""<div>
%s
</div>
"""
HTML_NO_WINE="""
<p style="margin:50px;font-weight:bold">
%s
</p>
"""
#------------------------------------
# connect and execute a sql-request
#------------------------------------
def connectAndExecute(sql):
    try:
        myBase=MySQLdb.connect(host='frigg.hiof.no',
                               user='student',
                               passwd='student',
                               db='vin')
        myTab=myBase.cursor()
        myTab.execute(sql)
        myBase.close()
        return myTab.fetchall()
    except MySQLdb.Error, e:
        print "Error %d: %s" % (e.args[0], e.args[1])
        return None
#------------------------------------
# make selected list
#------------------------------------
def makeSelection(vintype,land,volum,terning):
    resultTxt=''
    result=connectAndExecute(SQL_SELECTED_WINES%(vintype,land,volum,terning))
    if result==None:
        return HTML_NO_WINE%'Ingen viner funnet'
    if len(result)==0:
        return HTML_NO_WINE%'Ingen viner funnet'
    for w in result:
        navn=str(w[1])
        vintype=str(w[3])
        land=str(w[4])
        terning=str(w[5])
        terningimage=vintype+terning+'.gif'
        volum=str(w[6])
        pris=str(w[7])
        beskrivelse=str(w[8])
        resultTxt+=HTML_WINE_DESCRIPTION%\
                (terningimage,navn,land,pris,volum,beskrivelse)+'\n'
    resultTxt=HTML_WINE_SELECTION%resultTxt
    return resultTxt
#-------------------------------------------------
# what is the job ?
#-------------------------------------------------
form=cgi.FieldStorage()
print 'Content-type: text/html; charset=iso-8859-1\n'
RESULT_TXT=''
winetype='red'
prodland='Frankrike'
volum='75'
terning='6'
if form.has_key('winetype'):
    winetype=form['winetype'].value
if form.has_key('prodland'):
    prodland=form['prodland'].value
if form.has_key('volum'):
    volum=form['volum'].value
if form.has_key('terning'):
    terning=form['terning'].value
RESULT_TXT=makeSelection(winetype,prodland,volum,terning)
print RESULT_TXT

Stilsett

Det er benyttet et enkelt stilsett (css):

body{
    color: black;
    font-family:"Verdana","Geneva","Arial","Times",sans-serif;
    font-size:13px;
    text-align:left;
    margin:0px;
    padding:20px;
 }
h1{font-size:24px}
.ingress{font-size:12px}
.wine{margin-top:15px}
.wine-name{font-size:18px;padding-left:50px}
.wine-desc{}
.wine-country{padding-left:50px; font-weight:bold}
.wine-price{font-weight:normal}
.wine-author{font-weight:normal;font-size:10px;color:gray}
Referanser

Relevant kode er sitert i teksten.

Se modulen: AJAX

Vedlikehold

B. Stenseth, august 2006

( Velkommen ) Eksempler > Vinkjeller >Vinutvalg ( Sonetter )