Nastavení template pro Form v továrničce

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

Ahoj,

snažím se vytvořit vlastní komponentu pro přidávání a úpravu článků. Jak jsem vytušil z tohoto článku:
https://pla.nette.org/…cni-formular , moje komponenta musí dědit od \Nette\Application\UI\Form, abych mohl využít metodu setDefaults. Metoda render mi ale po změně dědění od Control na Form – vyhazuje vyjímku Cannot read an undeclared property app\controls\ArticleForm\CreateArticle\ArticleFormFactory::$template. Jak nyní nastavím template?

namespace app\controls\ArticleForm\CreateArticle;

use \Nette\Application\UI\Form as Form;

class ArticleFormFactory extends \Nette\Application\UI\Form {

    public $users;
    protected $user;
    protected $articles;
    protected $authors;

    public function __construct(\Nette\Security\User $user, \App\model\Users $users, \App\model\Articles $articles, \App\model\Authors $authors) {
        parent::__construct();
        $this->user = $user;
        $this->users = $users;
        $this->articles = $articles;
        $this->authors = $authors;
    }

    /** @return \app\controls\ArticleForm\CreateArticle\ArticleFormFactory */
    public function create() {
        return $this->createComponentArticleForm();
    }

    function render() {
        $template = $this->template;
        $template->setFile(__DIR__ . '/ArticleForm.latte');
        $this->template->render();
    }

    protected function createComponentArticleForm() {
        $form = new Form();
        $folder = $this->getParam('folder');
        $autors = $this->users->getAuthors();

        $form->addText('Name', 'Název příspěvku: ', 500)
                ->addRule(Form::FILLED, 'Název příspěvku je povinný parametr.');

        $form->addUpload("Pdf", 'Vyberte pdf soubor : '); //->addRule(Form::MAX_FILE_SIZE, 'Velikost přílohy může být nanejvýš ' . TemplateHelpers::bytes($maxFileSize) . '.', $maxFileSize);
        $form->addCheckboxList('Authors','Autoři',$autors)
                ->setDefaultValue($this->user->getId())->addRule(Form::FILLED, 'Alespoň jeden autor musí být vybrán.');


        $form->addTextArea('Abstract', 'Abstract: ', 500,5)
                ->addRule(Form::FILLED, 'Abstract je povinný parametr.');


        $form->addSubmit('send', 'Nahrát');
        $form->onSuccess[] = callback($this, 'arictleFormSucceeded');

        return $form;
    }

    public function arictleFormSucceeded(Form $form) {
        $values = $form->getValues();

        $file = $values['Pdf'];
        if ($file->isOk()) {
            $filename = $values['Pdf']->getSanitizedName();
            $values['Pdf']->move("c:\\Users\\Public\\Documents\\" . "$filename");
        }
        $articleAdded = $this->articles->insert($values);
        $selected = $values["Authors"];
        $ids = $selected;
        $this->authors->insert(array(
            "articleId"=>$articleAdded->Id,
            "userIds"=>$ids,
        ));
        $this->getPresenter()->redirect(":Autor:Homepage:default");

    }
Marek Šneberger
Člen | 130
+
0
-

NeExtenduj Form, ale Control

foxxed
Člen | 6
+
0
-

Marek Šneberger napsal(a):

NeExtenduj Form, ale Control

Dobře, jak nastavím potom „DefaultValues“, pokud chci tuto komponentu využít i pro editaci?

Nyní to mám takto. Děkuji za pomoc

public function actionEdit($postId)
    {
    $this->record = $this->context->articles->findById($postId); //vrací selection

    if (!$this->record) { // kontrola existence záznamu
            $this->error('Příspěvek nebyl nalezen');

    }

        $this['addArticle']->setDefaults($this->record);

    }
Marek Šneberger
Člen | 130
+
+1
-

Zkusil bych

$this['addArticle']['articleForm']->setDefaults($this->record);

Ale nevím jestli to bude fungovat. Co si spíš v presenteru v továrničce předat ty data třeba přes setter? Pak přímo v tom formuláři můžeš napsat

$form->setDefaults($this->record);
foxxed
Člen | 6
+
0
-

Super, děkuji. Moc mi to pomohlo

Editoval foxxed (29. 12. 2014 8:56)