Snippet Formular: Refresh selectboxu po pridani novej polozky
- steelbull
- Člen | 241
Pridam AJAXovo novu polozku do formulara. Zaznam v databaze pribudne. Cely formular som obalil snippetom a po pridani zaznamu volam $this->redrawControl();, ale po pridani novej polozky do selectboxu sa select nerefreshne:
Formular:
{snippet lrform}
{form lrform}
<div class="col-md-12">
<div class="row">
<div class="form-group col-md-6">
{label 'number' /}
{input 'number'}
<span class="form-error-message">{inputError 'number'}</span>
<small>{_lr.form.request_number_desc}</small>
</div>
<div class="form-group col-md-6">
{label 'type_id' /}
{input 'type_id'}
<a class="btn btn-primary btn-sm" data-toggle="modal" data-target="#LrTypeFormModal">{_lr.form.add_type}</a>
<span class="form-error-message">{inputError 'type_id'}</span>
</div>
</div>
<div class="row">
<div class="form-group col-md-6">
{label 'project_id' /}
{input 'project_id'}
<a class="btn btn-primary btn-sm" data-toggle="modal" data-target="#addProjectModal">{_lr.form.add_project}</a>
<span class="form-error-message">{inputError 'project_id'}</span>
</div>
<div class="form-group col-md-6">
{label 'requester_id' /}
{input 'requester_id'}
<span class="form-error-message">{inputError 'requester_id'}</span>
</div>
</div>
<div class="row">
<div class="form-group col-md-6">
{label 'proc_variant_id' /}
{input 'proc_variant_id'}
<span class="form-error-message">{inputError 'proc_variant_id'}</span>
</div>
<div class="form-group col-md-6">
{label 'wu_model_id' /}
{input 'wu_model_id'}
<a class="btn btn-primary btn-sm" data-toggle="modal" data-target="#addModelModal">{_lr.form.add_model}</a>
<span class="form-error-message">{inputError 'wu_model_id'}</span>
</div>
</div>
<div class="row">
<div class="form-group col-md-12">
{label 'tested_components_id' /}
{input 'tested_components_id'}
<span class="form-error-message">{inputError 'tested_components_id'}</span>
<a class="btn btn-primary btn-sm" data-toggle="modal" data-target="#addComponentModal">{_lr.form.add_component}</a>
</div>
</div>
<div class="row">
<div class="form-group col-md-12">
{label 'description' /}
{input 'description'}
<span class="form-error-message">{inputError 'description'}</span>
</div>
</div>
<div class="row">
<div class="form-group col-md-6">
{label 'planned_start' /}
{input 'planned_start'}
<span class="form-error-message">{inputError 'planned_start'}</span>
</div>
<div class="form-group col-md-6">
{label 'planned_finish' /}
{input 'planned_finish'}
<span class="form-error-message">{inputError 'planned_finish'}</span>
</div>
</div>
<div class="row">
<div class="form-group col-md-6">
{label 'objective' /}
{input 'objective'}
<span class="form-error-message">{inputError 'objective'}</span>
</div>
<div class="form-group col-md-6">
{label 'information' /}
{input 'information'}
<span class="form-error-message">{inputError 'information'}</span>
</div>
</div>
<div class="row">
<div class="form-group col-md-12">
{label 'monitoring_instructions' /}
{input 'monitoring_instructions'}
<span class="form-error-message">{inputError 'monitoring_instructions'}</span>
</div>
</div>
{input 'id'}
</div>
{/form}
{/snippet}
Presenter:
public function lrTypeFormSuccess(Form $form) {
$model = new Model\LrTypesModel($this->context);
$data = $form->getValues();
try {
$model->saveLrType($data);
$this->flashMessage($this->translator->translate('flash.record_was_saved'), 'success');
} catch (\PDOException $e) {
$this->flashMessage($this->translator->translate('flash.error_while_saving_record'), 'danger');
}
$this->redrawControl();
}
//Skusal som aj: $this->redrawControl('lrform'); ale nepomohlo ani to.
Vopred dakujem za odpovede.
- Ryky
- Člen | 14
zkus do lrTypeFormSuccess() metody vložit ještě :)
$values = $hodnoty //zde si musíš vytáhnout hodnoty z té tabulky kterou chceš
$this['lrform']->setDefaults($values); //znovu naplníš formulář hodnotami
předpokládám že komponenta s formulářem se jmenuje ‚lrform‘ jinak změň $this[‚nazevKomponenty‘];
- steelbull
- Člen | 241
Moje zistenia:
Nefunguje snippet vo vnutri formu:
{form form}
{snippet pokus}nieco{/snippet}
{/form}
Nefunguje snippet v includovanej sablone:
{include pokus.latte}
Pokus.latte:
{snippet pokus}nieco{/snippet}
Nefunguje snippet v komponente:
class WuForm extends UI\Controls {
createComponentWuform() {
$form = new UI\Form;
...
...
}
public function render() {
$temp = $this->template;
$temp->setTemplate(WuForm.latte)
$temp->render();
}
}
Naopak, funkcne je:
- snippet v defaultnom template resp. template, ktory nie je includovany
- snippetovat sa da jedine vsetko to, co je includovane
- snippet funguje v @layout
Ale, moja otazka je:
ked mi uz Nette po submite vrati ten snippet, musim na nahradenie HTML napisat
vlastny AJAX alebo existuje nejaka Nette js kniznica, ktora to vyriesi
za mna?
Dakujem velmi pekne za odpovede a komentare.
- Ryky
- Člen | 14
1)
Nefunguje snippet vo vnutri formu:
{form form}
{snippet pokus}nieco{/snippet}
{/form}
funguje jen musíš předat v presenteru v metodě render()
$this->template->_form = $this['wuForm'];
2)
Nefunguje snippet v includovanej sablone:
{include pokus.latte}
Pokus.latte:
{snippet pokus}nieco{/snippet}
taky funguje řeší se to přes snippetArea řešilo se to tu i na foru viz zde: https://doc.nette.org/…ication/ajax#…
3)
to jsem asi nepochopil co tím myslíš snippet v komponentě totiž
nejde.. :D
4)
otázka → stačí když v submit metodě zavoláš
$this->invalidateControl('nazevSnippetu');
nepotřebuješ překreslovat ručně a prohlédni si: https://doc.nette.org/…ication/ajax
tam to všechno máš :)
snad ti to pomůže :)
- steelbull
- Člen | 241
@Ryky velmi pekne dakujem za Tvoju odpoved, vyskusam kazdy zo sposobov. Samozrejme som si dokumentaciu precital, ale mnoho dolezitych veci tam chyba – tvoje informacie v dokumentacii chybaju :-( Invalidate control nepouzivam, pretoze je deprecated, pouzivam: $this->redrawControl(‚pokus‘);
Ale tam by chyba nemala byt, pretoze po submite formulara mi to snippet vrati. Response vidim vo firebugu. Moja otazka ale je, ci si musim na snippety napisat nejaky vlastny JS alebo by to Nette malo urobit pomocou svojich JS a nieco mam zle:
Includovane mam:
- nette.ajax.js
- main.js
- jquery-1.11.1.min.js
Nette AJAX JS pouzivam toto:
/**
* AJAX Nette Framework plugin for jQuery
*
* @copyright Copyright (c) 2009, 2010 Jan Marek
* @copyright Copyright (c) 2009, 2010 David Grudl
* @copyright Copyright (c) 2012 Vojtěch Dobeš
* @license MIT
*
* @version 1.2.2
*/
Snippet sa ale neprekresli. Nemam ich nejako inicializovat?
Priklad:
na skusku som obalil snippetom flashmessage a spravne dostanem JSON odpoved:
{"state":[],"snippets":{"snippet--flashmessages":"\t\t\t\t<div id=\"flash-wrapper\">\n\t\t\t\t\t<div class=\"alert alert-success mrg10B\">\n\t\t\t\t\t <p>Záznam bol úspešne uložený.<\/p>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n"}}
…ale na stranke sa flashmessage neprekresli :-(
Editoval steelbull (12. 11. 2014 6:52)
- Ryky
- Člen | 14
umm to je divný ale když už snippet dostaneš jako response tak je spíš
něco špatně v překreslování
všecho totiž vypadá v pořádku a skript si na něj psát nemusíš to už
tam všechno je.. :)
hoď sem kód jak to překresluješ a co překresluješ konkrétně (kde ten
snippet máš vložený)
s tou flashMessage bych to zkusil následovně v submitted metodě:
$this->flashMessage('Blabla', 'success');
pokud se nic neozve tak je problém někde jinde.. zkoušel jsem na sandboxu s nejnovějším nette a funguje bez problému :)
btw ještě mě napadla jedna možnost u které se často chybuje
máš v submit buttonu třídu ajax?
příklad:
$form->addSubmit('send', 'odeslat')
->setAttribute('class', 'ajax');
- steelbull
- Člen | 241
Potom som to nejakou nahodou robil, ale teraz som zistil, ze problem je v poradi prekreslovania snippetov. Zalozil som novu temu…
Ryky napsal(a):
umm to je divný ale když už snippet dostaneš jako response tak je spíš něco špatně v překreslování
všecho totiž vypadá v pořádku a skript si na něj psát nemusíš to už tam všechno je.. :)
hoď sem kód jak to překresluješ a co překresluješ konkrétně (kde ten snippet máš vložený)s tou flashMessage bych to zkusil následovně v submitted metodě:
$this->flashMessage('Blabla', 'success');
pokud se nic neozve tak je problém někde jinde.. zkoušel jsem na sandboxu s nejnovějším nette a funguje bez problému :)
btw ještě mě napadla jedna možnost u které se často chybuje
máš v submit buttonu třídu ajax?
příklad:$form->addSubmit('send', 'odeslat') ->setAttribute('class', 'ajax');