jak vytvorit konkretni multiplier komponentu/formular na konktretni id
- crookslovacko
- Člen | 75
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 | 75
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
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 | 75
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
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 | 75
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
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 | 75
a pokud to ted dobre chapu, tak v komponente uz nebudu vytvaret multiplier ale normalni form..
- crookslovacko
- Člen | 75
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
- crookslovacko
- Člen | 75
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)