Viikkotehtävä 4
Tällä viikolla harjoitellaan PHP:n luokkien ja olioiden käyttämistä. Tehtäville yhteiset vaatimukset:
- Tehtävä on palautettava maanantaina 17.3.2008 klo 12.00 mennessä.
- Käytetään PHP-kieltä.
- Kommentoikaa koodin oleellisimpia osia!
- Kaikkien sivujen on oltava validia XHTML 1.0 Strictiä.
- Evästeitä, tallennustiedostoja tai sessioita ei saa käyttää.
- Valmiin PHP-ohjelman pitää toimia users.jyu.fi:ssä.
HUOM! Seuraavassa hieman tarkennusta viikkotehtävään tasoille 3 ja 5, jotta vältytään mahdollisilta väärin ymmärryksiltä.
Tehtävässä EI saa hoitaa listaoliolle tehtäviä päivityksiä pelkästään generoimalla aina uusi listaolio jokaisella lomakekierroksella ja tulostamalla sivun lopussa tämän olion sisältö. Tehtävässä sen sijaan PITÄÄ luoda alussa listaolio hidden-kenttien (edellisen kierroksen olion tiedot, jos sellaisia löytyy) perusteella ja sen jälkeen tehdä tarvittaessa muutoksia sille oliolle. Ennen tehtäviä muutoksia tulostetaan olion sisältö ulos, mikä tuottaa edellisen kierroksen listan ja vastaavasti muutosten jälkeen tulostetaan olion sisältö uudelleen ulos, mikä tuottaa siinä vaiheessa meneillään olevan kierroksen listan.
Myöskään olion sisällön tulostuksia EI saa missään vaiheessa hoitaa tulostamalla vain $_REQUEST-taulukon arvoja (silloin ei tulostettaisi oliota, vaan taulukko).
Taso 1
Tehdään lomakkeella käyttöliittymä, jossa käyttäjä voi muodostaa listan. Lista muodostetaan olioiden avulla.
VIHJE: Oliot luodaan $_REQUEST-taulukosta tulevien arvojen perusteella ja tämän jälkeen oliot hoitavatkin kaikki luotuun listaan liittyvät toimenpiteet, esimerkiksi listan tulostamisen.
Mallikuvat:
- taso1_a.png - Lähtötilanne. Lista-alkioita voi syöttää maksimissaan 10 kpl.
- taso1_b.png - Käyttäjä on syöttänyt lomakkeelle haluamansa arvot, muttei ole vielä painanut "Luo lista!" -painiketta.
- taso1_c.png - Lopputilanne painikkeen painamisen jälkeen.
- Lomakkeiden kentissä ei siis tarvitse säilyä käyttäjän syöttämiä arvoja, vaan itse listan tulostaminen lomakkeen jälkeen riittää.
- Samaa nimeä ei siis voi lisätä kahteen kertaan. Tarkistus on hoidettava olioilla. Virheilmoitusta ei tarvita, vaan riittää, että lisäystä ei tehdä.
- Lista on tulostettava olioiden avulla, eli tulostusta ei saa tehdä pelkästään $_REQUEST-taulukon arvojen perusteella.
Oliovaatimukset:
- Tehdään oma olio listasta ja lista-alkiosta.
- Lista-olio:
- Oliolla on attribuutti $tyyppi, jossa määrätään onko kyseessä järjestämätön lista (ul) vai järjestetty lista (ol). Attribuutti tulee olla yksityinen (private).
- Oliolla on taulukkoattribuutti $lista_alkiot, johon tallennetaan lista-alkio-olioita. Attribuutti tulee olla yksityinen (private).
- Oliota luodessa tuodaan parametrina listan tyyppi.
- Oliolla on metodi lisaa_alkio, jolle tuodaan parametrina se lista-alkio-olio, joka halutaan lisätä $lista_alkiot-taulukkoon. Lisäys tehdään vain silloin, jos taulukossa ei jo ole samannimistä lista-alkiota.
- Oliolla on metodi tulosta_lista, joka osaa tulostaa listan sisältöineen validina XHTML:nä.
- Oliolle saa tehdä tarvittaessa myös muita apumetodeja.
- Lista-alkio-olio:
- Oliolla on attribuutti $arvo, johon tallennetaan lista-alkion sisältö stringinä. Attribuutti tulee olla yksityinen (private).
- Oliolla on metodi tulosta, joka osaa tulostaa lista-alkion validina XHTML:nä.
- Oliolle saa tehdä tarvittaessa myös muita apumetodeja.
Taso 3
Laajennetaan ykköstason tehtävää siten, että listaa voi myös päivittää lomakkeen avulla. Lue siis ensin läpi ykköstason vaatimukset!
Ykköstasoon verrattuna muutokset lomakkeelle ovat seuraavat:
- Aiemmin syötetyt arvot (listan tyyppi ja lista-alkioiden arvot) jäävät lomakkeen kenttiin pohjalle. Näin ollen listaa voi päivittää muuttamalla arvoja lomakkeella ja painamalla uudelleen "Luo lista!" -painiketta. Aiempien syötettyjen arvojen tulostus on hoidettava "kysymällä" listaoliolta sen tyyppiä ja lista-alkio-olioilta niiden arvoja. Arvoja ei siis saa hakea pelkästään $_REQUEST-taulukosta.
- Ennen lomaketta tulostetaan edellisellä kierroksella luotu lista (kahdella ensimmäisellä "lomakekierroksella" kyseistä listaa ei vielä ole, joten silloin sitä ei vielä tulosteta). Tulostus on hoidettava olioiden avulla.
- Lomakkeen jälkeen tulostetaan nykyinen lista, eli samat arvot, jotka ovat pohjalla myös lomakekentissä. Tulostus on hoidettava olioiden avulla.
- Olioita voi päivittää muuttamalla kyseisen kentän arvoja lomakkeella. Voi päivittää sekä listan tyyppiä että lista-alkioiden sisältöä. Päivitystä ei saa tehdä, jos sen jälkeen listaoliolla olisi kaksi saman sisältöistä lista-alkio-olioa. Riittää kuitenkin, että vertailun (sen onko tietyn kentän päivitys sallittua) tekee päivityshetkellä oleviin arvoihin. Ei siis tarvitse huomioida sitä, että päivitys voisi olla sallittua siinä vaiheessa, kun kaikki päivitykset ja poistot olisi tehty.
- Olion (lista-alkio-olion) poistaminen tapahtuu muuttamalla lomakkeella kyseisen lista-alkion sisältö tyhjäksi.
- Uuden olion (lista-alkio-olion) luominen tapahtuu kirjoittamalla joku arvo tyhjään lomakekenttään.
VIHJE: Koska arvoja ei missään vaiheessa tallenneta esimerkiksi sessioihin, täytyy edellisellä kerralla syötetyt arvot kuljettaa lomakkeella mukana. Tämä onnistuu hidden-kenttien avulla. "Edellisen kierroksen" olion luominen onnistuu siis hidden-kenttien perusteella ja kyseiselle oliolle voi sitten tarvittaessa tehdä muutoksia meneillään olevan kierroksen tiedoilla.
Mallikuvat:
- taso3_a.png - Lähtötilanne. Lista-alkioita voi syöttää maksimissaan 10 kpl.
- taso3_b.png - Käyttäjä on syöttänyt lomakkeelle haluamansa arvot, muttei ole vielä painanut "Luo lista!" -painiketta.
- taso3_c.png - Käyttäjä on painanut "Luo lista!" -painiketta.
Lomakkeen pohjalla näkyvät käyttäjän syöttämät arvot ja lomakkeen alle on tulostettu niistä muodostettu
lista.
- Lista on tulostettava olioiden avulla, eli tulostusta ei saa tehdä $_REQUEST-taulukon arvojen perusteella.
- taso3_d.png - Käyttäjä on muuttanut listan tietoja, muttei ole vielä painanut "Luo lista!" -painiketta.
- taso3_e.png - Käyttäjä on painanut "Luo lista!" -painiketta.
Ennen lomaketta näkyy edellisen "lomakekierroksen" lista. Lomakkeen pohjalla näkyvät käyttäjän syöttämät
arvot ja lomakkeen alle on tulostettu niistä muodostettu lista.
- Listat on tulostettava olioiden avulla, eli tulostusta ei saa tehdä pelkästään $_REQUEST-taulukon arvojen perusteella.
- Poisto onnistui tyhjentämällä kyseinen kenttä.
- Samaa nimeä ei voinut lisätä kahteen kertaan. Tarkistus on hoidettava olioilla. Virheilmoitusta ei tarvita, vaan riittää, että lisäystä ei tehdä.
- Päivitys on onnistunut muuttamalla kyseisen kentän arvoa.
Oliovaatimukset:
- Ykköstason oliovaatimukset tulee ottaa huomioon myös kolmostasolla. Niiden lisäksi on alla olevia vaatimuksia.
- Listaolio:
- Oliolla on metodi poista_alkio, jonka tehtävä on poistaa parametrina tuotava lista-alkio $lista_alkiot-taulukosta. Parametrin tyypin (lista-alkio-olio vai lista-alkion sisältö stringinä) saa päättää itse.
- Oliolla on metodi paivita_alkio, jonka tehtävä on päivittää tietyn lista-alkio-olion sisältö käyttäjän lomakkeelle syöttämän sisällön mukaan. Tarvittavat parametrit ja niiden tyypit saa päättää itse. Päivityksessä tulee huomioida se, ettei sen jälkeen $lista_alkiot-taulukossa saa olla kahta saman sisältöistä lista-alkio-oliota.
- Oliolla on metodi muuta_tyyppi, jonka tehtävä on päivittää lista-olion $tyyppi-attribuutti käyttäjän lomakkeelta valitseman tyypin (ul tai ol) mukaan. Uusi tyyppi tuodaan metodille parametrina.
- Oliolle saa tehdä tarvittaessa myös muita apumetodeja.
- Lista-alkio-oliolla ei ole lisävaatimuksia ykköstasoon nähden. Oliolle voi toki tarvittaessa tehdä lisää apumetodeja.
Taso 5
Muokataan kolmostason tehtävää ottamaan paremmin huomioon erikoistapaukset listaa päivitettäessä. Tehdään lisäksi uusia ominaisuuksia. Lue ensin läpi ykkös- ja kolmostason vaatimukset, jotta saat selville, mistä tehtävässä on kysymys.
Kolmostasoon verrattuna muutokset toiminnallisuuteen ovat seuraavat:
- Päivitettäessä lista-alkion sisältöjä tulee huomioida myös samalla lomakekierroksella tehtävät mahdolliset
lista-alkioiden poistot. Päivitys tulee siis onnistua, vaikka uudeksi nimeksi tulisi edellisellä kierroksella
käytössä ollut nimi, jos samalla kierroksella kyseisen nimen sisältänyt alkio poistetaan.
- Mallikuvat:
- taso5_a.png - Käyttäjä aikoo päivittää ensimmäisen lomakentän arvoksi "Vesa" (alkuperäinen arvo "Antti") ja lisäksi hän aikoo poistaa kokonaan kolmannen lomakekentän arvon (alkuperäinen arvo "Vesa").
- taso5_b.png - Operaatio onnistui, sillä huomioitaessa poistot, "Vesan" syöttäminen ensimmäisen lomakentän arvoksi ei tuonut päällekäisyyttä.
- Mallikuvat:
- Päivitettäessä useita alkioita samalla kierroksella ei voida tietää varmasti tuleeko päällekkäisiä nimiä ennen kuin
on tehty kaikki päivitykset. Tämä pitää huomioida siten, että jos kaikkien päivitysten jälkeen päällekkäisyyksiä
ei tulisi, niin päivitykset toteutetaan. Jos taas tulisi yksikin päällekkäisyys, niin yhtäkään päivitystä ei toteuteta.
Sen sijaan kaikki poistot toteutetaan kummassakin tilanteessa. Lisäykset puolestaan luokitellaan päivityksiin ensimmäistä
lomakekierrosta (jolloin lista vasta luodaan) lukuun ottamatta, joten lisäykset tulee myös toteuttaa vain silloin, jos kaikkien
lisäysten ja päivitysten jälkeen päällekäisyyksiä ei ole.
- Mallikuvat:
- taso5_c.png - Käyttäjä aikoo päivittää toisen lomakentän arvoksi "Antti" (alkuperäinen arvo "Sami") ja kolmannen lomakekentän arvoksi "Tommi L" (alkuperäinen arvo "Tommi"). Lisäksi hän aikoo poistaa kokonaan neljännen lomakekentän arvon (alkuperäinen arvo "Vesa") ja lisätä yhden uuden arvon ("Pekka").
- taso5_d.png - Operaatio onnistui vain osittain, sillä kaikkien operaatioiden jälkeen olisi ollut päällekkäisyys (kaksi "Antti"-nimistä alkiota). Tämän vuoksi toteutettiin vain poisto. Mitään lisäyksiä tai päivityksiä ei sen sijaan toteutettu.
- Mallikuvat:
- Lomakkeella on oletuksena 10 tekstikenttää. Jos lisäys/päivitys/poisto-operaatioiden jälkeen lista sisältää
10 lista-alkiota, tulee seuraavalla kierroksella tulostaa yksi tyhjä lomakekenttä mahdollista uutta lisäystä varten.
Sama tulee toimia myös jatkossa, eli jos lisäkenttäkin täytettäisiin, niin sitä seuraavalla kerralla lomakekenttiä
olisi 12 kpl jne. Tehtäessä tämän jälkeen poistoja tulee poistaa myös lisätyt ylimääräiset lomakekentät. Lomakkeella
tulee siis olla koko ajan vähintään 10 tekstikenttää ja lisäksi vähintään yksi kenttä tulee olla tyhjänä uutta
lisäystä varten.
- Mallikuvat:
- taso5_e.png - Käyttäjä tekee listan, johon tulee 10 alkiota.
- taso5_f.png - Seuraavalla kierroksella on tehty yksi ylimääräinen lomakekenttä, jotta lisääminen onnistuu.
- Mallikuvat:
- Jokaisella lomakekierroksella operaatioiden jälkeen lista-olion $lista_alkiot-taulukko tulee järjestää
aakkosjärjestykseen lista-alkioiden sisältöjen mukaan. Lista tulee myös tulostaa ulos aakkosjärjestyksessä. Järjestäminen
ja tulostaminen tulee tehdä olioiden avulla (eli esim. järjestäminen tulee tehdä olion oman metodin avulla).
- Mallikuvat:
- taso5_g.png - Käyttäjä tekee listan, johon tulee neljä alkiota. Käyttäjä ei syötä alkioita aakkosjärjestyksessä.
- taso5_h.png - Käyttäjän painettua "Luo lista!" -painiketta, lista on luotu laittamalla käyttäjän syöttämät arvot listaan aakkosjärjestyksessä.
- Mallikuvat:
Oliovaatimukset:
Tarkkoja oliovaatimuksia ykkös- ja kolmostasojen lisäksi ei ole, vaan voi itse päättää, millaisia attribuutteja ja metodeja tarvitsee. Kaikki mahdolliset uudet attribuutit tulee olla yksityisiä (private). Omia uusia metodeita kannattanee tehdä ainakin listan järjestämiselle sekä transaktion toteuttamiselle.
VIHJE: Erilaisista taulukoihin liittyvistä valmiista funktioista on hyötyä useissa kohdissa tehtävää. Nämä funktiot selityksineen löydät PHP.netin sivuilta. Mallivastausta tehdessä tuli tutustuttua mm. array_unique-, array_diff_assoc- ja usort-funktioihin. :-)

Käyttäjien kommentit