Jak překreslit snippet obalující část formuláře v includované šabloně?
- chikeet
- Člen | 160
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">
</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
Nebylo by lepší, opakující-se kód v sekcích rozházet do komponent a pak překreslovat celé komponenty?
- chikeet
- Člen | 160
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 :-)