Snippet Formular: Refresh selectboxu po pridani novej polozky

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

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
+
0
-

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');