Undefined variable: clanek → v továrničce na komponentu

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

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
+
0
-

to nastavovani sablony

$this->template->clanek = $this->nazevClanku;
...

nemej v createComponent* metode, ale v render.

A dalsi poznamky ke kodu:

  1. pouzivej nejake ide, ten kod je hrozne zformatovanej.
  2. setNazevClanku je hrozny, pouzivej anglictinu
  3. prejmenuj ArticleFormFactory na ArticleForm, nejedna se totiz o factory (factory je to IArticleFormFactory, resp. vygenerovana trida implementujici ten iface)
  4. metoda create v ArticleFormFactory je zbytecna
  5. v createComponent* metodach v presenteru nepredavej ty sluzby – ty se samy predaji z DI (pokud tedy pouzivas ty gen. tovarnicky)
  6. nesahej v presenteru na context, ty articles si injectni (jako to delas s factory)

Editoval matej21 (31. 12. 2014 13:14)