Personalet i IT-Højskolens reception har hver dag brug for at se hvem der denne dag har reserveret skolens 5 videoprojektorer eller om der er videoprojektorer ledige til udlån. Det kan antages i det følgende at videoprojektorer udlånes en hel dag ad gangen. Det nye system skal give mulighed for lærere og personale selv at reservere videoprojektorer til undervisnings- og forsknings-formål.
For at afgrænse opgaven ser vi i det der følger bort fra en del administrationsfunktionaliteter - omend disse er vigtige i et virkeligt system.
![]() |
Opskriv HTML koden for visning af siden på billedet ovenfor (rammen er
ikke en del af html-siden). Besvarelsen skal fremgå som html-kode
indeholdende både <html> og </html>
tags.
Den sorte bar i billedet ønskes implementeret som en tabel med vidde
100 procent, baggrundsfarve sort (attribut bgcolor=black)
og indeholdende en række med to felter:
I denne opgave skal du opskrive HTML kode til brug for en HTML-form
til reservation af en projektor. HTML-koden du skal opskrive skal have formen
<select ...>
...
</select>
og vise
en SELECT box med tre af IT-højskolens projektorer (se billedet til
højre).
Til brug i HTML-formen skal navnet på SELECT boxen være
proj_id og værdien for hver af projektormulighederne skal
være nummeret på projektoren, således at valget med teksten
``Projektor 1'' har værdien ``1'', valget med teksten ``Projektor 2'' har værdien ``2''
og så fremdeles.
projector_list,
vist nedenfor, med listen
[list [list "4" "Projector 4"] [list "1" "Projector 1"]]givet som argument:
proc projector_list { l } {
set res "<ul>\n"
foreach e $l {
set id [lindex $e 0]
set text [lindex $e 1]
append res " <li> <a href=projector_show.tcl?id=$id>$text</a>\n"
}
append res "</ul>"
return $res
}
select_box, som returnerer
HTML-kode for en SELECT box med en liste af
valg. Proceduren skal tage to argumenter, et navn på
SELECT boxen brugt til name attributten og
en liste af projektorer, som i Opgave 2.1. Du kan passende bruge
proceduren projector_list fra Opgave 2.1 som skabelon.
Hint: Ved følgende kald af proceduren select_box skal
proceduren returnere besvarelsen på Opgave 1.2:
select_box "proj_id" [list [list "1" "Projektor 1"] \
[list "2" "Projektor 2"] \
[list "3" "Projektor 3"]]
ns_return 200 text/html " -- HTML kode -- "hvor teksten
-- HTML kode -- erstattes med relevant HTML
kode.
Konstruer en procedure vp_return_page som benytter
kommandoen ns_return til at returnere en side til en
web-browser. Proceduren skal tage to argumenter. Det første argument
er titlen på siden (title), som i kald af proceduren skal
forekomme i <title>...</title> tags i headeren for
siden. Det andet argument er kroppen på siden
(body). Alle sider som returneres med
vp_return_page skal--uafhængigt af argumenterne--indeholde
den sorte bar og email-signaturen, som i Opgave 1.1.
Hint: Følgende kald af proceduren vp_return_page skal
returnere web-siden der er vist i Opgave 1:
vp_return_page "About" "
<h2>About</h2>
The Video Projector Reservation System allows registered users to
make reservations of video projectors at the IT University of Copenhagen."
[0-9]+ matches af et eller flere
forekomster af cifrene 0-9. Opskriv et regulært udtryk som matches af enten
YYYY-MM-DD, hvor YYYY
udgør et år (f.eks. 2000), MM udgør et måned (f.eks. 05) og DD udgør en
dag (f.eks. 12).
vp_check_date til at undersøge om en
dato har formen YYYY-MM-DD, som beskrevet i Opgave 3.2. Hvis datoen,
som overføres til proceduren som argument, har den rigtige form skal
proceduren med det samme returnere til stedet hvorfra proceduren
kaldes. Ellers skal proceduren returnere en fejlbesked til brugerens
web-browser, hvorefter programmet skal stoppe ved et kald til
tcl-kommandoen exit.
Du kan antage at du kan benytte proceduren vp_return_page
fra Opgave 2.1 til at returnere en besked til brugerens
web-browser. Til at undersøge om datoen har den rigtige form skal du
bruge tcl-kommandoen regexp.
vp_person - indeholder de personer som kan reservere projektorer
vp_projector - indeholder projektorene
vp_reservation - knytter personer til projectorer for de enkelte datoer
vp_person og vp_projector og to
Oracle sekvencer til generering af unikke numre er oprettet ved
følgende SQL kommandoer:
create table vp_person (
id integer primary key,
name varchar(100) not null,
email varchar(100) not null,
password varchar(100) not null
);
create table vp_projector (
id integer primary key,
name varchar(100)
);
create sequence vp_person_id_sequence start with 10;
create sequence vp_projector_id_sequence start with 10;
Følgende SQL insert kommandoer kan efterfølgende antages
at være udført:
insert into vp_person (id, name, email, password) values (1, 'John Paulin', 'paulin@it.edu', 'yes!'); insert into vp_person (id, name, email, password) values (2, 'Niels Hallenberg', 'nh@it.edu', 'no!'); insert into vp_projector (id, name) values (1, 'Projektor 1'); insert into vp_projector (id, name) values (2, 'Projektor 2'); insert into vp_projector (id, name) values (3, 'Projektor 3');
select kommando:
select name, email from vp_person;
select kommando til at returnere antallet
af projektorer i tabellen vp_projector.
vp_reservation. Tabellen skal have tre kolonner:
projector_id - reference til vp_projektor tabel
person_id - reference til vp_person tabel
res_date - datoen for reservationen (brug Oracles date datatype)
unique-constraint til at udtrykke at der i
tabellen ikke må forekomme to rækker hvor både
projector_id og res_date er ens.
vp_reservation:
2001-02-06)
2001-02-08)
2001-02-06. Resultatet af at udføre kommandoen
skal resultere i følgende data - kolonnenavnene er skrevet med
bold:
| proj_id | proj_name | pers_id | pers_name | |
|---|---|---|---|---|
| 2 | Projector 2 | 1 | John Paulin | paulin@it.edu |
| proj_id | proj_name |
|---|---|
| 2 | Projector 2 |
| 3 | Projector 3 |
Hint: Det er nødvendigt at benytte en sub-query.
projektor.tcl.
# set the form variable `date' if it is available
set_form_variables 0
set db [ns_db gethandle]
if [info exists date] {
vp_check_date $date
} else {
# if a form variable `date' is not set, we use todays date
set date [database_to_tcl_string $db "select sysdate from dual"]
}
# Now date is set and on the form YYYY-MM-DD. Let's ask
# the Oracle about the dates of the day following $date
# and the day preceeding $date; we do this by adding one
# to $date and subtracting one from $date, respectively.
set query_nextday "select to_date('$date', 'YYYY-MM-DD') + 1 from dual"
set nextday [database_to_tcl_string $db $query_nextday]
set query_prevday "select to_date('$date', 'YYYY-MM-DD') - 1 from dual"
set prevday [database_to_tcl_string $db $query_prevday]
# Extract information about the projector reservations for `date'
set query " -- DIT SVAR PÅ OPGAVE 4.5 HVOR DATOEN '2001-02-06'
UDSKIFTES MED '$date' -- "
set selection [ns_db select $db $query]
set reservations ""
while { [ns_db getrow $db $selection] } {
set_variables_after_query
append reservations "<li>$proj_name - $pers_name</a>
}
append reservations "<p>
<li> <a href=res_add_form.tcl?date=$date>Add reservation</a>"
vp_return_page "Projector Reservations" "
<h3>Projector Reservations for $date</h3>
\[ <a href=projector.tcl?date=$prevday>Prev Day</a> |
<a href=projector.tcl?date=$nextday>Next Day</a> \]
<ul>$reservations</ul>"
nextweek og prevweek som henholdsvis skal
indeholde datoen en uge senere end $date og datoen en uge
tidligere end $date. Det er hensigten at tcl-koden skal
kunne indsættes efter definitionen af variablen
prevday.
Omskriv også kaldet af vp_return_page til slut i filen
projector.tcl således at der er links til henholdsvis
ugen efter og ugen før den pågældende dato.
add_res_form.tcl. Det kan antages at filen altid
forespørges sammen med en form variabel date, som
indeholder datoen for hvilken der skal reserveres en projektor.Her følger en skabelon til filen:
#set the form variable `date'
set_form_variables
# CHECK FORM VARIABLES
## A ## ...
set db [ns_db gethandle]
set query " -- DIT SVAR PÅ OPGAVE 4.6 HVOR DATOEN '2001-02-08'
UDSKIFTES MED '$date' -- "
set selection [ns_db select $db $query]
# make an empty list
set sel_box_list [list]
# loop through the rows
while { [ns_db getrow $db $selection] } {
set_variables_after_query
# append select option to the list
lappend sel_box_list [list $id $name]
}
# use the procedure selectbox to actually create a
# selection box to put in an HTML form
set sel_box [select_box "proj_id" $sel_box_list]
# CODE FOR RETURNING A FORM TO THE USER
## B ## ...
Bemærk at proceduren select_box fra Opgave 2.2 benyttes
til at opbygge select-boxen.
Som svar på opgaven skal du skrive kode for at undersøge indholdet af
form-variablen date (programpunkt ## A ## i koden
ovenfor). Herudover skal du skrive kode for at returnere en form til
brugeren (programpunkt ## B ## i koden ovenfor).
add_res.tcl. Husk at skriv kode for at
undersøge om indholdet af formvariablerne har den rette form. Du kan antage at
proceduren vp_check_date er til rådighed udover
procedurerne vp_check_id og vp_check_email der kan bruges til
henholdsvis at undersøge om en streng indeholder et tal eller en email-adresse. Husk at en bruger kun må få lov til at reservere en projektor hvis kodeordet der indtastes stemmer overens med kodeordet i databasen for den pågældende person.