Nastavení template pro Form v továrničce
- foxxed
- Člen | 6
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");
}
- foxxed
- Člen | 6
Marek Šneberger napsal(a):
NeExtenduj
Form
, aleControl
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
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);