Select Box přidání vychozí hodnoty

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

Potřeboval bych menší radu. Asi to je jednoduchý ale nevím jak toho dosáhnout.
Naplním si select box hodnotamy z databáze. Teď nevím jak mám nastavit první hodnotu boxu aby byla Vše.
Teď ten formulář po rozkliknutí dává možnost Milan Pepa. Potřebuju aby jako první položka byla Vše.

Model:

<?php
use Nette\Object;

class KomentareModel extends Object {

    public static function filtruj() {
        return dibi::fetchPairs('Select distinct komentare.id_uzivatele,username from users join komentare on users.id_uzivatele = komentare.id_uzivatele');
    }
}
?>

form v presenteru

<?php
protected function createComponentForm($name) {
            $prom = KomentareModel::filtruj();
            $form = new AppForm($this, 'form');
            $form->addSelect('uzivatel', 'Podle uzivatele', $prom);
            $form->addSubmit('send');
            $form->onSubmit[] = callback($this,'formSubmitted');
            return $form;
        }
?>
pupitooo
Člen | 10
+
0
-

Zkus toto:

...
array_unshift($prom, "vše");
$form->addSelect('uzivatel', 'Podle uzivatele', $prom)
	->setDefaultValue(0);
...
Do toho pole pro select přidej tu hodnotu "vše" s indexem jaký chceš a pak ten index nastav pomocí setDefaultValue() nebo setValue().
Milhaus87
Člen | 22
+
0
-

Tak to funguje ale ne tak jak by mělo

Editoval Milhaus87 (25. 2. 2011 13:47)

Patrik Votoček
Člen | 2221
+
0
-

pupitooo napsal(a):

Zkus toto:

… setValue().

setValue() se vyhni obloukem pokud doopravdy nevíš co děláš…

pupitooo
Člen | 10
+
0
-

Prozradíš mi prosím proč? Teď s tím řeším nějaké problémy u DependentSelectBoxu, tak by mě zajímalo, jestli nevíš o nějaké chybě, kterou jsem mohl přehlédnout…díky

Milhaus87
Člen | 22
+
0
-

No tak ono se to tam přidá jak píšeš. Problém je ale teďka v tom že:
puvodně byly hodnoty tyhle:
1 ⇒ Uzivatel1
3 ⇒ Uzivatel2

array_unshift($prom, „vše“);
se to o indexuje
0 ⇒ Vse
1 ⇒ Uzivatel1
2 ⇒ Uzivatel3

ale já potřebuju aby index zůstal stejnejů
0 ⇒ Vše
1 ⇒ Uzivatel1
3 ⇒ Uzivatel2

pupitooo
Člen | 10
+
0
-

Tak v tom případě to udělej přes array_merge:

$all = array("0" => "vše");
$result = array_merge($all, $prom);
Tohle ty indexy zachovává
Milhaus87
Člen | 22
+
0
-

mám to teďka takhle

<?php
protected function createComponentForm($name) {
            $all = array("0" => "vše");
            $prom = KomentareModel::filtruj();
            $result = array_merge($all, $prom);
            $form = new AppForm($this, 'form');
            dump($result);
            $form->addSelect('uzivatel', 'Podle uzivatele', $result);

            $form->addSubmit('send');
            $form->onSubmit[] = callback($this,'formSubmitted');
            return $form;
        }
?>

a stejnak se oindexuje jinak

dump($result)

array(3) [
   0 => "vše" (4)
   1 => "Milan" (5)
   2 => "Pepa" (4)
]

u pepi potřebuju aby byl index 3

pupitooo
Člen | 10
+
0
-

jen pro jistotu…když dáš dump($prom) tak tam máš index 3?

Milhaus87
Člen | 22
+
0
-

právě že mám

array(2) {
   1 => "Milan" (5)
   3 => "Pepa" (4)
}
pupitooo
Člen | 10
+
0
-

V tom případě ti moc nepradím. Ty potřebuješ ty dvě pole spojit se zachováním indexů. array_merge by to mělo umět.
kdyžtak mrkni na http://cz.php.net/…ay-merge.php
nebo zkus najít nějaký jiný způsob.
Kamenická metoda by byla udělat něco ve stylu:

$result = array("0" => "vše");
foreach ($prom as $key => $value)
	$result[$key] = $value;
Milhaus87
Člen | 22
+
0
-

Díky Kameník funguje :-). Ale stejnak se zkusím ještě podívat dotoho manuálu.

Editoval Milhaus87 (25. 2. 2011 14:15)

natrim
Člen | 73
+
0
-

nejjednoduší je union operátor:

<?php
$result = array(0 => "vše") + $prom;
?>

viz: http://cz.php.net/…rs.array.php

Milhaus87
Člen | 22
+
0
-

Díky to je lepší no.

Martin
Člen | 171
+
0
-

Díky, taky mi to pomohlo. Zajímavé je, že v dokumentaci php je to tak zastrčené, že když člověk neví, že právě to hledá, nevšimne si. Respektive popis i příklad se zabývají jen nahrazováním hodnot u textových klíčů. Ale také je zajímavé, že hledání řešení php ‚NENette‘ problému přes google stejně nakonec dostane hledajícího sem.

Editoval Martin (4. 4. 2011 22:42)

Nilp
Člen | 65
+
0
-

Lepší je použít skipFirst('Vše') metodu.