SELECTBOX načítaný z databáze

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

Zdravím,

do Nette už jsem nějakou dobu nedělal a skoro všechno jsem zapomněl. Takže tu jsem jako začátečník. :P Každopádně bych potřeboval pomoct. Mám dvě tabulky. První označuje knižní série a druhá knižní svazky. Série je rodičem svazků. Např.:

Série: Harry Potter
Svazek: Vězeň z Azkabanu

A tyhle data bych potřeboval vypsat do selectboxu, buď v tomto tvaru: Série – svazek a nebo

Série
- Svazek
- Svazek 2
- …
Série 2
- Svazek
- …

Pomohl by mi někdo?

Oli
Člen | 1215
+
0
-

dokumentaci píšou jak na to.
Jinak z db dostaneš pole třeba takhle

$arr = array();
foreach $this->booksRepository->getAll() as $book {
	$arr[$book->id] = $book->serie->title.' - '.$book->title
}

Když si s tím pohraješ, tak by jsi měl dostat i tu stromovou strukturu

honos
Člen | 109
+
0
-

Uz se to tady resilo ale nemuzu to najit.
Zkus se podivat semsem

Nebo pouzit neco takoveho:

$polozkySelect = [];
foreach($this->database->select('name')->from('knihy') as $row){
    foreach($row->ref('svazky') as $svazek){
        $polozkySelect[$row->name][$svazek->id] = $svazek->name;
    }
}

Ja ti ted nevim jestli je to zcela spravne ale Jako takovy htuby nastrel by ti to mohlo poslouzit. Dale je to zavisle jakou presne pouzivas strukturu DB a nasledne podle toho pouzijes $row->ref(...) nebo $row->related(...) a pod…

EDIT: Aneb jak pisi @Oli

Editoval honos (9. 2. 2014 12:07)

Minoru
Člen | 11
+
0
-

honos napsal(a):

Uz se to tady resilo ale nemuzu to najit.
Zkus se podivat semsem

Nebo pouzit neco takoveho:

$polozkySelect = [];
foreach($this->database->select('name')->from('knihy') as $row){
    foreach($row->ref('svazky') as $svazek){
        $polozkySelect[$row->name][$svazek->id] = $svazek->name;
    }
}

Ja ti ted nevim jestli je to zcela spravne ale Jako takovy htuby nastrel by ti to mohlo poslouzit. Dale je to zavisle jakou presne pouzivas strukturu DB a nasledne podle toho pouzijes $row->ref(...) nebo $row->related(...) a pod…

EDIT: Aneb jak pisi @Oli

Díky. Je ale v pořádku mít cyklus v cyklu? Jiná metoda mě sice nenapadá, ale asi to nebude nejrychlejší.

Minoru
Člen | 11
+
0
-

Zdravím,

mám tu další problém a nechci kvůli tomu zakládat další téma. V presenteru vytvářím komponentu:

	/**
	 * Vytvoří komponentu formuláře pro přidávání/upravování svazků
	 * @return $form Formulář
	 */
	protected function createComponentUpdateVolumeForm()
	{
		$form = new Nette\Application\UI\Form;

		$form->addText("name", "Název svazku:")
			 ->setRequired("Musíš vyplnit název svazku!");

		$series = $this->database->table("series")->where("author = ?", $this->user->id)->fetchAll();

		$form->addSelect("series", "Série:", $series)
			 ->setRequired();

		$form->addSubmit("send", "Uložit");
		$form->onSuccess[] = $this->updateVolumeFormSucceeded;

		return $form;
	}

Ale proměnná $series mi vrací jenom ID, zatímco samotný dotaz (když ho nechám proběhnout v admineru) mi vrátí ID i NAME. (Má to vracet řádky id a name.)

Díky předem. :)

jiri.korejtko
Člen | 8
+
0
-

Minoru napsal(a):

Zdravím,

mám tu další problém a nechci kvůli tomu zakládat další téma. V presenteru vytvářím komponentu:

	/**
	 * Vytvoří komponentu formuláře pro přidávání/upravování svazků
	 * @return $form Formulář
	 */
	protected function createComponentUpdateVolumeForm()
	{
		$form = new Nette\Application\UI\Form;

		$form->addText("name", "Název svazku:")
			 ->setRequired("Musíš vyplnit název svazku!");

		$series = $this->database->table("series")->where("author = ?", $this->user->id)->fetchAll();

		$form->addSelect("series", "Série:", $series)
			 ->setRequired();

		$form->addSubmit("send", "Uložit");
		$form->onSuccess[] = $this->updateVolumeFormSucceeded;

		return $form;
	}

Ale proměnná $series mi vrací jenom ID, zatímco samotný dotaz (když ho nechám proběhnout v admineru) mi vrátí ID i NAME. (Má to vracet řádky id a name.)

Díky předem. :)

Snad ti pomůžu, to samé jsem už kdysi řešil. Použil jsem

$categoryPairs = $this->categoryExercisesRepository->findAll()->
                fetchPairs('id_category_exercises', 'name_category_exercises');

kde pomocí fetchPairs(‚id_category_exercises‘, ‚name_category_exercises‘); jsem si vyselectoval 2 sloupce, které jsem zrovna potřeboval :)