Předání dat handleru v komponentě – nic se nepředá
- IlCommendatore
- Člen | 8
V komponentě mám formulář. Při změně textového pole Address chci provést operace na pozadí a výsledek vložit jako hodnotu do skrytého pole Result.
Používám následující kód, který mi fungoval na presenteru nicméně při použití v komponentě selhává…
<script>
{* aForm.latte *}
{block content}
{form aForm}
{input address}
{input submit}
{/form}
{/block}
{define #jsCallback}
jQuery('#{$control["aForm"][$input]->htmlId}').on('change', function() {
console.log(jQuery(this).val());
jQuery.nette.ajax({
type: 'POST',
url: '{link {$link}!}',
data: {
'value': jQuery(this).val()
},
success: function(response) { console.log(response) }
});
});
{/define}
{block inlineScr}
<script type="text/javascript">
{include #jsCallback, input => address, link => changeAddress}
</script>
{/block}
</script>
<?php
public function handleChangeAddress($value) {
$this->presenter->payload->val = $value;
if ($value) {
$model = $this->presenter->context->service;
$this['searchForm']->setDefaults(array('result' => (string)$model->foo()));
/* ... dadada ... další kód */
}
if ($this->presenter->isAjax()) {
$this->invalidateControl();
}
else {
$this->redirect('this');
}
}
?>
Operace se provede, správná data jsou dostupná v $_POST
Problém mám s tím, že $value je vždy
NULL
Co dělám špatně? Respektive, prosím někoho zkušenějšího, aby poradil,
co mi uniká. Děkuji
//Když přistoupím k datům přes $_POST, metoda proběhne korektně, avšak výsledek se nijak neprojeví – nedojde k invalidaci snippetu.
Editoval IlCommendatore (15. 1. 2014 10:08)
- IlCommendatore
- Člen | 8
Firebug response vrací pouze status[]
a snippet jsem si udělal v šabloně presenteru který to volá, takto:
<script>
{snippet addressFrm}
<div class='div'>{control aForm}</div>
{/snippet}
</script>
EDIT
Snippet jsem přidal to komponenty a Eureka, výsledek je na světě, bohužel
ale pořád musím brát $value z POSTu, jelikož ta
proměnná je pořád null.
Editoval IlCommendatore (15. 1. 2014 11:36)
- duskohu
- Člen | 778
Predpokladam ze sa invaliduje len snippet v komponente ktory tam nemas, ten mas v presenteru, takze skus:
if ($this->presenter->isAjax()) {
$this->presenter->invalidateControl();
}
ak to pojde tak aby si nemusel z komponenty invalidovat presenter, tak urob toto:
1. Vytvor si udalost v komponente
/** @var array */
public $onChangeAddress;
2. Pri volani signalu si tuto udalost zavolaj
public function handleChangeAddress($value) {
$this->presenter->payload->val = $value;
if ($value) {
$model = $this->presenter->context->service;
$this['searchForm']->setDefaults(array('result' => (string)$model->foo()));
/* ... dadada ... další kód */
}
$this->onChangeAddress($this);
}
3. V presentri v create component si na tuto udalost naviazes toto:
protected function createComponentAForm()
{
$that = $this;
$component = // zavolas komponentu
// pridas udalost
$component->onChangeAddress[] = function ($form) use ($that) {
if ($that->isAjax()) {
$that->invalidateControl();
// alebo ked chces invalidovat len tento snippet
// $that->invalidateControl('addressFrm');
}else {
$that->redirect('this');
}
};
}
- Patrik Votoček
- Člen | 2221
nemáš náhodou přetížený konstruktor? a voláš v něm
parent::__construct()
?
- Majkl578
- Moderator | 1364
Máš blbě název parametru (v JS). Není to value
, ale
nazevkomponenty-value
.
nemáš náhodou přetížený konstruktor? a voláš v něm parent::__construct()?
To je už rok irelevantní, od verze 2.0.7.