Autor Zpráva
Matyáš
Profil
Dobrý den,
Mám následující problém:
Na stránce mám 3 selecty. První je vyplněn PHP polem $skoly - vybírá se v něm škola.

Podle toho, jaká bude vybrána škola v prvním selectu nastane následující:
- Druhý select se vyplní seznamem učitelů dané školy z PHP pole s indexem názvu školy $ucitele["Škola 1"] = array("Učitel 1", "Učitel 2", "Učitel3");
- Třetí select se vyplní seznamem tříd sané školy z PHP pole s indexem názvu školy $tridy["Škola 1"] = array("1.A" , "2.A", "3.A", "1.B");

Zde jsou konkrétní soubory:

Soubor nastaveni.php:
//SEZNAM ŠKOL
  $skoly = array("Škola 1", "Škola 2", "Škola 3");
  
  //SEZNAM UČITELŮ JEDNOTLIVÝCH ŠKOL
  $ucitele["Škola 1"] = array("Učitel 1","Učitel 2", "Učitel 3");
  
  //SEZNAM TŘÍD JEDNOTLIVÝCH ŠKOL
  $tridy["Škola 1"] = array("1.A" , "2.A", "3.A", "1.B")

Soubor samotné php stránky
<?php
   include ("nastaveni.php");
?>
<select name="skola" id="skola">
   <?php
       foreach($skoly as $skola){echo '<option value="'.$skola.'">'.$skola.'</option>';}  
   ?>
</select>

<select name="ucitel" id="ucitel">
   <?php
       foreach($ucitele["název školy vybrané v selectu škola"] as $ucitel){echo '<option value="'.$ucitel.'">'.$ucitel.'</option>';}
   ?>
</select>

<select name="trida" id="trida">
   <?php
       foreach($tridy["název školy vybrané v selectu škola"] as $trida){echo '<option value="'.$trida.'">'.$trida.'</option>';}
   ?>
</select>
Pochopitelně, každé option přiřadím id, aby se to dalo zjišťovat, ale to záleží na zpracování.

Zkrátka potřeboval bych co nejjednodušší kód, který by toto prováděl. Musí se nejspíše použít Java Script, možná i AJAX.
Doufám, že jsem můj problém dostatečně formuloval.

Kdyby jste něco vymysleli, budu velmi rád. Vytrhnete mi trn z paty.
mimochodec
Profil
Jestli chceš, aby se učitelé načítali bez znovunačtení stránky, máš dvě možnosti. Buď ajax (google ajax multiple selects) nebo čistý JS, který by fungoval tak, že by se všechna data po vygenerování v php nasypala do polí v JS a pak se načítala do selectů na základě výběru. To lze použít, když těch dat bude rozumný počet.
Matyáš
Profil
Děkuji za Vaši reakci.
Kód jsem upravil následovně:
soubor php samotné stránky:

      ...
      <select name="skola" id="skola" onchange="zmena(this)">
      ...
      <select name="trida" id="trida"></select>
      ...
      <select name="ucitel" id="ucitel"></select>
      ...
      <script>
        function zmena(vyber)
        {
          skola = vyber.options[vyber.selectedIndex].value
          trida.innerHTML = "<?php foreach($tridy['"+skola+"'] as $trida){echo('<option>'.$trida.'</option>');}?>";
          ucitel.innerHTML = "<?php foreach($ucitele['"+skola+"'] as $ucitel){echo('<option>'.$ucitel.'</option>');}?>";
        }  
      </script>

Ale kód mi nefunguje. Nevím, jestli PHP vidí tu proměnnou. Ale podotýkám že na začátku stránky se nastaveni.php includuje - viz příspěvek výše.
Děkuji za Vaše reakce.
_es
Profil
Matyáš:
Skús si najprv pozrieť Nejčastější potíže s PHP (FAQ) » Jak přenést proměnnou z javascriptu do PHP.
mimochodec
Profil
Matyáš:
Snahu oceňuju, jsi na dobré cestě, ale tímto způsobem z JS volat php nelze. Začni tím, že si na začátku stránky dostaneš data z pole v php do pole v JS. Pak na řádcích 12, 13 projedeš všechny třídy a co bude sedět s hodnotou v skola, to do selectu nahraješ.
Matyáš
Profil
Teď trochu nevím, jak se převede pole z PHP do JS. Mohli by jste mi tu uvést konkrétní kód?
Napadá mě jen toto:
<script>
  ucitele = "<?php echo($ucitele); ?>";
</script>
Bude to fungovat? Převedou se správně i indexy (s názvy škol)?
Děkuji mnohokrát.
PS: FAQ jsem četl, ale je tam pouze kód pro běžnou proměnnou.
_es
Profil
Matyáš:
jak se převede pole z PHP do JS.
Viď json_encode.
Matyáš
Profil
Nemohl by jste být trochu konkrétnější?
Děkuji.
_es
Profil
Matyáš [#8]:
Ako vstupný argument tam dáš pole v PHP a ako návratovú hodnotu dostaneš pole v syntaxi JavaScriptu.
Matyáš
Profil
Takže takto o je správně?
<script>
  tridy = "<?php echo json_encode($tridy) ?>";
</script>
_es
Profil
Matyáš [#10]:
Ešte je vhodné použiť var: Časté potíže, zajímavosti a poučné debaty » Používejte var.
Matyáš
Profil
Nefunguje mi to, nevím, kde mám chybu:
<script>
  var tridy = "<?php echo json_encode($tridy) ?>";
  var ucitele = "<?php echo json_encode($ucitele) ?>";
</script>

<select name="skola" id="skola" onchange="zmena(this)">

<script>
    function zmena(vyber)
    {
        skola = vyber.options[vyber.selectedIndex].value
        trida.innerHTML = forEach(var ucitel in ucitele[skola]){document.write("<option value='"+ucitel+"'>"+ucitel+"</option>");};
        ucitel.innerHTML = forEach(var trida in tridy[skola]){document.write("<option value='"+trida+"'>"+trida+"</option>");};
    }
</script>

Existuje vůbec v JS foreach?
lionel messi
Profil
Matyáš:
Existuje vůbec v JS foreach?
JS v podstate nepoznám, ale vsadil by som svoje kľúče od bytu, že nie: Proč mám rád PHP — hneď v druhej časti máš príklad prechádzania poľa v JS.
mimochodec
Profil
Matyáš:
Existuje vůbec v JS foreach?

Myslím že ne.
Matyáš
Profil
Dobře, v top případě nevím, jak projít tu proměnnou a vypsat ji do <option></option>.
Mohl by jste mi prosím uvést kód?
_es
Profil
Matyáš
Profil
_es:
Protože potřebuji, aby se ty dva selecty vyplnily na základě prvního - myslím, že kdyby se to řešilo na serveru a posílalo klientovi, hodně by se to celé zpomalilo.
Nebo PHP umí také reagovat na události onchange?
_es
Profil
Matyáš:
Aha, pardon. Na menenie optionov musíš použiť iný kód, než máš, napríklad sa inšpiruj v Ajax přidání options do selectu nefunguje v IE. Okrem toho, Psaní metodou document.write po načtení stránky maže stránku..
Matyáš
Profil
_es:
Pochopil jsem správně, že autor článku má data uložená v XML? To mi připadá, lepší, než mé aktuální řešení. Sestavil jsem proto svoji XML databázi:

<?xml version="1.0" encoding="UTF-8"?>
<skoly>
  <skola>
    <abbr>skola1</abbr>
    <name>ŠKOLA 1</name>
    <ucitele>
      <ucitel>Učitel 1 ze školy 1</ucitel>
      <ucitel>Učitel 2 ze školy 1</ucitel>
    </ucitele>
    <tridy>
      <trida>1.C</trida>
      <trida>2.C</trida>
      <trida>3.C</trida>
      <trida>4.C</trida>
      <trida>5.C</trida>
      <trida>6.C</trida>
      <trida>7.C</trida>
      <trida>8.C</trida>
      <trida>1.A</trida>
      <trida>2.A</trida>
      <trida>3.A</trida>
      <trida>4.A</trida>
    </tridy>
  </skola>
  <skola>
    <abbr>skola2</abbr>
    <name>ŠKOLA 2</name>
    <ucitele>
      <ucitel>Učitel 1 ze školy 2</ucitel>
      <ucitel>Učitel 2 ze školy 2</ucitel>
    </ucitele>
    <tridy>
      <trida>1.A</trida>
      <trida>2.A</trida>
      <trida>3.A</trida>
      <trida>4.A</trida>
      <trida>5.A</trida>
      <trida>1.B</trida>
      <trida>2.B</trida>
      <trida>3.B</trida>
      <trida>4.B</trida>
      <trida>5.B</trida>
    </tridy>
  </skola>
</skoly>
Matyáš
Profil
Je to tak? Mohu takto použít XML, nebo bude lepší php proměnná?
Děkuji.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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