Defaultní hodnoty formuláře, jak načíst do Presenteru

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

Ahoj, mám Nette 2.0 ALPHA 5.2 NONPREFIX. PHP 5.2.
Můj dotaz, potřebuji si načíst do formuláře defaultní hodnoty(z DB), jenže nevím jak na to, když ten formulář je v presenteru a hodnoty se mi daří načíst jen do šablony. V presenteru to píše vždy, že nejsou definovány.
Úryvek toho co mám a hlásí, nedefinované hodnoty proměnné $post.

public function renderSingle($id)
{
$this->template->titulek = 'editace';
$this->template->post=EditModel::fetchSingle($id);
}
public function createComponentEditForm() //nešlo ani ($id)
{
$this->template->post = EditModel::fetchSingle($id); //jen jsem zkoušel, ale bez výsledku, prostě to asi do Presenteru neumí načíst
$f = new AppForm;
$f->addText('rubrika','Rubrika:')
        ->setDefaultValue($post['rubrika']);
$f->addText('datum','Změněno:')
        ->setDefaultValue($post['zmeneno']);
$f->addTextArea('obsah','Obsah:')
        ->setDefaultValue($post['obsah']);
$f->addSubmit('uprav','upravit');
$f->addHidden('id',$this->request->params['id']);
$f->onSubmit[] = callback($this, 'signInFormSubmitted');
return $f;
}

Mě napadlo, dát tedy formulář do šablony, ale tam se mi vykreslí akorát jako text, navíc jsem někde četl, že se to do šablony nemá dávat, a radši bych to měl také v presenteru, abych mohl kontrolovat jeli odeslaný… Díky moc

Jan Endel
Člen | 1016
+
0
-

$this['editForm']->setDefaults(EditModel::fetchSingle($id)); ? za predpokladu ze to vracis jako array

//edit: jeste je zapotrebi kontrolovat, jestli ten formular jeste nebyl odeslan, aby si neprepsal posilana data

Editoval pilec (2. 4. 2011 23:19)

voda
Člen | 561
+
0
-

Jen doplním, že volání setDefaults by mělo být v render metodě.

jackm
Člen | 54
+
0
-

Děkuji to mi už funguje. Mám ale další problém.
Presenter

public function signInFormSubmitted($f)
{
$id=$this->request->params['id'];
$data=$f->getValues();
$this->template->edit = EditModel::editSingle($id);
}

Model

public static function editSingle($id) {
return dibi::query('UPDATE [prispevky] SET [rubrika],[zmeneno],[obsah]', $data, 'WHERE [id]=%i', $id);
}

Chyba je, že to nenačte proměnnou $data model, ale myslím že i ten query jsem sestavil blbě, dělám to pokus omyl…

Jan Endel
Člen | 1016
+
0
-
  1. je zapotrebi tu promenou $data do modelu predat ( EditModel::editSingle($data,$id); )
  2. sloupce si umi dibi vyresit samo, staci tedy: dibi::query('UPDATE [prispevky] SET ', $data, WHERE [id] = %i, $id);

Editoval pilec (2. 4. 2011 23:37)

jackm
Člen | 54
+
0
-

Díky moc za pomoc. Myslím, že ten dotaz by měl mít ještě '' u WHERE tedy:

public static function editSingle($id) {
return dibi::query('UPDATE [prispevky] SET', $data,'WHERE [id] = %i', $id);
}

Presenter jsem upravil:

public function signInFormSubmitted($f)
{
$id=$this->request->params['id'];
$data = $f->getValues();
EditModel::editSingle($data,$id);
$this->template->edit = EditModel::editSingle($id);
}

Ale $data v Modelu jsou pořád nedefinovány. :(

Editoval jackm (2. 4. 2011 23:47)

wise
Člen | 161
+
0
-

Zkus

<?php
public function signInFormSubmitted(AppForm $f)
?>

popř. print_r($data), abychom věděli, jestli je či není problém v tomto

Editoval wise (2. 4. 2011 23:55)

jackm
Člen | 54
+
0
-

Takže $data array se vypíše akorát v presenteru. V Modelu už to hlásí, že není definován $data. Takže je chyba v předání. Konkrétně asi tady:

$id=$this->request->params['id'];
$data = $f->getValues();
EditModel::editSingle($data,$id);

Editoval jackm (3. 4. 2011 0:00)

Jan Endel
Člen | 1016
+
0
-

public static function editSingle($id)public static function editSingle($id, $data)

Editoval pilec (3. 4. 2011 0:01)

jackm
Člen | 54
+
0
-

Strašně moc Vám všem děkuji, bez Vás bych to nevyřešil, jste super!
pilec: Mě todle taky už napadlo, ale pak to nešlo, nakonec to chtělo změnit ještě i v Presenteru:

$this->template->edit = EditModel::editSingle($id,$data);

Díky

Jan Endel
Člen | 1016
+
0
-

od toho forum je, jinac doporucuju si procist quick start jeste a nedelat to pres osklive staticke funkce, ktere jsou fujík.

jackm
Člen | 54
+
0
-

Tož nevím jak je to možný, ale když to šlo byl zakomentovaný dotaz.
Všiml jsem si toho, odkomentoval ho a najednou to nejde. :‚(
Dotaz: return dibi::query('UPDATE [prispevky] SET‘, $data,‚WHERE [id] = %i‘, $id);

DibiDriverException #1064

Va-B�e syntaxe je n�jak� divn� bl-B�zko '1 WHERE `id` = 0, 2011, 0, 1' na ��dku 1 search►
SQL ▼
UPDATE `prispevky`
SET 1
WHERE `id` = 0, 2011, 0, 1

163:                throw new DibiDriverException(mysqli_error($this->connection), mysqli_errno($this->connection), $sql);
Jan Endel
Člen | 1016
+
0
-

do id nedostavas spravnou hodnotu, misto id prispevku tam dostavas cert vi co.

jackm
Člen | 54
+
0
-

Změnil jsem všude pořadí $data,$id a jde to.

public static function editSingle($data, $id) {
EditModel::editSingle($data,$id);
$this->template->edit = EditModel::editSingle($data,$id);

Takže moc díky, a k těm statickým funkcím, já jsem rád, že to jakstaks chápu. :D
Ten QUICK jsem se to podle něj chtěl učit, ale prostě jsem to vůbec nechápal. Až jeden tut na blog, a debug v Nette mi pomohl pochopit to trochu.

Editoval jackm (3. 4. 2011 0:32)