Autor Zpráva
Pavel Kr.
Profil *
Dobrý den,
Potřebuji poradit, nějak popostrčit.
Tvořím něco jako rozvrh hodin. Admin vypíše pro každý týden hodiny a „žáci“ se na jednotlivé vypsané hodiny budou zapisovat.
Vypisování hodin pro admina řeším tabulkou (klasický rozvrh hodin – v levém sloupečku dny, ve vrchním řádku časy). V každém chlívku u všech dnů je checkbox. Admin vypíše hodiny tak, že pro celý týden jen odkliká chlívky kdy mu to vyhovuje a tlačítkem odešle – zapíše do DB.
Problém je v tom, že ke každému checkboxu musí být přiřazen datum a čas kdy hodina proběhne.
Nevím, jestli si mám v DB vytvořit tabulku, kde budou jen datumy a ty pak vypisovat ke každému dni do rozvrhu, nebo v PHP zjišťovat aktuální datum a podle toho dopočítávat ostatní datumy do rozvrhu.
Hodiny bude možné vypisovat pro následující 3 týdny. Takže budou tři tabulky a po kliknutí na následující týden se zobrazí rozvrh pro další týden.
Když to shrnu polopatě: V rozvrhu zatrhnu checkboxy kdy bude hodina probíhat a do tabulky v DB se zapíše hodina od kdy a datum + další info jako místnost atd…
Doufám, že jsem to popsal alespoň trochu srozumitelně. Budu rád za všechny nápady a reakce. Děkuji.
Tori
Profil
Délka a začátek hodiny je (a v budoucnu zůstane) konstantní, nebo se může různě měnit? (nemusí to být přesně po 50 minutách, ale spíš jestli můžu mít třeba v jedné tabulce začátky všech vyučovacích hodin a z nich vybírat, anebo může začínat hodina/zkouška třeba v úterý v 10h a ve středu v 10:15).
Pavel Kr.
Profil *
Tori:
Hodiny budou konstantní, nebo alespoň to tak bude prozatím.
peta
Profil
Je to desne slozite popsane :)
Jestli to spravne chapu, tak je to, jak rika Tori, ze chces v podstate program na terminy zkousek. Mas admina, ktery vypise terminy zkousek. A pak mas studenty, ktery se na ty terminy zapisi.

Chces zobrazit tabulku?
SELECTem z db vytahnes vse pro dany tyden (datum>x AND datum<x+tyden). Z vysledku sestavis tabulku pro html.

Chces zapsat novy termin?
Ja bych pouzil normalne <select> + <inputy> formular pro vytvoreni noveho terminu.
Ale jako klikanim a zaskrtavanim v html tabulce to jde resit taky, ty tem checkboxum do value muzes dat datum + cislo hodiny (value="2014/1/22 12:10"). Ulozis pak datum z prvniho checkboxu a pocet zaskrtnutych (predpokladam, ze jdou po sobe, ze je treba zkouska delky 2x45 min, 2 chlivecky, delka = 2).
id | datum | delka | kdo | jaka zkouska | jine poznamky
Nebo to muzes ulozit kazdy datum zvlast, ale pak to musis nejak sprahnout v db
terminy: id_termin | datum | id_zkouska
zkousky: id_zkouska | kdo | jaka zkouska | jine poznamky
A predpokladam, ze si zkontrolujes, zda je dany termin volny, pro jistotu. Zvlast, pokud to zadava vic lidi ve stejny cas, tak se jim oboum zobrazi termin volny a oba nezavisle odeslou, ze tam chteji vytvorit termin zkousky. a pak bys tam mel dva.
Pavel Kr.
Profil *
peta:
Díky, tak nějak jsem to myslel.

Já jenom nevím (a neví to nikdo, ani admin který bude ty hodiny vypisovat) kolik těch hodin denně bude. Časy jsou pevně dané, ale jednou v pondělí může být jen jeden termín, v úterý třeba 6, ve středu 4, další pondělí 3 atd. => musím vytvořit tabulku, kde budu mít ode dneška pro každý den, na 10 roků dopředu, vypsané 7 možných termínů, které jdou uskutečnit?

tj. 21.1.2014 - 6:30 - 9:00, 9:00 - 10:30 ....

ta tabulka bude celkem velká :-)
peta
Profil
Takhle to vypisuje Stag, prepina se to temi odkazy

Základní údaje
Termíny
Předměty
Rozvrh
Kvalifikační práce

Je to organizovane po mistnostech, kapacita mistnosti napr 20 lidi. Vic nez kapacita nejde zapsat studentovi do jedne mistnosti. Takze se vypise vic terminu treba pro jednu mistnost v jiny cas.
Tohle je zrovna vypis ucitele informatiky, co uci, jake ma vypsane terminy zkousek...

https://stag.slu.cz/stag?urlid=prohlizeni-ucitel-rozvrh&ucitelUcitidno=57893&ucitelRok=2013&ucitelSemestr=LS&formRozvrhZobrazeni=0
https://stag.slu.cz/stag?urlid=prohlizeni-ucitel-predmety&ucitelUcitidno=57893&ucitelRok=2013
https://stag.slu.cz/stag?urlid=prohlizeni-ucitel-terminy&ucitelUcitidno=57893&ucitelRok=2013&ucitelSemestr=LS&ucitelAktualniTerminy=
Pavel Kr.
Profil *
peta:
Pro daný termín bude jen jedna místnost a jeden učitel, ale to je jedno s tím vším si poradím. Spíš mě zajímá jestli s tou tabulkou jak jsem psal v příspěvku #5 je to dobré řešení? Nijak jinak mě to nenapadá. Ale ta tabulka bude mít pro těch třeba 10 let dopředu nějakých 30 000 záznamů - nebude práce s DB pomalá? Co za těch 10 let? Opět přidat další záznamy? Takhle budou v DB zbytečně nevyužitá data, protože každý termín nemusí (ale může) být obsazen...
Tori
Profil
Pavel Kr.:
musím vytvořit tabulku, kde budu mít ode dneška pro každý den, na 10 roků dopředu, vypsané 7 možných termínů, které jdou uskutečnit?
Nemusíte. Základní varianty rozvrhu:

1A) Předpoklad: všechna políčka v rozvrhu mají stejnou délku, např. 1 hodinu, každý den začínají hodiny ve stejné časy. Takže když mi rozvrh začíná v 8:00, dokážu jednoduchým přičítáním +1h zjistit i časy všech ostatních políček. Tzn. stačí vám pouze 1 tabulka s obsazenými termíny, do které uložíte jen datum+čas začátku termínu. Jednotlivé sloupce snadno vygenerujete v PHP cyklem, kde zadáte jen první termín, poslední termín a délku hodiny, nemusíte je ukládat. Počítá s tím, že jeden termín = jedno políčko rozvrhu.

1B) Předpoklad: klasický rozvrh na ZŠ - každý den začínají hodiny ve stejné časy, ale délka jednotlivých hodin se může lišit, tj. mám začátky v 8:00, 8:45, 9:30, 10:30, 11:15, 12:00, 13:00 ... Tady potřebujete někam uložit, kdy která hodina začíná, protože už se nedají snadno dopočítat. Takže máte např. 2 tabulky - jednu s těmi časy (jen pro jeden den - slouží jen na vypsání sloupců rozvrhu + <select> pro admina, když zadává začátek termínu. Druhá tabulka jsou obsazené termíny, stejně jako v 1A. Počítá s tím, že jeden termín = jedno políčko rozvrhu.

2A) Předpoklad: Políčka rozvrhu mají různou délku a každý den v týdnu můžou začínat v jiný čas (ale např. všechny pondělky jsou stejné, všechny úterky atd.), ale všechna políčka mají délku jako násobek např. čtvrhodin. Tj. hodina/zkouška může začít v 8:00 nebo v 8:15, ale ne v 8:10. V DB stačí jedna tabulka obsazených termínů, ale kromě začátku musíte už ukládat i konec termínu. Rozvrh můžete opět vygenerovat v PHP cyklem po čtvrthodinových krocích, ale musíte navíc dopočítat, kolik políček termín zabere (= colspan). Použilo by se i pro 1A, pokud termín může být přes několik vyuč.hodin. (To je např. ten první odkaz od peta, koukněte se do zdrojáku HTML, jak je to udělané.)

2B) Předpoklad: Políčka rozvrhu mají různou délku, každý den začínají jindy (a tohle pondělí můžou být jindy než příští pondělí) a můžou být libovolně dlouhé. Opět v DB jedna tabulka s ukládáním začátku a konce obsazených termínů, ale výpis do HTML bude ještě složitější, pravděpodobně přesně pozicované bloky přesné délky. (Klidně můžou být termíny z tohoto pondělka stejné jako z příštího, jde o to, že mohou mít nějaké rozumně nedělitelné délky jako 53 min. Ale v praxi by se asi stejně použily pětiminutové kroky, aby se zjednodušilo vykreslení tabulky rozvrhu.)

Pro 2A i 2B by bylo potřeba odlišné ověření, jestli termín není obsazen - hledejte tady na diskusi "rozvrh překrývání hodin" nebo "překrývání termínů". (Není to nijak složité, jedna podmínka v SQL, jenom na první pohled působí trochu nelogicky.)
peta
Profil
Jestli jsou ty terminy stejne na 10 let dopredu, tak to muzes resit pres php, proc to ukladat?
V db tabulce ze Stagu jsou zadane hodiny njak takto:
0, 7:15, 8:00 // nulta vyucovaci hodina zacina 7:15, konci 8:00
1, 8:05, 8:50
2, 8:55, 9:40
Rezevace terminu v db tedy muze byt
21.1.2014, 0, 3, Matematika1 // den, zacina se nultou vyucovaci hodinou, obsazuji se 3 vyucovaci hodiny, predmet nebo popisek
Pro uzivatele se to vypise jako:
Dne 21.1.2014 v case 7:30-9:40 probiha zkouska Matematika1
Pro admina se to vypise v te tabulce, ten db radek si uz php prevedes na spravna zaskrtnute checkboxy, ne? Udelas si php pole a cyklem ho pak naplnis udaji, ktere ziskas z db. Pak pole vypises jako tabulku html. (proc ukladat do db prazdna policka, kdyz si to muzes vytvorit v php jako prazdnou array) Unika mi, v cem vidis zadrhel.

Si zkoukni ty odkazy, tam to ten program resi. U zalozky Rozvrhy je navic mozne prepinat zobrazeni Tabulka / Graficke. Coz v pripade toho ucitele je tam krasne videt, ze pro tabulkovem zobrazeni tam vubec nema kolonky pro pondeli a patek.

Kdybys resil kino, tak tady se mi libi celkem rezervacka na cinestar
http://opava.cinestar.cz/
Pavel Kr.
Profil *
Takže vypisování termínů jsem vyřešil tak, že si do DB uložím datum a číslo sloupce, do kterého daný termín patří (časy jsou konstantní a jedna zkouška zabere 1 políčko). Další problém z kterým se trápím je, jak to do stejné tabulky z DB vypsat.
Termíny nejdou hned po sobě. Například jeden patří do prvního sloupce (tj. od 8:00 - 9:30), další až třeba do třetího a další do šestého. Nevím jak mám vynechat mezi termíny, které nejsou hned po sobě volné buňky.

Potřebuji nějak dopočítat kolik má být volných.

Máte nějaký nápad?
Tori
Profil
Např.:

- vytáhnu z DB všechny termíny pro zobrazovaný týden (nebo tři týdny či kolik jich tam chcete)
- první termín si vytáhnu do proměnné $nejblizsi
- v PHP cyklem vypisuju jednotlivé řádky a buňky tabulky (můžete pracovat přímo s časem, ať už jako timestamp nebo DateTime)
 - pokud se začátek této buňky shoduje se začátkem termínu v $nejblizsi: (= while)
  - zobrazím termín, do $nejblizsi načtu další termín a cyklus opakuju
 - pokud ne, zobrazím prázdnou buňku (<td>&nbsp;</td> nebo tak něco) * 
* Jestli chcete volné buňky sloučit dohromady, tak tady si je budete počítat ($count++) a pokud narazíte na obsazený termín nebo konec dne, tak teprv vypíšete jednu buňku s colspanem.
Pavel Kr.
Profil *
Tori:
Díky za snahu, já už nevím, vyzkoušel jsem toho mraky. Přikládám kód, který mi správně "umístí" jen první nejnižší hodinu v daný den, v ostatních buňkách je "nic" i když by tam měla být data.

while ($zaz = mysql_fetch_array($vysl)){        
              
              $result = mysql_query("select pt.denni_hodina from planovane_terminy pt where pt.volno=1 and pt.datum='".$zaz["datum"]."' order by pt.denni_hodina");      //seradim hodiny od nejnizsi
              
                 echo "<tr>";
                 echo "<td>".$zaz["datum"]."</td>";
                 
                    
               $rec=mysql_fetch_array($result);
                   $nejblizsi = $rec["denni_hodina"];
                for ($i=1; $i<=7; $i++){
                      if($i==$nejblizsi){
                    echo "<td>".$nejblizsi."</td>";                                           
                   } 
                else {                    
                    echo "<td>nic</td>";
                }                    
                }                              
                 echo "</tr>";             
                 }
Tori
Profil
Pavel Kr.:
V tom while procházíte všechny možné termíny v ten den, nebo co? Dotaz na ř.3 by asi měl být ještě před while, jinak pokaždé budete pracovat jenom s prvním řádkem výsledku.
Pavel Kr.
Profil *
Tori:
Zapomněl jsem tam první řádek, kde je dotaz. Tím whilem procházím jednotlivé dny (řádky).
Toto je první řádek:
$vysl = mysql_query("select distinct pt.datum from planovane_terminy pt where pt.volno=1");
peta
Profil
- udelas si prazdne pole / tabulku, pro cely den
- vyberes vsechny terminy pro dany den
- pridas je k tabulce
- zobrazis tabulku do html

// prazdna tabulka
$tab = array();
for($j=0;$j<5;$j++) // 5 dni v tydnu
{
$tab = array();
for($i=0;$i<10;$i++) // 10 hodin
  {$tab[$j] = array();}
}
// naplnim tabulku daty
$res = ... // dotaz SELECT id, den_v_tydnu, hodina, text ...
while ($row=... && list($id,$j,$i,$value) = $row)
  {$tab[$j][$i] = $value;}
// prepisu do html a vypisu
$tbody = '';
for($j=0;$j<5;$j++) // 5 dni v tydnu
{
$tr = '';
for($i=0;$i<10;$i++) 
  {$tr.='<td>'.$tab[$j][$i].'</td>';}
$tbody.='<tr>'.$tr.'</tr>';
}
echo '<table>'.$tbody.'</table>';
Pavel Kr.
Profil *
peta:
Asi jsme se nepochopili. Záhlaví (hodiny) a dny v tabulce mám. Teď už jen potřebuji pro každý den (řádek) vyplnit jednotlivé buňky.

Budu teď řešit vypsání pro 1 den:
Z DB mi přijdou data, že tento den je x termínů. Já vím, že termín x patří do 3 buňky od začátku řádku, termín y patří do 5 buňky a termín z patří do 6 buňky. Potřebuji jen nějak zjistit kolik má být mezi jednotlivými termíny volných buněk.

Chci se zeptat: jak nejjednodušeji spočítat kolik volných buněk má před každým termínem být. (samozřejmě pokud je v daný den 7 vypsaných termínů tak je to v pohodě, protože všechny buňky daného řádku jsou obsazeny.)

Váš skript nefunguje line 19 vyhodí chybu.
peta
Profil
Pavel Kr.: To je jenom kostra, je treba doplnit sql dotazy a while (mista s ...), coz predpokladam zvladnes.

"zjistit kolik má být mezi jednotlivými termíny volných buněk"
Tohle prave resim tim, ze mam pevnou tabulku, treba
0, 0, 0, 0
0, 0, 0, 0
do ni doplnim terminy z db
0, 0, 1, 0
0, 2, 3, 0
a cele to vypisu do html, viz ten script.
Cili, pocet volnych bunek mezi mne netrapi.

Pokud to ma pres 2 vyucovaci hodiny:
0, 2, 2, 0, 3
t1: pozice = 1, delka = 2
t2: pozice = 4, delka = 1
4-(1+2) = 1 volne policko
Pozici A posunes o delku A a odectes pozici B. Pokud je rozdil zaporny, pak je to chyba, prekryvaji se. Pokud to neni chyba, tak bezi soucasne, treba v jinych mistnostech. Ale predpokladam, ze resis rozpis pro jednu mistnost, kde muze byt v jeden cas 1 termin.
Pavel Kr.
Profil *
peta:
Termíny můžou být jen takhle:
0, 2, 3, 0, 5
1, 0, 3, 0, 0
0, 0, 3, 4, 0
1, 0, 0, 0, 5

tj. 1. termín toho dne == 1. sloupec, 2. termín == 2. sloupec.
1 hodina == 1 políčko, žádné dvouhodinovky nejsou
Pavel Kr.
Profil *
Tak jsem to nakonec vyřešil. Vše dopočítávat, funguje to skvěle, díky všem za pomoc. Kdyby něco tak se opět ozvu. Kód jsem dávat nebudu je to přes 150 řádků.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: