Snippet v components šabloně se nepřekreslí

thermaltaker
Člen | 10
+
0
-

Zdravím,

měl jsem latte šablonu a v ní modalní okno s formulářem. Jenže modální okno s tímto formulářem používám na více místech, tudíž jsem modalní okno přesunul do templates/components/ a tam mu vytvořil vlastní latte. Nyní ho importuji a includuji do původní latte šablony.

{import '../components/modalniForm.latte'}
	{include mujModalniForm}

A teď k problému! Modální okno s formulářem obsahuje snippet, který překresluje selectbox. Vše fungovalo, do doby než jsem modální okno dal do vlastní šablony. Nyní se snippet odmítá překreslit.. Jak kdyby ho to nevidělo. Neexistoval..

Pomocí handleChangeSelectBox (volá se pomocí nette ajax) překresluji snippet.

public function handleChangeSelectBox($value){
    if (nejaká podmínka) {
        $this['mujForm']['selectBox']->setItems(Event::CATEGORIES)
            ->setRequired("Kategorie je povinný údaj!");

    }else{
			$this['mujForm']['selectBox']->setItems(Event::CATEGORIES_EXTRA)
            ->setRequired("Kategorie je povinný údaj!");
    }

    $this->redrawControl('wrapper');
    $this->redrawControl('boxSnippet');
}

wrapper je SnippetArea, kterou je obalený celý <form> a boxSnippet je snippet, kterým je obalený selectbox.

David Matějka
Moderator | 6445
+
+2
-

ahoj, snippet areou musis mit obalene i samotne inkludovani sablony, jelikoz jinak se ten kod, ktery ji inkluduje, vubec neprovede viz doc

kdyztak o tom, jak fungujou snippety sem pred rokem povidal na posobote, tak treba tam najdes nejake odpovedi :)

jukie
Člen | 5
+
0
-

Ahoj, mám problém s překreslením snippetu ve formu na nette 2.4.

handle v presenteru:

<?php
public function handleGetSuborganizations() {
    $values = $this->getRequest()->getPost();
    $subOrganizations = $this->orm->organizations->getMapper()->getSubOrganisations(
        $values["organizationId"]
    );

    $subOrgs = [];
    foreach ($subOrganizations as $subOrganization)
        $subOrgs[$subOrganization->parnidk] = $subOrganization->parnaz;

    $form = $this->getComponent("addEdit");
    $form["subOrganization"]->setItems($subOrgs);
    $this->redrawControl('sub_org');
}
?>

takto vytvářím formulář v presenteru:

<?php
protected function createComponentAddEdit($name) {
        $form = new OrganizationForm($this, $name);
        $extOrgs = $this->orm->organizations->getMapper()->getExtendOrganisations();
        $form->createElements($extOrgs);
        $form->onSuccess[] = [$this, 'addEditOnFormSubmitted'];
        return $form;
    }
?>

šablona add.latte:

{form addEdit}
    <div class="organizations-form">
        <div class="box-body flex-container-form">
            <div class="flex-item">
                <div>
                    {label extendedOrganization}
                    {input extendedOrganization}
                </div>
                {snippet sub_org}
                    {label subOrganization}
                    {input subOrganization}
                {/snippet}
                <div class="required">
                    {label name}
                    {input name}
                </div>
                <div class="required">
                    {label ico}
                    {input ico}
                </div>
            </div>
        </div>
        <div class="clearfix buts">
            {input add}
        </div>
    </div>
{/form}

javascript pro odchycení prvního selectboxu:

<script type="text/javascript">
$(document).ready(function($) {
    $('select#frm-OrganizationForm-extendedOrganization').on('change', function(e) {
        data = $(this).select2('data');

        $.ajax({
            type: 'post',
            url: {plink getSuborganizations!},
            data: {
                organizationId: data[0].id,
            }
        });
    });
});
</script>

používám buď hack v presenteru:

<?php
public function beforeRender() {
    parent::beforeRender();
    $this->template->getLatte()->addProvider('formsStack', [$this->getComponent("addEdit")]);
}
?>

A nebo obaluji celý form snippetArreou ve stejné šabloně add.latte, obojí mi vyřeší chybu „end() expects parameter 1 to be array null given“. V obou případech mám v consoli správnou odpověď a v json správně vytvořený snippet „snippet–sub_org“ a v něm data pro druhý selectbox, ale za boha se snippet nepřekreslí. Co dělám špatně? Díky za reakce.

Editoval jukie (27. 4. 2017 16:34)

jukie
Člen | 5
+
0
-

Omluva, v javascriptu nebyl nette ajax. :)