Persistentní parametr v komponentě

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

Ahoj,

mám v aplikaci formulář, který umožňuje editovat a přidávat entity – třeba příspěvky na blog. Blog je ale vícejazyčný, a tak i příspěvky musí být ve více jazycích. Tím pádem musí být možné formulář vyplnit libovolnou jazykovou mutací příspěvku.

Pro tento účel jsem chtěl do formuláře přidat komponentu, která umožní změnit jazyk editované mutace. Pro ilustraci, jak to má vypadat, přikládám obrázek.

Tam jsem ale narazil. Komponentu se mi přidat podařilo, ale ve chvíli, kdy se v ní nastavený jazyk pokusím anotovat jako perzistentní, vyhodí Tracy při pokusu o změnu jazyka chybu Undefined variable: since v Nette/Application/UI/Presenter.php:1168.

To mě navedlo k tomu, jestli nedělám něco špatně. Je v pořádku mít komponentu ve formuláři, nebo ne?
Komponentu ve formuláři registruji takhle:

    public function createComponentLangSwitch() {
        return new FormLangSwitch($this->getLanguage(), $this, "langSwitch");
    }

kde getLanguage je metoda formuláře, která vrací přepravku s informacemi o jazyce.
Samotná třída komponenty pak vypadá následovně:

class FormLangSwitch extends \Nettex\Application\Component\Control {

    /** @persistent */
    public $language;

    public function __construct(\Nettex\Lang\Lang $lang, \Nette\ComponentModel\IContainer $parent = NULL, $name = NULL) {
        parent::__construct($parent, $name);
        $this->language = $lang->getCode();
    }

    protected function beforeRender() {
        parent::beforeRender();
        $this->template->langs = $this->getPresenter()->getModuleManager()->getLanguageList();
        $this->template->lang = \Nettex\Lang\LanguageManager::getLocale($this->language);
    }

    public function handleSelectLang($langCode) {
        $this->language = $langCode;
    }

    /**
     * @return \Nettex\Lang\Lang vybraný jazyk
     */
    public function getSelectedLang() {
        return $this->language;
    }
}

\Nettex\Application\Component\Control dědí od \Nette\Application\UI\Control a pouze implementuje automatické připojení šablony ke komponentě a přidává beforeRender voláno před samotným renderem.

Dělám něco špatně? Tušíte, čím je způsobena ta chyba v Presenteru? Já došel k závěru, že mám teda někde problém s těmi persistentními proměnnými, ale nevím, co s tím. Takže budu vděčný za každou radu a klidně i návrh jiného řešení přepínání jazyka.

Předem díky.

Editoval kajda (13. 6. 2014 11:27)

Šaman
Člen | 2668
+
0
-

Srovnej si pořadí parametrů v __constructoru ($lang až jako poslední) a pak napiš, jestli chyba přetrvává.

kajda
Člen | 7
+
0
-

Bohužel, nepomohlo..

Pořadí parametrů by mohlo mít na něco vliv, když se uvnitř volá konstruktor předka? Abych věděl pro příště, jestli když ke konstruktorům odděděných tříd přidávám parametry, tak jestli musí být na konci nebo mohou obsadit i první místa.

Ono jsem to tak řadil už jen proto, že $parent i $name jsou defaultně NULL a $lang nikoli.

kajda
Člen | 7
+
0
-

Zkusil jsem tu komponentu ještě přidat přímo do presenteru mimo formulář. Tam to fungovalo.

David Matějka
Moderator | 6445
+
0
-

vytvor si radeji formular jako komponentu

kajda
Člen | 7
+
0
-

Aha, já měl za to, že formulář je jen speciálním případem komponenty.
Ok, zkusím to podle návodu. Díky