Egy kis kockákból álló térbeli alakzatnak háromféle vetületét állíthatjuk elő: felülnézet, oldalnézet, elölnézet.
|
|
Egy ilyen alakzatot úgy adunk meg, hogy a felülnézeti vetületén definiáljuk, hány kocka van egymáson:
Egy olyan webes alkalmazást kell készíteni, amely lehetőséget ad ilyen alakzatok megadására, tárolására és vetületeinek megjelenítésére. Ezen kívül a jobban sikerülteket kedvencként is megjelölhetjük.
További tudnivalók:
webprogramozas.inf.elte.hu
szerveren kell elkészíteni. A www
mappádon belül hozzál létre egy vetuletek
mappát, és abban készítsd el a megoldásodat.Ponthatárok:
Előkészületek
Adatok előkészítése Az adatok tárolását fájlban vagy adatbázisban is elvégezheted. Az alakzatokat úgy tárolod, ahogy akarod, a felületen egy JavaScript mátrix sorosított változatát kell megadni, érdemes ezt a szöveget tárolni. Három rekordot vegyél fel kezdetben, amiket később se módosíts (ezek kellenek a teszteléshez):
id név szélesség magasság kedvenc alakzat
1 alma 2 2 igen [[1,3],[0,2]]
2 korte 3 3 nem [[1,2,1],[0,0,3],[4,0,1]]
200000000 szilva 3 2 nem [[2,1,1],[2,0,0]]
A 10-100000000 id
tartományba ne vegyél fel új elemet, azt a tesztelő használja majd a véletlen id
generáláskor. A 200000000 sorra azért van szükség, hogy adatbázis használata esetén az üresen hagyott auto_increment
-es mező onnantól adja hozzá az id
-kat.
Az automatikus tesztelő új elemeket vesz fel. Az így létrehozott elemeket bármikor törölheted az adataid közül, csak a fent említett 3 rekord maradjon változatlan!
Ha adatbázist használsz, akkor az alábbi SQL utasítás bemásolásával létre tudod hozni (phpmyadminban kiválasztva az adatbázisod, SQL fül):
CREATE TABLE `alakzatok` (
`id` int(11) NOT NULL,
`nev` varchar(30) COLLATE utf8_hungarian_ci NOT NULL,
`szelesseg` int(11) NOT NULL,
`magassag` int(11) NOT NULL,
`kedvenc` tinyint(1) NOT NULL,
`alakzat` text COLLATE utf8_hungarian_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci;
INSERT INTO `alakzatok` (`id`, `nev`, `szelesseg`, `magassag`, `alakzat`, `kedvenc`) VALUES
(1, 'alma', 2, 2, '[[1,3],[0,2]]', 1),
(2, 'korte', 3, 3, '[[1,2,1],[0,0,3],[4,0,1]]', 0),
(200000000, 'szilva', 3, 2, '[[2,1,1],[2,0,0]]', 0);
ALTER TABLE `alakzatok`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=200000001;
Stílusok
Minden oldalon legyenek elérhetőek a következő stílusok:
* {
box-sizing: border-box;
}
#tabla {
border-collapse: collapse;
}
#tabla td {
padding: 0;
width: 25px;
height: 25px;
border: 1px solid black;
text-align: center;
}
.vetulet {
border: 1px solid orange;
min-width: 10px;
min-height: 10px;
}
table.vetulet {
border-spacing: 0;
display: inline-table;
}
table.vetulet td {
padding: 0;
width: 10px;
height: 10px;
border: 1px solid black;
}
table.vetulet td.black {
background-color: lightgray;
}
div.vetulet {
display: inline-flex;
flex-direction: row;
align-items: flex-end;
}
div.vetulet > div {
width: 10px;
display: flex;
flex-direction: column;
}
div.vetulet > div > div {
width: 10px;
height: 10px;
border: 1px solid black;
background-color: lightgray;
}
Listázás Listázd ki a tárolt alakzatokat egy táblázatban. Fájlnév: lista.php
A táblázatnak legyen fejlécsora, ahol az oszlopneveket tüntetjük fel th
elemekben.
A táblázat adatait tartalmazó soroknak legyen az id
-t tartalmazó data-id
attribútuma (pl. <tr data-id="1">
).
A Kedvenc oszlopban teli szívvel jelezzük, ha kedvenc az alakzat, üres szívvel, ha nem. Használd ezeket az UTF-8 karaktereket: ♥, ♡.
A Funkciók oszlopban egyetlen hivatkozás szerepel “Megjelenít” felirattal. A hivatkozás a megjelenit.php
-ra mutat átadva az id
értékét id
név alatt GET paraméterként.
Legyen lehetőség csak a kedvenceket vagy a nem kedvenceket kilistázni. Ezt GET paraméterként jelezzük: lista.php?kedvenc=true
vagy lista.php?kedvenc=false
. Ennek megadását a felületen nem kell elvégezni.
Legyen egy link az oldalon “Új alakzat felirattal”, ami az uj.php
-ra mutat.
Megjelenítés A listázó oldalon az egyik alakzat “Megjelenít” hivatkozására kattintva a megjelenit.php
oldal jelenik meg, URL-ben átadva a megjelenítendő alakzat id
-ját.
vetulet
stílusosztályú táblába, illetve div
-ekbe fognak kerülni.<dl>
<dt>Azonosító</dt>
<dd>200000000</dd>
<dt>Név</dt>
<dd>szilva</dd>
<dt>Méret</dt>
<dd>2 x 3</dd>
<dt>Kedvenc</dt>
<dd>♡</dd>
<dt>Vetületek</dt>
<dd>
<table>
<tr>
<th>Felülnézet</th>
<th>Oldalnézet</th>
<th>Elölnézet</th>
</tr>
<tr>
<td>
<table class="vetulet" id="felul"></table>
</td>
<td>
<div class="vetulet" id="oldal"></div>
</td>
<td>
<div class="vetulet" id="elol"></div>
</td>
</tr>
</table>
</dd>
</dl>
A vetületek generálását kliens- vagy szerveroldalon is elvégezheted, a végső struktúra kerül ellenőrzésre. (Tesztek szempontjából a 2. teszt az előre megadott alakzatok közül választ véletlenszerűen, a x. teszt egy új alakzat esetén vizsgálja meg. Ezért a vetületekre kapható pontokat kettéválasztottuk.)
A felülnézeti vetületet a table.vetulet#felul
elemben kell megjeleníteni. A szilva nevű alakzat esetén ez így néz ki. Fontos, hogy black
stílusosztállyal lássuk el azokat a cellákat, ahol van kocka.
<table class="vetulet" id="felul">
<tr>
<td class="black"></td>
<td class="black"></td>
<td class="black"></td>
</tr>
<tr>
<td class="black"></td>
<td class=""></td>
<td class=""></td>
</tr>
</table>
div.vetulet#oldal
elembe kell generálni. Ebben annyi div
van, ahány oszlop, egy oszlopon belül pedig annyi div
, ahány kocka van egymáson.<div class="vetulet" id="oldal">
<div>
<div></div>
<div></div>
</div>
<div>
<div></div>
<div></div>
</div>
</div>
div.vetulet#elol
elembe kell generálni. Ebben annyi div
van, ahány oszlop, egy oszlopon belül pedig annyi div
, ahány kocka van egymáson.<div class="vetulet" id="elol">
<div>
<div></div>
<div></div>
</div>
<div>
<div></div>
</div>
<div>
<div></div>
</div>
</div>
Új alakzat felvitele Az uj.php
oldalon kell megvalósítani egy új alakzat felvitelét. Ehhez meg kell adni a következő mezőket. A validációt szerveroldalon kell elvégezni. A hibaüzeneteket egy hibak
azonosítójú elembe kell kiíratni (nincs speciális struktúra).
id
, szöveges, nem kötelező, ha meg van adva, akkor szám; hibaüzenetek: "Az id nem szám")nev
, szöveges, kötelező; hibaüzenetek: "A név kötelező")magassag
, szöveges, kötelező, szám; hibaüzenetek: "A magasság kötelező", "A magasság nem szám")szelesseg
, szöveges, kötelező, szám; hibaüzenetek: "A szélesség kötelező", "A szélesség nem szám")kedvenc
, checkbox)alakzat
, többsoros szöveges beviteli mező, kötelező, valid JSON – ez utóbbi hibáját a PHP-s json_decode
függvény NULL
visszatérési értéke jelzi; hibaüzenetek: "Az alakzat kötelező", "Az alakzat rossz formátumú")Sikeres mentéskor a listázó oldalra (lista.php
) kell átirányítani a böngészőt.
Új alakzat megadása kattintgatással A felvivő oldalon macerás az alakzat mátrixának JSON kódját kézzel megadni. Segítsük ezt a folyamatot azzal, hogy egy felülnézeti táblázatot generálunk az oldalra, és a cellákba kattintgatva adjuk meg, hány kocka is van egymáson!
Tegyünk fel egy gombot general
azonosítóval. Erre kattintva az oldalon meg kell jelennie egy n
xm
-es táblázatnak, ahol n
értékét a magasság mezőből, m
értékét a szélesség mezőből olvassuk ki. A megjelenő táblázat azonosítója tabla
(table#tabla
), és eleinte mindegyik értéke 0.
A táblában kattintgatva az adott cella értéke 1-gyel növekszik.
Minden kattintás után a táblának megfelelő JSON mátrix az alakzatnak megfelelő többsoros szöveges beviteli mezőben megjelenik.
AJAX szerkesztés A megjelenítő oldalon tegyük lehetővé az adatok szerkesztését és AJAX-os mentését.
Tegyünk fel egy szerkeszt
azonosítójú gombot, amire kattintva az oldalon megjelenik három beviteli mező (az alakzat aktuális értékeivel) és egy gomb, amik addig el voltak rejtve (érdemes a hidden
attribútummal vagy a display: none
-nal elrejteni őket):
nev
, szöveges)kedvenc
, checkbox)alakzat
, többsoros szöveges beviteli mező)mentes
, felirata)A Mentés gombra kattintva egy AJAX kérést kell küldeni a szervernek, ott elmenteni a változásokat, majd a szélesség és magasság adatokat visszaküldeni a kliensre, ahol a méreteknél megjelenítjük. Más dolgot nem kell tenni. A szerver válasza JSON formátumban küldje vissza az adatot: