Jak překreslit snippet obalující část formuláře v includované šabloně?

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

Zdravím,
mám formulář, který obsahuje několik podsekcí (zákazník, web, …). Ty podsekce se opakují v několika různých formulářích, takže to mám řešeno tak, že mám pro každou podsekci includovanou šablonu, protože nechci mít identický kód na více místech.

Šablona formuláře vypadá zhruba takhle:

<?php
                    {form addCustomerForm}
                        <div class="panel-body">
                            <div class="row">
                                <div class="col-sm-12 col-lg-12" id="customer-form-wrapper">
                                    {include '../parts/customerForm.latte', _form => $_form, showAresLink => TRUE}
                                    <div class="row">
                                        <div class="col-sm-12">
                                            <a href="#" class="btn btn-primary col-sm-12 show-web-form" id="toggle-web-form">Přidat webhosting</a>
                                        </div>
                                    </div>
                                </div>
                                <div class="col-sm-12 col-lg-8" id="web-form">
                                    {include '../parts/webForm.latte', _form => $_form, webNoteName => 'webNote', services => $services, isCustomerForm => TRUE, tarifPrices => $tarifPrices, additionalServicePrices => $additionalServicePrices, tarifServiceUnits => $tarifServiceUnits}
                                </div>
                            </div>
                        </div>
                        <div class="panel-footer">
                            <div class="row">
                                <div class="col-lg-4 hidden-tablet hidden-phone" id="button-lg-padding">
                                    &nbsp;
                                </div>
                                <div class="col-sm-12 col-lg-12" id="customer-form-button-wrapper">
                                    {input submit, class => 'btn btn-primary col-sm-12'}
                                </div>
                            </div>
                        </div>
                    {/form}
?>

Includovaná šablona pro sekci zákazníka:

<?php
{default $showAresLink = FALSE}

<script type="text/javascript">
    var $inInputId = {$_form['in']->htmlId};
    var $customerFormId = {$_form->getElementPrototype()->id};
</script>

{snippet customerAresData}
    <div class="row">
        <div class="col-sm-12">
            {input name, class => 'form-control', placeholder => $_form['name']->label->getText()}
        </div>
    </div>
    <div class="row">
        {if $showAresLink}
            <div class="col-sm-8">
                {input in, class => 'form-control', placeholder => $_form['in']->label->getText()}
            </div>
            <div class="col-sm-4">
                <a n:href="ares!" id="ares-link" class="btn btn-primary">ARES</a>
            </div>
        {else}
            <div class="col-sm-12">
                {input in, class => 'form-control', placeholder => $_form['in']->label->getText()}
            </div>
        {/if}
    </div>
	{* ... nějaká další pole ... *}
{/snippet}
?>

V JS mám:

<script>
    $('#ares-link').click(function(event){
        event.preventDefault();

        var inValue = $('#' + $inInputId).val();
        var handleLink = $(this);
        var handleLinkUrl = $(this).attr('href') + '&in=' + inValue;

        $.nette.ajax({method: 'POST', url: handleLinkUrl}, handleLink, event);
    });
</script>

A handle v presenteru vypadá takhle:

<?php
	 /**
	 * Loads customer data from Ares by customer's in (IČO).
	 * @param string $in
	 */
	public function handleAres($in){
		list($status, $customerData) = $this->customerFacade->aresFindCustomer($in);

		if($status === \Model\Service\AresService::STATUS_FOUND){
			$this['addCustomerForm']->setDefaults($customerData);
			$this->flashMessage("Data načtena.", 'success');

			$this->redrawControl('flashes');
			$this->redrawControl('customerAresData');
		} else {
			if($status === \Model\Service\AresService::STATUS_NOT_FOUND){
				$this->flashMessage("Klient s IČ '$in' nebyl nalezen v registru ARES.", 'danger');
			} else {
				$this->flashMessage("Registr ARES neodpovídá.", 'danger');
			}

			$this->redrawControl('flashes');
		}
	}
?>

Flash messages se mi zobrazují správně, ale hodnoty ve formuláři se nenastaví, v payloadu není ani ten snippet s částí formuláře (customerAresData). Odhaduju, že bude problém s tou includovanou šablonou, ale nemůžu přijít na to, jak to provést, aby to fungovalo. Můžete mě prosím někdo nějak nakopnout? Případně poradit, jak to řešit bez snippetu?

petr.jirous
Člen | 128
+
0
-

Nebylo by lepší, opakující-se kód v sekcích rozházet do komponent a pak překreslovat celé komponenty?

chikeet
Člen | 160
+
0
-

Díky, nakonec je to nejjednodušší řešení. Nepřekresluju teda celou komponentu, protože obsahuje i jiná pole, která se překreslovat nemají, neb tam už uživatel může mít něco vyplněné. Ale v handle stačilo místo $this->redrawControl('customerAresData'); použít $this['customerFormCore']->redrawControl('customerAresData'); a funguje to parádně. Přemýšlela jsem i nad jinýma způsobama, ale bylo by to strašně krkolomné a zbytečně pracné. Takhle to bylo na deset minut práce :-)