jak vytvorit konkretni multiplier komponentu/formular na konktretni id

crookslovacko
Člen | 74
+
0
-

Dobrý den, moc se omlouvám pokud jsem něco špatně pochopil v Nette ale problém s vytvořením konkrétních formulářů

Mám txt kde je jistá sekvence znaků které pak nahradím formulářem.
Z txt jsem vytáhl data a potřebuji vytvořit z tohoto array formulaře a vložit.
Vložení formuláře mi funguje tak že mám komponentu, kde vytvářím multiplier formulaře a volám klasickou továrnickou ale nevím jak vyvolat konkretní formulář v renderu.

Neco jako

render(){
$all_e = $this->allEditBox($text);
        foreach($all_e as $editbox){
            $id= $editbox['EB-ID'];
            $ncontrol = $this->createComponentNotic();//tady nevim jak privolat konkretni id pro Formular

            bdump($ncontrol->getName());
       // $text  = str_replace('EB-ID='.$editbox['EB-ID'],'{control notic}',$text);//nebo az tady volat id?
        }
}

//tovarnicka – v te bych teoreticky mohl hned vytvorit vsechny formulare, ale jak je pak volat?

public function createComponentNotic(){

         $all_e = $this->allEditBox();//v all_e jsou data formulularu srovnane dle id formulare

             $notic = new \NoticControl($this->coursData,$all_e,$id,$this->factory);

          return $notic;

    }

Takže jak tam dostat to id..nemuzu pres handl nebo action..doufal jsem v něco jako $this->createComponent($id) coz po studovani vim ze predavam nazev componenty nikoliv id z renderu. Ale jak teda na to..Kdyz to reknu uplne primitivne..jak vytvořím více formulářů přes array a vložím do renderu

Prosim o nakopnuti ..dekuji

Editoval crookslovacko (17. 4. 2018 9:09)

crookslovacko
Člen | 74
+
0
-

Nema nikdo radu? "(

David Matějka
Moderator | 6445
+
0
-

kde mas ten multiplier a jak vypada kod?

crookslovacko
Člen | 74
+
0
-

Toto je componenta s multiplierem

<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

use Nette\Application\UI;
use Nette\Application\UI\Multiplier;

class NoticControl extends UI\Control{

    protected $model;
    protected $data;
    protected $id;
     protected $factory;


    public function __construct($model,$data,$id,$factory) {
        parent::__construct();
        $this->model = $model;
        $this->data = $data;
        $this->id = $id;
        $this->factory = $factory;
    }
    protected function createComponentNoticForm()
    {
    return new Multiplier(function ($id) {
       bdump($this->id);
        $data = $this->model->getNotice($this->id,$this->data['USER_COURSE_ID']);
        $form = $this->factory->create();
         $form->getElementPrototype()->class( 'ajax' );
        $form->addTextArea('notice', 'Text:')
                ->setAttribute('class','form-control')
                ->setAttribute('rows',$this->data['EB-SIZE'])
                ->setDefaultValue($data['TEXT']);

        $form->addHidden('id', $this->id);
        $form->addHidden('USER_COURSE_ID', $this->data['USER_COURSE_ID']);
        $form->addHidden('ELEMENT_GROUP', $this->data['EB-GROUP']);

        $form->addSubmit('send', 'Uložit');


        $form->onSuccess[] = [$this, 'noticeFormSucceeded'];
        return $form;
    });
    }
    public function noticeFormSucceeded($form,$values) {
        $this->model->saveUcNotice($values);
        dump($this->presenter->isAjax().'test');
        //exit;
    }

         //  ->onClick[] = [$this, 'cvInfoFormSucceeded'];

    public function render(){
       bdump($this->data);
        $template = $this->template;

        $template->setFile(__DIR__ . '/notic.latte');
        $this->template->data = $this->data;
        $this->template->id = $this->id;


        $this->template->render();
    }

 }

Render:

$all_e = $this->allEditBox($text); //tatofunkce vytahne vsechny data z txt co jsou predana pak komponente
        foreach($all_e as $editbox){
            $id= $editbox['EB-ID'];
            $ncontrol = $this->createComponentNotic();

            bdump($ncontrol->getName());
       $text  = str_replace('EB-ID='.$editbox['EB-ID'],'{control notic}',$text); // tady by se mela dosadit vytvorena komponenta, kde id pro multipler je prave to EB_ID
        }

a tovarnicka jeste..

public function createComponentNotic(){

         $all_e = $this->allEditBox();
             $edit_box[1]['USER_COURSE_ID'] = $this->getParameter('uc_id');
             $notic = new \NoticControl($this->coursData,$all_e[1],$id=1,$this->factory);//tady je id 1 pro test ale id by melo prijit z renderu nebo z funkce allEditBox..opravdu nevim co je lepsi a hlavne funkcni

          return $notic;

    }

snad je to aspon trosku jasne co potrebuji :(

Editoval crookslovacko (17. 4. 2018 13:01)

David Matějka
Moderator | 6445
+
0
-

do toho NoticControl ID nepredavej, to se bude predavat az do zanorene komponenty noticForm, respektive do toho multiplieru. v tom renderu pak budes mit neco jako

$all_e = $this->allEditBox($text); //tatofunkce vytahne vsechny data z txt co jsou predana pak komponente
foreach($all_e as $editbox){
	$id= $editbox['EB-ID'];
	$ncontrol = $this['notic'][$id];
}

a v tom ncontrol pak budes mit instanci formulare pro to konkretni ID. to pak budes mit predane jako id do

return new Multiplier(function ($id) {
crookslovacko
Člen | 74
+
0
-

Děkuji za odpověď, ale buď sem tě špatně pochopil či něco dělám špatně:

Hodí mi to chybu..

Component with name ‚1‘ does not exist.
Na řádku $ncontrol = $this[‚notic‘][$id];

První jsem zkusil jen předělat řádek jinak jsem vše nechal tak jak to bylo. Pak jsem zkusil upravit tovarnicku tak ze id vubec nepredavam

public function createComponentNotic(){

         $all_e = $this->allEditBox();
              $notic = new \NoticControl($this->coursData,$all_e,$this->getParameter('uc_id'),$this->factory);

          return $notic;

    }

asi jsem nepochopil:
do toho NoticControl ID nepredavej, to se bude predavat az do zanorene komponenty noticForm, respektive do toho multiplieru.

Dekuji ti za rady..co ted travim hodiny projizdenim fora a hledanim reseni si nej v mnoha vlaknech.

David Matějka
Moderator | 6445
+
0
-

jo promin, rada nebyla presna, jsem se v tom kodu ztratil. ale nejdriv se jeste zeptam – ten NoticControl ma byt pro jeden zaznam nebo pro vsechny a bude mit pod sebou X formularu pro kazdy zaznam?

crookslovacko
Člen | 74
+
0
-

Popravdě ja už se v tom dost zamotal taky. V prubehu toho jak jsem na tom pracoval jsem zjistil, ze nejlepe jak dat do toho textaku form je ten prozatim zakomentovany radek. $text = str_replace(‚EB-ID=‘.$editbox[‚EB-ID‘],‚{control notic}‘,$text);
Toto je v renderu presenteru
Pro jistotu

render(){
$all_e = $this->allEditBox($text);
        foreach($all_e as $editbox){
            $id= $editbox['EB-ID'];
            $ncontrol = $this->createComponentNotic();//tady nevim jak privolat konkretni id pro Formular

            bdump($ncontrol->getName());
       // $text  = str_replace('EB-ID='.$editbox['EB-ID'],'{control notic}',$text);//nebo az tady volat id?
        }
}

Je to zakomentovane proto ze jsem uvazoval asi takto..Vytvorim si componentu NoticControl, ktera ma v sobe multiplier form, v tom zakomentovanem radku na miste {control notic} pridam jeste treba {control notic-$id} pres foreach a vykreslim pres komponentu form ktery potrebuju. Bohuzel tato uvaha zhorela na predani id pro komponentu..takto me to nebere.
Ten noticControl ma mit v sobe jeden form, ktery predam nejak do textu v tom renderu. o tom kolik bude formularu vim z te funkce allEditBox(); Takze ted sem na rozcesti a odpoved na tvou otazku presne nevim
Jestli je teda lepsi jak ted uvazuju, jestli mam volat tu komponentu pokazde zvlast a nejak ji predam id a ona se vytvori, nebo vytvorit x formularu a pak je nejakym spusobem zavolat az je vytvorim
No sam jak ted je tim premyslim je to hodne zamotane tak snad sem to jeste vic nezamotal
Jen dodam text pro sablonu beru z txt, kde je nekolik radku ve tvaru BEGIN_EDITBOX EB-ID=(nejake cislo) EB-GROUP=101 EB-SIZE=3 END_EDITBOX Z tohoto mam vytahnou data a podle toho co je to za EB-ID vykreslim formular pro toto ID.

David Matějka
Moderator | 6445
+
+1
-

pokud ma byt ta NoticControl pro kazdy zaznam samostatna, tak ten multiplier odeber z NoticControl a pridej ho do createComponentNotic, kde tu komponentu vytvaris.. pak to bude vypadat nejak takhle:

public function createComponentNotic(){

         $all_e = $this->allEditBox();//v all_e jsou data formulularu srovnane dle id formulare
		return new Multiplier(function ($id) use ($all_e) {
             $notic = new \NoticControl($this->coursData,$all_e,$id,$this->factory);

	          return $notic;
		});
    }

a pote i bude fungovat to, ze volanim $this['notic'][$id] pristoupis ke konkretni instanci komponenty s tim id

crookslovacko
Člen | 74
+
0
-

a pokud to ted dobre chapu, tak v komponente uz nebudu vytvaret multiplier ale normalni form..

David Matějka
Moderator | 6445
+
0
-

jj, chapes to spravne

crookslovacko
Člen | 74
+
0
-

Musím se tu ještě jednou bohužel zeptat a znovu to otevřít protože otvírat na to znovu téma a celé to vysvětlovat by bylo na dyl, tak to zkusím ještě jednou tady.

Bohužel se ještě do toho zapletlo, že se to musí posílat AJAXEM. V poho vše funguje, ale nejde hláška v komponentě

Ted to vypadá takto

protected function createComponentNoticForm()
    {
       bdump($this->data);
       if($this->model->getNoticeCount($this->data[$this->id]['EB-ID'],$this->uc_id) != 0){
        $data_c = $this->model->getNotice($this->data[$this->id]['EB-ID'],$this->uc_id);
        $text = $data_c['TEXT'];
       }
       else{
           $this->model->saveUcNotice(array('USER_COURSE_ID' => $this->uc_id,
                                            'id'=>$this->data[$this->id]['EB-ID'],
                                            'ELEMENT_GROUP'=>$this->data[$this->id]['EB-GROUP'],
                                            'notice'=>''));
           $text = '';
       }
        $form = $this->factory->create();
        $form->getElementPrototype()->class( 'ajax' );
        $form->addTextArea('notice', 'Text:')
                ->setAttribute('class','form-control')
                ->setAttribute('rows',$this->data[$this->id]['EB-SIZE'])
                ->setDefaultValue($text);

        $form->addHidden('id', $this->id);
        $form->addHidden('USER_COURSE_ID', $this->uc_id);
        $form->addHidden('ELEMENT_GROUP', $this->data[$this->id]['EB-GROUP']);

        $form->addSubmit('send', 'Uložit');


        $form->onSuccess[] = [$this, 'noticeFormSucceeded'];
        return $form;

    }


    public function noticeFormSucceeded($form,$values) {
        $this->model->saveUcNotice($values);
         $this->flashMessage('Hello');
        if(  $this->presenter->isAjax() ) {

             $this->flashMessage('Hello','info');
             $this->redrawControl('flashMessage');
             //$this->presenter->redrawControl();
            //$this->invalidateControl('com');
        } else {
            // redirect může jen presenter, nikoliv komponenta
            $this->presenter->redirect('this');
            $this->flashMessage('Hello');
        }

    }



    public function render(){
       bdump($this->data);
        $template = $this->template;

        $template->setFile(__DIR__ . '/notic.latte');
        if(  $this->presenter->isAjax() ) {
         bdump('testdfsf');

        }
        else{

        }
        $this->template->data = $this->data;
        $this->template->id = 1;


        $this->template->render();
    }


 }

V template pak

{block content}
{snippet flashMessage}
    <div n:foreach="$flashes as $flash" class="flash {$flash->type}">
        {$flash->message}
    </div>
{/snippet}
{snippet noticForm}
<form n:name="noticForm">
     <div class='form-group'>
            <label n:name='notice' for="notice"> </label>
            <textarea n:name='notice' type='textarea' id='text'></textarea>
           </div>
            {input send}
</form>
{/snippet}

Vse funguje ale proste flash message ne. Uz jsem bezradny..Jinak vse OK. Do db se zapiseatd OK ..ale flash nejde vypsat

CZechBoY
Člen | 3608
+
0
-

To cos poslal je v komponente nebo v presenteru?

crookslovacko
Člen | 74
+
0
-

V komponente…Jeste sem dam tovarnicku kdyby to pomohlo:

public function createComponentNotic(){

         $all_e = $this->allEditBox();
             return new Multiplier(function ($id) use ($all_e) {
             $notic = new \NoticControl($this->coursData,$all_e,$id,$this->factory,$this->getParameter('uc_id'));

              return $notic;
        });

    }

Editoval crookslovacko (26. 5. 2018 13:28)

crookslovacko
Člen | 74
+
0
-

Takze nikdo nema tuseni?