Defaultní hodnoty formuláře – jak na ně přes „fasádu“?

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

Zdravím,

byl jsem na školení od Davida Grudla a tam jsem se rozhodl, že přepíšu stávající aplikaci do podoby, která odpovídá kostře aplikace, kterou jsme na školení psali.

Problém je v tom, že když v HomepagePresenteru, který je v Admin modulu, vytvořím formulář a chci do něj načíst defaultní hodnoty, nevím jak na to. Níže přikládám kód HomepagePresenteru a HomepageFacade.

HomepageFacade:

<?php

class HomepageFacade extends Nette\Object
{
    public $db;

    public function __construct(Nette\Database\Connection $db)
    {
        $this->db = $db;
    }

    public function getBoxes()
    {
        return $this->db->table('homepageboxes');
    }

    public function getBox($id)
    {
        $box = array($this->db->query("SELECT id, title, content, modified FROM homepageboxes WHERE id=$id"));//->fetch('id', 'title', 'content', 'modified'));
    }
}

HomepagePresenter:

<?php

namespace AdminModule;

use Nette\Application\UI\Form,
    Nette;

/**
 * Default admin presenter.
 */
class HomepagePresenter extends SecuredPresenter
{
    private $homepageFacade;
    private $id;

    function __construct(\HomepageFacade $homepageFacade)
    {
        $this->homepageFacade = $homepageFacade;
    }

    public function renderDefault()
    {
        $this->template->boxes = $this->homepageFacade->getBoxes();
    }

    public function actionEditBox($id)
    {

    }

    public function createComponentEditBoxForm()
    {
        $form = new Form();

        $form->addText('id', 'ID')
            ->setRequired('Prosím, vyplňte ID.')
            ->addRule(FORM::INTEGER, 'Hodnota pole ID musí být celočíselná.')
            ->addRule(FORM::MAX_LENGTH, 'Zadané ID je příliš dlouhé, maximální délka je 10 čísel.', 10);

        $form->addText('title', 'Titulek')
            ->setRequired('Prosím, vyplňte titulek.')
            ->addRule(FORM::MAX_LENGTH, 'Zadaný titulek je příliš dlouhý, maximální délka je 200 znaků.', 200);

        $form->addTextArea('content', 'Obsah');

        $form->addText('modified', 'Upraveno');

        $form->addSubmit('edit', 'Upravit');

        $form->onSuccess[] = array($this, 'editBoxFormSubmitted');

        return $form;
    }
}

Omlouvám se za delší post, ale opravdu nevím, kde je chyba. Díky za všechny případné odpovědi.

Milo
Nette Core | 1283
+
0
-

Snad myslíš toto…

public function actionDefault()
{
	$this['editBoxForm']->setDefaultValues(array(...));
}

Editoval Milo (6. 7. 2012 15:32)

Grelek
Člen | 233
+
0
-

Milo napsal(a):

Snad myslíš toto…

public function actionDefault()
{
    $this['editBoxForm']->setDefaultValues(array(...));
}

Nette\MemberAccessException

Call to undefined method Nette\Application\UI\Form::setDefaultValues().

22
Člen | 1478
+
0
-
$this['editBoxForm']->setDefaultValue(array(...));

s pryč, jinak máme API

Milo
Nette Core | 1283
+
0
-

Tak. Já si to pořád pletu když to střelim od boku :-)

EDIT:
Ještě jinak. setDefaults() :-)

Editoval Milo (6. 7. 2012 15:50)

Grelek
Člen | 233
+
0
-

Ono mě to potom napadlo, ale musel jsem odejít a už jsem to sem nenapsal.

Tak se omlouvám :-).

Grelek
Člen | 233
+
0
-

Tak jsem tu znovu, ovšem s dotazem ohledně databáze.

V HomepagePresenteru mám:

$this['editBoxForm']->setDefaults(array(
    'id' => $this->homepageFacade->db->exec("SELECT `id` FROM `homepageboxes` WHERE id=$id"),
    'title' => $this->homepageFacade->db->exec("SELECT `title` FROM `homepageboxes` WHERE id=$id"),
    'content' => $this->homepageFacade->db->exec("SELECT `content` FROM `homepageboxes` WHERE id=$id"),
    'modified' => $this->homepageFacade->db->exec("SELECT `modified` FROM `homepageboxes` WHERE id=$id"),
));

Vím, je to trochu nešikovné, ale o to mi teď nejde.

I přesto, že si do každého prvku formuláře „uložím jiný SQL dotaz“, ve všech prvcích je naprosto stejná hodnota, tj. 1, protože se vytáhne z 'id' => $thi... hodnota 1. Netuším ale, proč je všude.

Milo
Nette Core | 1283
+
0
-

Protože exec() vrací integer a ne výsledek dotazu. Proč si nejprve nepřečteš dokumentaci? Tam bys došel i na to, jak to udělat jediným dotazem a ne čtyřmi.