Multiselect naplnění z DB + optgroup

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

Zdravím právě se snažím převést jeden projekt do Nette frameworku a nejspíš jsem špatně hledal či jsem to překoukl, ale nikde jsem nenašel nějaké poštouchnutí jak na formulářová pole vyplněná z DB… Potřebuji to zejména pro multiselect kde načítám do multiselectu kategorie a podkategorie pro přidání nového položky do db a to tak že kategorie je tzv optgroup, která obsahuje podkategorie… Mohl by mě někdo nějakým směrem poštouchnout, abych si mohl v klidu vychutnat kávu z Nette automatu, místo trhání vlasů

edit: typo

Editoval merlinof (24. 2. 2011 20:00)

Aurielle
Člen | 1281
+
0
-

Nějak takto, uprav si to pro použití s databází tak, aby byla dodržena uvedená struktura:

$form->addSelect('category', 'Kategorie', array(
	'kategorie 1' => array(
		'value 1' => 'polozka 1',
		'value 2' => 'polozka 2',
		// ...
	),
	'kategorie 2' => array(
		// ...
	),
));
h4kuna
Backer | 740
+
0
-

stačí vytvořit víceúrovňové pole

<?php
$countries = array('eu'=>array('cz','ge'), 'usa'=>array('NY', 'LA'));

$form->addSelect('country', 'Country:', $countries);
?>

PS: je to z hlavy kdyby to nešlo písni.

EDIT gmvasek byl jsi rychlejší :D

Editoval matata (24. 2. 2011 20:32)

merlinof
Člen | 5
+
0
-

Super díky akorát jsem změnil AddSelect na AddMultiSelect.. ted ještě zjistit jak ty hodnoty z té db dostat do těch polí :)

blacksun
Člen | 177
+
0
-

Při struktuře záznamů svetadil, zkratka, stat třeba takto (z hlavy):

<?php

  $staty = dibi::query('SELECT [svetadil], [zkratka], [stat] FROM [staty]')->fetchAll();

  $countries = array();
  $svetadil = NULL;

  foreach ($staty as $zkr=>$stat) {
    if ($stat['svetadil'] != $svetadil) $svetadil = $stat['svetadil'];
    $countries[$svetadil][$zkr] = $stat['stat'];
  }

  $form->addSelect('states', 'Staty:', $countries);

?>
merlinof
Člen | 5
+
0
-

toho foreach jsem se bál aby to nevytěžovalo server, jde o to že mám dvě tabulky kategorie(id,nazev) a podkategorie (id,id_kategorie,nazev) takže musím pro každe id z kategorie projít podkategorie tak abych mohl vložit do multiselectu tuto strukturu

evropa (to bude optgroup)
ČR
Slovensko

Asie
Rusko
Čína
 …

S tím že value hodnota pro zemi (podkategorii) bude ve formatu idkategoriexidpodkategorie (např 1×1 pro čr) tak abych mohl dejme tomu město přiřadit jak do kategorie tak podkategorie… možná na to jdu od lesa, ale víc mi to ted nemyslí a nenapadá mě lehčí řešení aby to nevytěžovalo extrémně server

h4kuna
Backer | 740
+
0
-

pokud ta iterace nebude mit 106 průchodů tak pohoda a jako že na světě je něco přes 200 států

EDIT co třeba cache vytvořeného pole??

Editoval matata (24. 2. 2011 22:53)

merlinof
Člen | 5
+
0
-

Možná mylně, ale domníval jsem se že bych použil dvě funkce jedna na výběr kategorií a druhá na výběr podkategorií se vstupním argumentem idkategorie…

momentálně to mám řešený tak že jedním dotazem v php načtu do jednoho pole všechyn kategorie a přes smyčku while volám právě druhý sql dotaz nad tabulkou podkategorie se vstupním parametrem idkategorie a tímto cyklem vyplním onen Multiselect … toto se mi zdá dost prasácké byt je jenom necelých 200 kategorií.. asi bych si měl pořádně prostudovat mysql referenční příručku zda by to nešlo nějakým JOINem spojit a to jenom jako pole v poli přiřadit dle již výše uvedeného příkladu :(

edit:
tak jsem zde v diskuzi našel úplně stejný problém
https://forum.nette.org/…ek-v-sablone

Editoval merlinof (24. 2. 2011 23:49)