Undefined variable: clanek → v továrničce na komponentu
- foxxed
- Člen | 6
Ahoj,
dělám komponentu pro tvorbu článků, kde uživatel může nahrát soubor k článku (nepovinný parametr). Chci využívat stejnou komponentu jak pro create, tak pro edit.
Mým cílem je v režimu edit zajistit to, že pokud už byl k tomuto článku nahrán soubor, zobrazí se možnost ho smazat. V opačném případě má uživatel možnost soubor nahrát.
Problém je, že ač proměnnou clanek nastavuji do template, pořád dostávám chybu viz. nadpis. Tuto chybu dostávám pouze, pokud jsem v „režimu“ create, pro edit funguje vše jak očekávám. Podívali by jste se mi prosím na to? Zoufale hledám chybu druhým dnem :)
Moje komponenta + její šablony vypadá následovně:
<?php
namespace app\controls\ArticleForm\CreateArticle;
use \Nette\Application\UI\Form as Form;
class ArticleFormFactory extends \Nette\Application\UI\Control {
public $users;
protected $user;
protected $articles;
protected $authors;
private $nazevClanku = "";
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();
}
public function setNazevClanku($nazevClanku) {
$this->nazevClanku = $nazevClanku;
}
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.');
$this->template->clanek = $this->nazevClanku;
///Pokud není nastaven název článku, dovolit uživateli nahrát soubor.
if (strlen($this->nazevClanku) == 0) {
$form->addUpload("Pdf", 'Vyberte pdf soubor : ');
$this->template->clanek = "";
}
$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;
}
{* Latte template *}
{block content}
{form articleForm}
<div class="row">
<div class="large-5 medium-12 small-12 columns">
{label Name /}
{input Name }
</div>
</div>
<div class="row">
<div class="large-5 medium-12 small-12 columns checkboxlist">
<fieldset>
<span>{label Authors /}</span>
{input Authors }
</fieldset>
</div>
</div>
<div class="row">
<div class="large-5 medium-12 small-12 columns">
{label Abstract /}
{input Abstract }
</div>
</div>
<div class="row">
<div class="large-5 medium-12 small-12 columns">
{if strlen($clanek)==0}
{label Pdf /}
{input Pdf }
{else}
<table>
<tr>
<td>
{$clanek}
</td>
<td>
</td>
</tr>
</table>
{/if}
</div>
</div>
<div class="row">
<div class="large-5 medium-12 small-12 columns">
{input send, class => 'button'}
</div>
</div>
{/form}
Pro jistotu přidávám ještě Presenter, ve které se komponenta vytváří.
<?php
namespace App\AutorModule\Presenters;
class HomepagePresenter extends BasePresenter{
/**
* @inject
* @var \app\controls\ArticleForm\CreateArticle\IArticleFormFactory
*/
public $ArticleFormFactory;
/** @var object */
private $record;
public $clanek="";
protected function startup()
{
parent::startup();
$this->template->user = $user = $this->getUser();
$this->template->logged = $user->isLoggedIn() ? $this->context->users->find($user->getIdentity()->id):NULL;
}
public function createComponentAddArticles(){
$control = $this->ArticleFormFactory->create($this->getUser(),$this->context->users,$this->context->articles, $this->context->authors);
$control->setNazevClanku($this->clanek);
return $control;
}
public function createComponentEditArticle(){
$control = $this->ArticleFormFactory->create($this->getUser(),$this->context->users,$this->context->articles, $this->context->authors);
$control->setNazevClanku($this->clanek);
return $control;
}
public function renderDefault(){
$currentUser = $this->getUser();
$articles = $this->context->users->getMyArticles($currentUser->getIdentity()->id);
$this->template->articles = $articles;
$authorsArray = array();
foreach ($articles as $article)
{
$authorsArray[] = $this->context->articles->getAuthorsOfArticle($article->Id);
}
$this->template->authors = $authorsArray;
//dump($this->template->authors);
}
public function actionEdit($id)
{
$this->record = $this->context->articles->find($id);
if (!$this->record) { // kontrola existence záznamu
$this->error('Příspěvek nebyl nalezen');
}
$this->clanek = $this->record->Pdf;
$this['editArticle']['articleForm']->setDefaults(array(
'Name' => $this->record->Name,
'Abstract' => $this->record->Abstract,
'Authors' => $this->context->articles->getIdsOfAuthorsOfArticle($id),
));
}
public function actionAddArticle(){
$this->clanek="";
}
- David Matějka
- Moderator | 6445
to nastavovani sablony
$this->template->clanek = $this->nazevClanku;
...
nemej v createComponent* metode, ale v render.
A dalsi poznamky ke kodu:
- pouzivej nejake ide, ten kod je hrozne zformatovanej.
setNazevClanku
je hrozny, pouzivej anglictinu- prejmenuj ArticleFormFactory na ArticleForm, nejedna se totiz o factory (factory je to IArticleFormFactory, resp. vygenerovana trida implementujici ten iface)
- metoda create v ArticleFormFactory je zbytecna
- v createComponent* metodach v presenteru nepredavej ty sluzby – ty se samy predaji z DI (pokud tedy pouzivas ty gen. tovarnicky)
- nesahej v presenteru na context, ty articles si injectni (jako to delas s factory)
Editoval matej21 (31. 12. 2014 13:14)