predanie parametra do komponenty

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

Ahojte, viem, že sa podobné veci riešili, ale aj po prečítaní všetkých možných vlákien som stále zmätený ako by to malo fungovať.

Mám problém s predaním parametru do komponenty.
Snažil som sa to robiť podľa toho, ako to bolo tu: https://doc.nette.org/…eating-posts ale stále mi to nejde. Resp. ani nerozumiem, prečo to v tom návode funguje.
Moje funkcie by mali zhruba odpovedať tým z návodu.

createComponentEmailSelect() == createComponentPostForm()
loadEmail(UI\Form $form, $values) == postFormSucceeded($form, $values)
createComponentUpdateEmail($pom) == actionEdit($postId)
updateEmail(UI\Form $button) == postFormSucceeded($form, $values)

Hlavná vec, čomu nerozumiem je, ako sa v tom návode predáva premenná $values, aby som to potom mohol skúsiť napodobniť u seba.

Ďakujem

class EmailsPresenter extends \BasePresenter
{

    public $file;

    protected function createComponentEmailSelect()
    {
        $form = new UI\Form;
        $dir = __DIR__.'/templates/Homepage/EmailTemplates/';
        $result = array_diff(scandir($dir), array('..', '.'));

        $form->addSelect('email', 'Zvolte email:', $result);
        $form->addSubmit('select', 'Potvrdit');
        $form->onSubmit[] = [$this, 'loadEmail'];
        return $form;
    }

    public function loadEmail(UI\Form $form, $values)
    {
        dump($values);
        $dir = __DIR__.'/templates/Homepage/EmailTemplates/';
        $result = array_diff(scandir($dir), array('..', '.'));
        $fileIndex = $form->getValues(TRUE);
        $fileName= $result[$fileIndex['email']];
        $path = $dir.$fileName;
        $pom = file_get_contents($path);
        return $pom;
    }

    protected function createComponentUpdateEmail($pom)
    {
        dump($pom);
        $button = new UI\Form();
        $button->addTextArea('code')
            ->setValue($pom)
            ->setAttribute("class", "codemirror-textarea");
        $button->addSubmit('save', 'Uložiť');
        $button->onSubmit[] = [$this, 'updateEmail'];
        return $button;
    }

    public function updateEmail(UI\Form $button) {
        $data = $button->getValues();
        dump('afsgfs');
        dump($data);
    }
}
CZechBoY
Člen | 3608
+
0
-

Co čekáš že bude v parametru $pom u metody createComponentUpdateEmail? Předává se tam jen jméno komponenty k vytvoření.

tomas.hrnciar
Člen | 10
+
0
-

@CZechBoY v $pom bude obsah súboru, čiže nejaký template emailu, ktorý sa vloží do TextArea(‚code‘), tam si ho užívateľ môže upraviť a pomocou updateEmail() sa tie zmeny potom uložia

CZechBoY
Člen | 3608
+
0
-

No a když to funguje tak jak píšu tak co s tím uděláš?
Pokud se to má brát z formuláře tak to ber z formuláře a ne z parametru metody na vytváření komponenty.

Ukaž ještě šablonu a javascript nebo prostě všechno co máš. Takhle podle php kodu presenteru mi není vůbec jasný co chceš vlastně udělat.

Editoval CZechBoY (13. 2. 2017 22:34)

tomas.hrnciar
Člen | 10
+
0
-

@CZechBoY
nič moc tam už nemám,

toto je šablóna:

{block content}
    <link rel="stylesheet" type="text/css" href="/bp/bower_components/codemirror/lib/codemirror.css">
    <div class="center">
        <!-- javascript -->
        <script src="/bp/bower_components/nette-forms/src/assets/netteForms.min.js"></script>
        <script src="/bp/bower_components/codemirror/lib/codemirror.js"></script>
        <script type="text/javascript" src="/bp/app/model/default.js"></script>
        <script type="text/javascript">
            {ifset $file}
                var file = {$file};
            {/ifset}
        </script>

        <h2>Vyberte email pre úpravu</h2>

        {control emailSelect}
        {control updateEmail}
    </div>
{/block}

a js:

$(document).ready(function(){
	//code here...

	var code = $(".codemirror-textarea")[0];
	var editor = CodeMirror.fromTextArea(code, {
		lineNumbers : true
	});
});

O čo sa snažím:

Vytvoriť stránku, kde si bude môcť užívateľ upraviť súbor s templateom pre email. Čiže, najskôr pomocou createComponentEmailSelect() vytvorím Select, ktorý bude obsahovať všetky templaty v danej zložke. Užívateľ vyberie, ten čo chce a klikne na tlačítko ‚Potvrdiť‘. Tým sa zavolá funkcia loadEmail(), ktorá si zo zvoleného súboru vytiahne obsah a uloží ho do premennej $pom. Potiaľto som sa dostal. No a teraz potrebujem nejakým spôsobom predať obsah premennej $pom, do funkcie createComponentUpdateEmail($pom), ktorá vytvorí textareu a nastaví do nej obsah premennej $pom. No a na záver, užívateľ upraví ten súbor a pomocou updateEmail(UI\Form $button), by som ho chcel uložiť a zapísať do pôvodného súboru.

Editoval tomas.hrnciar (13. 2. 2017 23:10)

CZechBoY
Člen | 3608
+
0
-

No radši bych sáhnul po WebChemistry/wizard, ale můžeš si to zkusit nakodit i sám.
Ve zkratce stačí přehodit načtenou hodnotu po odeslání prvního formuláře do druhého.

class EmailsPresenter extends \BasePresenter
{

    public $file;

    protected function createComponentEmailSelect()
    {
        $form = new UI\Form;
        $dir = __DIR__.'/templates/Homepage/EmailTemplates/';
        $result = array_diff(scandir($dir), array('..', '.'));

        $form->addSelect('email', 'Zvolte email:', $result);
        $form->addSubmit('select', 'Potvrdit');
        $form->onSubmit[] = [$this, 'loadEmail'];
        return $form;
    }

    public function loadEmail(UI\Form $form, $values)
    {
        dump($values);
        $dir = __DIR__.'/templates/Homepage/EmailTemplates/';
        $result = array_diff(scandir($dir), array('..', '.'));
        $fileIndex = $form->getValues(TRUE);
        $fileName= $result[$fileIndex['email']];
        $path = $dir.$fileName;
        $pom = file_get_contents($path);

		$this['updateEmail']['code']->setValue($pom); // vložit obsah do druhého formuláře
    }

    protected function createComponentUpdateEmail()
    {
        $button = new UI\Form();
        $button->addTextArea('code')
			->setRequired()
            ->setAttribute("class", "codemirror-textarea");
        $button->addSubmit('save', 'Uložiť');
        $button->onSubmit[] = [$this, 'updateEmail'];
        return $button;
    }

    public function updateEmail(UI\Form $button) {
        $data = $button->getValues();
        dump('afsgfs');
        dump($data);
    }
}

Editoval CZechBoY (14. 2. 2017 10:53)

tomas.hrnciar
Člen | 10
+
0
-

@CZechBoY ďakujem, toto pomohlo. Ešte by som potreboval predať $fileName z loadEmail() do updateEmail(). Vedel by si mi poradiť ako na to?

CZechBoY
Člen | 3608
+
0
-

Tak to udělej úplně stejně. Přidej skrytý políčko a nastav mu hodnotu.
Trošku se mi zdá, že ten druhej form je k ničemu a lepší by bylo mít 1 form s ajaxovou aktualizací polí.