Naplnění select boxu z databáze

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
spm6
Člen | 1
+
0
-

Zdar. Tak protože to zde ještě není nebo jsem to nenašel, popíšu vám nováčkům jako jsem já, jak na to.
Výchozí situace:

  1. mám v databázi tabulku auto s dvěma sloupci – id, název

id nazev
1 audi
2 skoda
3 fiat

  1. chci aby se mi v selectu rozbalily názvy a chci aby hodnota předaná dál tím selectem bylo id – v čistém html by to vypadalo takhle:
<select>
	<option value=1>audi</option>
	<option value=2>skoda</option>
	<option value=3>fiat</option>
</select>

Jak to udělám? Dost snadno. Bude mi k tomu stačit pár řádků kódu.

1. věc – dibi. Dibi je framework, který není součástí nette. Značně ulehčuje práci s databázemi oproti mysql_ funkcím čistého PHP. Snadno se používá. Vše potřebné naleznete zde: https://dibiphp.com/cs/quick-start. Stáhněte si dibi do svého www adresáře na serveru.

2. věc – nalinkujte si dibi. Já obecně k linkování používám proměnnou, která směřuje do www složky a tu používám, když je potřeba zadávat někde nějaké umístění.

$root="c:/Program Files/EasyPHP-5.3.8.1/www/";
require $root.'dibi/dibi-minified/dibi.min.php';

3. věc – nastavte si spojení pro dibi

dibi::connect(array(
    'driver'   => 'mysql',
    'host'     => 'localhost',
    'username' => 'root',
    'password' => '',
    'database' => 'auta',
    'charset'  => 'utf8',
));

4. věc – vyberte z databáze, co potřebujete

$vysledek = dibi::query('SELECT * FROM [auto]');

5.věc – teď potřebujete z obsahu proměnné $vysledek takovéhle asociativní pole:

$auta = array(
    '1' => 'audi',
    '2' => 'skoda',
    '3' => 'fiat'
    )

a to uděláte tímhle příkazem:

$auta = $vysledek->fetchPairs('id', 'nazev');

6. věc – potřebujete už jen v objektu form (viz. dokumentace Formuláře) vytvořit select a jako hodnoty mu zadat asociativní pole.

$form->addSelect('auta', 'Značka auta:', $auta)
     ->setPrompt('Zvolte značku ');

Hotovo.

Editoval spm6 (11. 10. 2012 19:42)

22
Člen | 1478
+
0
-

Tohle bych teda neviděl, jako tip na správný postup… snad krom bodu 1) se dělá vše jinak..

drakul
Člen | 37
+
0
-

@22: a smím se zeptat jak? Používám stejný postup jako autor.

Nox
Člen | 378
+
0
-

Připojení k DB bych dal do samostatného tématu, každopádně:

  1. Ne do www adresáře, ale do libs
  2. $root="c:/Program Files/EasyPHP-5.3.8.1/www/"; to fakt ne! Když projekt přesuneš kamkoli jinam, přestane fungovat … použít LIBS_DIR

Ale jinak myslim že to pro začátečníka není úplně blbě, samozřejmě configurace líp do config.neon, stačí id, name místo *, ale…

22
Člen | 1478
+
0
-

není zřejmé, jestli autor používá celé Nette.. pokud ano, tak pak:

  • 2. věc: není potřeba linkovat, když máme robotLoader
  • 3. věc: máme DibiExtension
  • 4 – 5. věc: budiž
  • 6. věc: data formuláře se plní v action metodě…

Editoval 22 (11. 10. 2012 20:46)