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

- simPod
- Člen | 383
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
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)

- Patrik Votoček
- Člen | 2221
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);
}
}

- Filip Procházka
- Moderator | 4668
Zkus
public function actionEdit($id)
{
$this['editItem']->setDefaults(array(
"test"=>"test"
));
}

- Patrik Votoček
- Člen | 2221
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
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
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
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
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);