Autor Zpráva
hal_sk
Profil
Zdravim.
Som začiatočník.
Mam jeden (ne?)problém. Spravil som taký web, na ktorý sa prihlasujú 2 tipy userov (student, ucitel).
Učitelovi sa zobrazí sekcia stránky pre zapisovanie známok študentom. Avšak tu sa to komplikuje.
Tomu učitelovi sa najprv zobrzí "sekcia1_vyber.php" v ktorom je zoznam študentov, v ktorom si vybere jednoho, ktorého chce známkovzaať.
Keď si jednoho vyberie, tak sa zobrzí "sekcia2_znamkuj.php" s formulárom kde učiteľ vyberie parametre známky pre študenta.
Keď formulár odošle, tak sa zobrazí ďalšia, "sekcia3_over.php", kde svoju novú známku pre študenta overí (preview) a potvrdí jej zapísanie.

A mňa by zaujímalo, že ako by sa dal ten pohyb medzi sekciami pre učiteľa nakódovať elegantnejšie, lebo to čo som spravil ja sa mi zdá dosť ťažkopádne. Vypadá to nejak takto:

Všetko sa odohráva na "index.php", kde je určitý DIV, do ktorého sa includujú tie sekcie, buď na základe kliknutia na odkaz ('index.php?akcia=znamkuj'), alebo po odoslaní formulára.
Realizujem to pomocou podmienok:

if ($_SESSION['user']=="student"):
 include ('sekcia0_student.php'); // ak sa prihlasi student

elseif ($_SESSION['user']=="ucitel" AND empty($_REQUEST['akcia']) AND empty($_GET['hidden'])):
 include ('sekcia1_vyber.php'); // vybere sa student pre oznamkovanie

elseif ($_SESSION['user']=="ucitel" AND $_REQUEST['akcia']=="znamkuj"):
 include ('sekcia2_znamkuj.php'); // formular  na znamkovanie

elseif ($_SESSION['user']=="ucitel" AND $_GET['hidden']=="mame_vybrane" AND empty($_REQUEST['akcia'])):
 include ('sekcia3_over.php'); // preview co sme zadali do formulara
endif;


Ako vidíte je to dosť ťažkopádne, lebo pre zobrazenie sekcií je traba uričť aj premenné ktoré majú ostať prázdne pre splnenie podmienky, aby nedošlo k includnutiu viacerých sekcií naraz. Ako sa to zvykne robiť?
blaaablaaa
Profil
switch ($_SESSION['user']) {
   case "student": {
      include ('sekcia0_student.php');
      break;
   }
   case "ucitel": {
      if ( $_REQUEST['akcia']=="znamkuj" ) {
          include ('sekcia2_znamkuj.php');
      } elseif ( $_GET['hidden']=="mame_vybrane" AND empty($_REQUEST['akcia']) ) {
          include ('sekcia3_over.php');
      } elseif (empty($_REQUEST['akcia']) AND empty($_GET['hidden'])) {
          include ('sekcia1_vyber.php');
      }
      break;
   }
}
Tomasds
Profil
Já to dělám tak, že includuju podle akcí, tzn. asi jako kdybys ty vyhodnotil $_REQUEST['akcia']=="znamkuj" a na základě toho (nikoliv session) rovnou includnul stránku. Na ní pak ověřím session. Když je, tak zobrazím co mám zobrazit, když ne, zobrazím hlášku o chybě a šmytec. To že si někdo případně otvírá něco, co nemá, tím si nebudu komplikovat život.

A jdu ještě o kousek dál. Nemám rád elseify, mám prostě v indexu asi 15 řádků, na každém jeden if a jeden include. Include se běžně opakuje.. další případné větvení (session ano/ne, učitel/žák, pokud se stránka pro ně má mírně lišit) až uvnitř includovaného souboru. Vše pro přehlednost.
tiso
Profil
hal_sk, blaaablaaa, Tomasds - ach jaj...
Tomasds
Profil
tiso
Máš lepší řešení? Tak nevzdychej a poraď.
blaaablaaa
Profil
tiso: jenom jsem upravil jeho "reseni" do prijatelnejsi podoby, pravda, porad prakticky nepouzitelne
hal_sk
Profil
Ako potom najelegantnejšie sprovozniť pohyb medzi sekciami stránky, napríklad aj na základe odoslaného formulára, ktorý includne buď sekciu pre opravenie hodnôt vo formuláry, alebo includne rovno sekciu pre preview a zápis hodnôt (po zistení či sú vo formuláry korektné alebo nekorektné údaje).

Ešte dnes pripravím nejakú zjednodušenú ukážku a zavesím ju niekde (pre znázornenie čo tu uvádzam). Strpenie prosím :-)
blaaablaaa
Profil
hal_sk
rozdel si stranky treba dle ucitele a studenta, a u ucitele treba na zacatku dej podminku
if ( $_REQUEST['akcia']=="znamkuj" ) {
  /// tady kod se znamkovanim
  exit;
}
if ( $_GET['hidden']=="mame_vybrane" ) {
 //tady to udela zas neco
 exit;  //pokud chces pokracovat ve vypise zbytku, tak exit nedavej...
}
//a tady klasicka stranka pokdu neni nic vybraneho


...
Majkl578
Profil
nejelegantnejsi? podle me treba ten switch (s tim ze by byly 2 v sobe) a v nem includovani nebo si na to udelat tridu, coz by tady nebylo od veci.
imploder
Profil
můžeš si udělat soubor, kde na každém řádku budeš mít jméno stránky, co se má naincludovat, a pak zadávat do proměnné číslo řádku. skript načte ten řádek a dosadí ho jako jméno do includu.
hal_sk
Profil
Zatiaľ to robím takýmto štýlom: http://hal.tym.sk/ukazka/index.php

Zdrojaky:

"index.php"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">;
  <title>pokus</title>
  </head>
  <body style='background-color:white;text-align:center;background-color:#5050 50;'>
<DIV id='hlavne_okno' style='width:800px;text-align:center;padding:20px;margin:auto;'>

<DIV id='menu' style='width:700px;background-color:white;margin:auto;margin-bottom:20 px;padding:10px'>
<li><a href='index.php?article=home'>Home</a></li><br>
<li><a href='index.php?article=formular'>Zadať údaj do DB</a></li><br>
</DIV>

<DIV id='pod_sekcie' style='margin-top:40px;width:700px;height:300px;background-color:white ;margin:auto;padding:10px;'>
<?
if ($_GET['odoslali']==1)
 {
 if (strlen($_GET['f_udaj_do_DB'])>2):
  $spravne_udaje = "ano";
 else:
  $spravne_udaje = "nie";
 endif;
 }

if ($_REQUEST['article']=="home")
 {
 include ('home.php');
 }

if ($_REQUEST['article']=="formular" OR $spravne_udaje=="nie")
 {
 include ('formular.php');
 }

if ($spravne_udaje=="ano")
 {
 include ('overit_a_zapisat.php');
 }

if ($_GET['zapis']==1)
 {
 echo "udaje zapisane !!! /len ako/";
 }
?>
</DIV>
</DIV>
  </body>
</html>


"home.php"
<h1>Tu je 'home.php'</h1>


"formular.php"
<h1>Tu je 'formular.php'</h1>
<br>

<form method='GET' action='index.php'>

 Zadajte novy udaj do DB (minimalne 3 znaky):
 <input type='text' name='f_udaj_do_DB' <? if (!empty($_GET['f_udaj_do_DB'])) echo "value='".$_GET['f_udaj_do_DB']."'";?>>
  <br><br>
 <input type='hidden' name='odoslali' value='1'>
 <input type='submit' value='dalej'>

</form>

<?
if ($_GET['odoslali']==1)
{
 echo "<p style='color:red;'>zadali ste nekorektne udaje</p>";
}
?>


"overit_a_zapisat.php"
<h1>Tu je 'overit_a_zapisat.php'</h1>
 <br>
<p>Zadali ste: <b><? echo $_GET['f_udaj_do_DB']; ?></b></p>
 <br>
<form>
 <input type='hidden' value='1' name='zapis'>
 <input type='submit' value='OK, zapisat udaje'>
</form>
<br>
<?
if (strlen($_GET['f_udaj_do_DB'])<3)
{
 echo "<p style='color:red;'>zadali ste nekorektne udaje</p>";
}
?>


Idem (skúsiť) tento princíp aplikovať na ten web čo som spomínal na začiatku. Snáď sa zasa nezamotám, už som to prekopával 2 krát, vždy dospejem do štádia že neviem čo s čím súvisí a preto pomažem kód do bodu keď to bolo ako tak prehľadné, a robím znovu.

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:

0