Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kalenteripohjaan varaukset?

Sivun loppuun

Tuomas213 [05.08.2011 00:23:55]

#

Moi

https://www.ohjelmointiputka.net/koodivinkit/24665-php-kalenteripohja

Jatkan varausjärjestelmän tekoa...
Miten saisin tuohon yllä olevaan kalenteripohjaan että saisin siihen näkymään ne päivät erilailla joissa esine on varattuna?

Grez [05.08.2011 01:16:44]

#

Haet tietokannasta esineen varaukset siltä ajalta, jolla kalenteri näytetään. Talletat ne vaikkapa taulukkoon ja sitten kun kalenteri tulostaa päiviä, tarkistat taulukosta onko varattu ko. päivänä ja käytät eri tyyliä.

Tuomas213 [05.08.2011 10:14:13]

#

Voisitko tarkentaa?

Kun en keksi miten tuo toimisi sellaisessa tilenteessa kuin jos varaus menee kuukauden tai jopa vuoden yli ja jos on enemmän kuin vain yksi varaus.

Lebe80 [05.08.2011 10:18:32]

#

Tee vaikka niin, että teet jonon varauksia useammalle päivälle tai voit rakentaa jonkin sortin "aloitusaika - päättymispäivä" tyylisen ratkaisun, jolloin tietenkin vertailut hieman muuttuvat. Lähinnä tässä ratkaisee se, millaista systeemiä osaat itse jatkokehittää.

Grez [05.08.2011 12:17:55]

#

Tuomas213 kirjoitti:

Kun en keksi miten tuo toimisi sellaisessa tilenteessa kuin jos varaus menee kuukauden tai jopa vuoden yli ja jos on enemmän kuin vain yksi varaus.

Itse taas en keksi miten kumpikaan näistä on ongelma. Toki pitää päättää miten useampi varaus samana päivänä esitetään.

seuraava on php:n syntaksia mukailevaa pseudoa

<?
//Näytettävän aikajakson alku ja loppu
$alku = ...
$loppu = ...

//Varausten haku kannasta
$sql->prepare('select alku, loppu, nimi from varaukset where alku<?php and loppu>?');
$sql->execute(array($loppu, $alku));
while ($rivi = $sql->fetch()) {
	$näytettäväAlku = PäivänOsuus(Max($alku, $rivi['alku']));
	$näytettäväLoppu = PäivänOsuus(Min($loppu, $rivi['loppu']);
	for ($päivä = $näytettäväAlku, $päivä <= näytettäväLoppu, $päivä += vuorokausi) {
		$varaukset[$päivä][] = $rivi['nimi'];
	}
}

// seuraava kunkin päivän tulostukseen
foreach ($varaukset[$päivä] as $varaus) {
	echo $varaus;
}

Metabolix [05.08.2011 12:48:12]

#

Grezin kyselyssä pitäisi varmaan olla vähän mutkikkaampi WHERE. (Edit: Aivan oikein se olikin.)

Varauksia ei myöskään ole pakko koota noin päivä kerrallaan, vaan niistä voi pitää kirjaa myös alku- ja loppuajan perusteella. Näin saadaan samalla vaivalla tehtyä tarvittaessa tyylikkäät merkinnät alkupäivälle ja loppupäivälle ja tuki päällekkäisille varauksille.

// Edit: Kysely korjattu, Grez oli oikeassa.
$kysely = $pdo->prepare("
  SELECT *
  FROM varaus
  WHERE alku <= ? AND loppu >= ?
  ORDER BY alku ASC
");
$kysely->execute(array($kuun_viimeinen_pvm, $kuun_ensimmainen_pvm));

$varaukset = $kysely->fetchAll(PDO::FETCH_OBJ);
reset($varaukset);

// Tulostetaan kalenteri:
$avoimet = array();
for ($paiva = ...) {
  // Kootaan avoimet varaukset taulukkoon.
  while (current($varaukset) && current($varaukset)->alku <= $paiva) {
    $avoimet[] = current($varaukset);
    next($varaukset);
  }
  // Poistetaan päättyneet varaukset taulukosta.
  foreach ($avoimet as $i => $varaus) {
    if ($varaus->loppu < $paiva) {
      unset($avoimet[$i]);
    }
  }
  if (empty($avoimet)) {
    echo "Vapaa\n";
  } else {
    echo "Varattu:\n";
    foreach ($avoimet as $varaus) {
      echo "\t", htmlspecialchars($varaus->nimi), "\n";
    }
  }
}

Minusta tässä koko hommassa nyt kuitenkin lähdetään väärästä päästä liikkeelle. Kalenterin tulostus on aivan yksinkertainen asia, toimiva varausjärjestelmä on näistä isompi homma eikä pahemmin liity siihen kalenteriin.

Grez [05.08.2011 13:15:47]

#

Metabolix kirjoitti:

Grezin kyselyssä pitäisi varmaan olla vähän mutkikkaampi WHERE.

Miksi ja millä tavalla? Omasta mielestäni se on täydellinen.

Metabolix kirjoitti:

$kysely = $pdo->prepare("
  SELECT *
  FROM varaus
  WHERE
    alku BETWEEN ? AND ?
    OR loppu BETWEEN ? AND ?
  ORDER BY alku ASC
");

Tuo sinun versiosi ei näytä varauksia jotka alkavat ennen näytettävää jaksoa ja päättyvät näytettävän jakson jälkeen.

Metabolix [05.08.2011 13:35:42]

#

Grez kirjoitti:

Tuo sinun versiosi ei näytä varauksia jotka alkavat ennen näytettävää jaksoa ja päättyvät näytettävän jakson jälkeen.

Totta, korjasin viestini.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta