předání proměnné do komponenty

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

zdravim.
Volam v Template komponentu pomoci:
{control editItem}

Zaroven mam v Template promennou $id

A potreboval bych nejakym zpusobem predat tu promennou $id do me komponenty, aby komponenta mohla pri renderovani zohlednit $id (v setValue()).

Ve vysledku bych poteboval, aby v komponente formulare bylo predepsane id polozky, ktere jsem si uz predtim vytahl z daabaze.

<?php
function createComponentEditItem()
	{
		$form = new Nette\Application\UI\Form;
		$form->addText('name', 'Název:')
			->setRequired()
                        ->setValue($id);
		$form->addSubmit('send', 'Edit');
		$form->onSuccess[] = callback($this, 'editItemSubmitted');
		return $form;
	}
?>

doufam ze je to trochu srozumitelne. Dik

mkoubik
Člen | 728
+
0
-

Zaprvé nepoužívej setValue() pokud nevíš proč to děláš. K nastavení výchozí hodnoty slouží $control->setDefaultValue() nebo $form->setDefaults().

K dotazu – hodnoty se dají do komponenty předat v action, nebo render metodě pomocí $this['nazevKomponenty']->setValue($value), pokud má komponenta příslušnou metodu. U tvého formuláře např. $this['editItem']['name']->setDefaultId($text).

Pokud máš $id dostupné v šabloně, předpokládám, že je dostupné i v render metodě. Jinak to zavání programováním v šabloně.

Editoval mkoubik (5. 10. 2011 0:08)

Nox
Člen | 378
+
0
-

->setDefaultValue($this->something_id) kde to something_id (id…no ale čeho?), si naplníš někde předtím… nevim jestli je vhodnější before render nebo startup, taky záleží k čemu to je

Moc se mi nelíbí zasahovat do komponenty mimo ni, pak aby člověk hledal kde všude je to měněný…

Patrik Votoček
Člen | 2221
+
0
-

běžně se to dělá v akci presenteru tj:

class FooPresenter extends BasePresenter
{
	public function createComponentEditItem()
        {
                $form = new Nette\Application\UI\Form;
                $form->addText('name', 'Název:')->setRequired();
                $form->addSubmit('send', 'Edit');
                $form->onSuccess[] = callback($this, 'editItemSubmitted');
                return $form;
        }

	public function actionEdit($id)
	{
		$this['editItem-name']->setDefaultValue($id);
	}
}
simPod
Člen | 383
+
0
-

super, diky vsem, uz se mi to povedlo

jeste jeden dotaz. pokousim se tam pres setDefaultValue() dostat array
(viz setDefaultValue((array("test"=>"test"))) ale to nefunguje, co delam spatne?
dik

Filip Procházka
Moderator | 4668
+
0
-

Zkus

public function actionEdit($id)
{
	$this['editItem']->setDefaults(array(
		"test"=>"test"
	));
}
Patrik Votoček
Člen | 2221
+
0
-

pokud to chceš nastavovat pro všechny prvky formuláře musíš použít $this['editItem'] (místo $this['editItem-name'] který vybere pouze prvek „name“) :-)

simPod
Člen | 383
+
0
-

ja se nevyjadril spravne, omlouvam se, nevim proc jsem to zapomnel :/

mam formularovy prvek Select (addSelect()) a v metode renderXXX nebo actionXXX do nej chci poslat array

zkousel jsem $this['myComponent']['selectfield']->setDefaultValues(array("test"=>"test"));
to ale pravdepodobne nefunguje… prosim o radu, dekuji

Filip Procházka
Moderator | 4668
+
0
-

Nejspíše chceš

$this['myComponent']['selectfield']->setItems(array("test" => "test"));

Ale to by jsi měl načítat a plnit v továrničce

$form->addSelect('selectfield', "Popisek", array("test" => "test"))
simPod
Člen | 383
+
0
-

setItems()! to je ono, dekuji.
Mno a jeste jedna vec

v modelu mam metodu na ziskani dat z databaze z tabulky

<?php
function getAll()
	{
		return $this->connection->table('items');
	}
?>

V prezenteru ji zavolam a dostanu zpatky 3 sloupce (id, nazev, druhe_id) v objektu. A ted potrebuji nastavit do Selectu pole (pomoci setItems() metody)ve tvaru array(id=>nazev,id=>nazev...). Tzn. aby v Selectu v Option byly zobrazena data z tabulkoveho sloupce nazev a hodnota byla ze sloupce id. Sloupec druhe_id by se vynechal. Je na to nejaka Nette vzchztavka, nebo musim rucne objekt preformatovat do pole?
Dekuji

Editoval simPod (6. 10. 2011 21:47)

Filip Procházka
Moderator | 4668
+
0
-

Dibi na to má vychytávku, vypadala by takto:

function getPairs()
{
	return $this->db->select('id,nazev')->from('table')->fetchPairs();
}

Nette\Database na to asi vychytávku nemá, nebo ano? Takže ručně.

$pairs = array();
foreach ($this->model->getAll() as $row) {
	$pairs[$row->id] = $row->nazev;
}

$form->addSelect('selectfield', "Popisek", $pairs);
22
Člen | 1478
+
0
-

řek bych, že jo

$array = $table->fetchPairs($key, $value);
simPod
Člen | 383
+
0
-

funguje, díky všem!