Autor Zpráva
Hando
Profil
Zdravím, vážení.

Zasekl jsem se u řešení problému, resp. při snaze nalézt co nejjednodušší řešení a tímto bych vás rád požádal o nakopnutí (myšlenkové :) ).

Nyní k problému:


Mám databázi, v ní uložené výukové hodiny, jejich časové rozmezí a další informace. Není problém z toho zjistit, kdy hodina začíná/končí a vypočítat délku výuky. Podle zjištěných hodnot následně vypočítat vzdálenosti od levého okraje a umístit "hodinu" na příslušnou pozici. Při navazující výuce (A a B) není problém. Problém však nastává, pokud hodina běží v jiné výukové místnosti/tělocvičně a vytváří tak překrývající se časový interval (C).
- Ke zobrazení jednotlivých hodin v řádku dne používám DIVy (je vhodnější alternativa? SPAN?).
- Jakým způsobem napozicovat překrývající se hodinu pod standardní? Řešením by jistě bylo, dotázat se databáze, zda v tom časovém intervalu již nějaká hodina běží a podle toho přiřadit divu příslušnou pozici od horního okraje. Tomu bych se rád vyhnul, pokud existuje jiné řešení (ideálně html/css).
- Lze tedy přinutit prvky zarovnat se vedle sebe podle polohy od levého okraje a v případě, že je místo již obsazené, tak zaujmout místo níže?

Možná se snažím znovu vynalézt kolo, nebo na to jdu zbytečně složitě. Snažil jsem se hledat (tady na djpw jsem nenalezl), jinde jsem našel pouze zbytečně nabobtnalá horizontální timeline řešení, což je pro tento případ zbytečné.

Snad jsem to napsal pochopitelně.
Budu vděčný za každou radu,
předem děkuji.
Joker
Profil
Hando:
Není problém z toho zjistit, kdy hodina začíná/končí a vypočítat délku výuky. Podle zjištěných hodnot následně vypočítat vzdálenosti od levého okraje a umístit "hodinu" na příslušnou pozici.
Proč tak složitě?

Jestli jde o klasický rozvrh hodin, tak hodina nemůže začínat kvykoliv (třeba v 8.12 nebo 9.23), ale jsou „okýnka“, do kterých se hodiny umisťují (1. hodina je od někdy do někdy, 2. hodina od někdy do někdy, atd.) Nemůžu třeba posunout o 10 minut začátek jedné konkrétní výuky, kdybych o 10 minut posunul začátek některé hodiny, znamenalo by to automaticky posun u všeho, co se v danou hodinu vyučuje.
V takovém případě je podle mě rozvrh tabulka a udělal bych to jako tabulku.
Místo času začátku bych si ukládal počáteční okénko plus délku trvání (např. v rozvrhu začíná 1. okénkem a zabírá 2 okénka).
U nepřekrývající se výuky pak už jen stačí vložit buňky se správně nastavenými colspany.

Překrývající se výuka je horší, tam záleží na tom, jak jsou ta data organizovaná. Asi bych si to seřadil chronologicky, zjistil překrývající se hodiny, rozdělil si je do řádků a potom ty řádky vypsal.
Hando
Profil
Joker:
Proč tak složitě?
No, toť právě ten problém, jelikož se nejedná přímo o rozvrh hodin ve škole, ale o rozvrh tréninků sportovní organizace. A vzhledem k tomu, že působíme na několika lokalitách, mnohdy i ve stejný den a počátky tréninků se mohou lokalitu od lokality lišit, co se týče minut - někde v x.00, jinde x.30 jinde zase x.45. Pravdou je, že tréninky jsou hodinové. Ale jak říkám, o pozici normálních hodin mi ani tak nejde - byť je to možná složité, tak se to dá celkem snad přes php a mysql určit.
Ale přiznávám, že se mi nějak nechce zjišťovat pro každou hodinu, zda v ten den na daném místě a v daný čas neběží paralelní či částečně se překrývající hodina. A že jistě budou.

záleží na tom, jak jsou ta data organizovaná.
Můžeš to prosím nějak rozvést? Možná je za tím zrovna to, co mi uniká. Byť to neřeší zpracování samotnýho výpisu bez vertikálního pozicování DIVů.
Jinak data mají mysql strukturu zhruba následující:
id(záznamu)(int) | lokalita(char) | skupina(char) | začátek(time) | konec(time) | ... případně doplňující popisky.
Ivy
Profil
Proč neuděláš pro každou lokalitu samostatný řádek? Bylo by to i přehlednější.
lokalita 1 8.00-10.00
lokalita 2 9.00-11.00
lokalita 3 10.00-12.00
Hando
Profil
Ivy:
Však ano, pro každou lokalitu bude vypsaná vlastní tabulka (jsem to nikde explicitně nenapsal, pravda :) ) na stránce, nebo na jiné, to už je jedno.
Popíšu to jinak:
Lokalita Praha - v budově ZŠ k dispozici cca 3 tělocvičny. V jedné tělocvičně dvě různé tréninkové skupiny ve stejný čas - každá skupina musí mít vlastní záznam, jelikož je potřeba s tím dál pracovat (přihlašování členů, tréninkové plány apod.). Ve druhé tělocvičně další třeba jediná skupina, ale s posunutým časem tréninku.
Lokality jsou samozřejmě oddělené, proto sloupec lokalita v DB, ale kdybych dělal pro každou tělocvičnu vlastní řádek... no, to by se možná ještě dalo. Ale pokud jsou v jedné tělocvičně třeba 2 skupiny, nutně musím rozdělit i ten řádek.
Což by asi šlo, ale je to takové obcházení toho, nač se vlastně ptám prapůvodně - „zpracování samotnýho výpisu bez vertikálního pozicování DIVů".

Jestli se blbě vyjadřuji, tak se omlouvám. :)
aDAm
Profil
Sice stále moc nechápu, ale dělal jsem appku pro rozvrh na VŠ a tam se díky skupinám ty bloky taky různ překrývaly a ještě v okamžiku kdy se pro jeden den mělo vypsat 10 tříd. Je potřeba se chytnout nějakého pevného okraje. Ty časy začátku a konce můžou být libovolné? :02, :13 atd? Nebo jsou v zadaných bodech? Třeba co 15min? :00, :15, :30 atd.? Pokud takto pevně tak si podle nich udělat mřížku a pak už jen stačí spočítat do které buňky patří začátek hodiny a kolik colspanu má mít. V případě že je potřeba více záznamů do jednoho dne tak to řešit rowspanem. No já jsem tak ještě pak řešil aby se prázdné hodiny spojovaly a vytvářelo to tak ucelený rozvrh co se dal tisknout.
peta
Profil
[#1]
c) ne
b) pouzivas spatny vzorecek pro vypocet pozice zleva
a) pouzil bych tabulku, tabulka se nerozsype bez css ani pri chybnem css
d)* mezi dve po sobe jdouci hodiny bych nedaval mezeru

policko = (cas - 8 / 0.5)
cas zacatku minus 8 hodin zacatek prvni hodiny deleno 30 minut delka jedne hodiny, tim urcis do ktereho policka to spada. Policko * sirka + 5px = poloha zleva.

Prekryvani? V php neni isset nebo porovnani ($array[$i]>0)?
Si zapisujes do pole, ktera policka jsou jiz obsazena. Pokud issetem/porovnanim najdes shodu, tak zkusis dalsi radek. existuje radek, existuje v nem vyplnene policko? Ne, ne, pridas radek, pridas vyplnene policko.
Pak podle tohoto pole vygenerujes html tabulku (at uz jako tabulku nebo divy)
Pro vypocet policka pro zacatek a konec muzes pouzit stejny vzorecek, co jsem napsal, jen dosadis jiny cas.
Hando
Profil
peta:
c) ne
Co ne? To je odpověď na „Lze tedy přinutit prvky zarovnat se vedle sebe podle polohy od levého okraje a v případě, že je místo již obsazené, tak zaujmout místo níže?“?


b) pouzivas spatny vzorecek pro vypocet pozice zleva
Jaký vzoreček? Já jsem ani žádný neuvedl, tak podle čeho soudíš, že je špatný? Podle toho obrázku?
Ten obrázek je pouze ilustrativní, načmáraný během asi dvou minut v malování, abych snadněji demonstroval, oč mi jde. Znovu opakuji, že mi jde o to, zda lze přimět DIV (C) zaujmout pozici pod jiným DIVem (A), pokud mu již obsadil místo, čistě pomocí HTML a nějaké CSS vlastnosti. Buhužel začínám tušit, že to budu muset vše počítat.
Vůbec neřeším, zda mezi políčky mezera je, nebo ne. To už je datail.

V php neni isset nebo porovnani ($array[$i]>0)?
Vím, že to existuje, ale viz předchozí příspěvky - několikrát jsem psal, že bych se rád vyhnul, bude-li to možné.

aDAm:
Já jsem několikrát koukal do našeho VŠ rozvrhu, jak je to řešené, ale asi až nyní mě to přivedlo na nápad.
U naše rozvrhu je použitá tabulka, rozdělující na dva sloupce Den|Časová osa. Pro každý den je použit pouze jeden řádek i v případě překrývající se výuky, která je zapsána pomocí dalšího řádku, vytvořeného SPANem. Bez jakékoliv mřížky, bez jakéhokoliv divu. Vše má evidentně počítanou šířku, zarovnání do bloku atp. Zkusím se vydat tímto směrem.

Děkuji za reakce. :)
aDAm
Profil
Hando:
myslím že je vhodnější držet se mřížky tabulky pokud to začátky hodin dovolí.
peta
Profil
Hando: Aha, tak to jo. Z tveho prispevku jsem usoudil, ze uz mas jakousi svoji verzi, ktera to nejak sklada. A protoze to jinak neumis, tak to muzes leda pocitat polohu zleva.
V css to nejde samo od sebe.
Myslim si, ze bude jednodussi si tech 10-20 radku naprogramovat. Ale mozna by se dalo i najit js nebo php reseni googlem. Podobne to urcite musi resit kalendare.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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