Zvláštní chování ajaxu (ve snippetu dump vyhodí správnou hodnotu ale nepřepíše se text)
- unjustolaf
- Člen | 29
Opět zdravím,
Už druhým dnem se snažím udělat ajax, který po vybrání optionu z mého selectu pošle proměnou (vybranou hodnotu ze selectu) do handle, který překreslí snippet s cenou daného zboží podle množství které uživatel vybral v tom selectu. Snažím jsem se to udělat bez toho aby uživatel musel klikat na nějaký button a refreshla se celá stránka.
Když to udělám následovně podle tohoto tutoriálu v dokumentaci nette tak vše funguje a při kliknutí na tlačítko se změní hodnota přes ajax. Tak si říkám „skvělý“ předělám si to pomocí knihovny nette.ajax.js aby nebylo potřeba kliknutí na tlačíko a ono nic, vše je úplně identické jako s odkazem akorát bez něho ale snippet se prostě ne a ne překreslit.
Zde je můj kód:
latte:
<?php
{block content}
...
{snippet changeAmount}
<h4 style="color: red">{$amount},- Kč</h4>
{/snippet}
...
<form n:name="selectAmount" class="ajax" method="GET">
<select id="amount" n:name="amount" class="form-control">
</select>
</form>
...
{/block}
{block scripts}
{include parent}
<script>
$(function(){
$.nette.init();
$('#amount').change(function() {
$.ajax({
method: 'get',
url: {link changeVariable!},
data: { value: $(this).val() }
});
});
});
</script>
{/block}
?>
Vše funguje bez jakýchkoliv errorů a hodnota se po vybrání uživatelem bez chyb pošle do presenteru (konkrétně handleChangeVariable)
Presenter:
<?php
<?php
namespace App\Presenters;
use Nette;
use App\Forms;
use Nette\Application\UI\Form;
use Nette\Application\UI;
use Nette\Database\Context;
use Nette\Security\Passwords;
use Nette\Security\User;
use Tracy\Debugger;
use App\Model\UserManager;
use Nette\Utils\DateTime;
use Nette\Utils\Image;
class ShopPresenter extends BasePresenter
{
/** @var int */
private $amount;
public function renderItem()
{
if ($this->amount == null) {
$this->amount = 10;
}
$this->template->amount = $this->amount;
}
protected function createComponentSelectAmount()
{
$form = new Form;
$form->addSelect('amount', 'Vyberte množství:', [
'10' => '10g',
'50' => '50g',
'100' => '100g',
])->setDefaultValue('10');
return $form;
}
public function handleChangeVariable($value)
{
// zde je opravdu obdržena hodnota $value po kliknutí uživatele na možnost selectu
$this->amount = $value;
if ($this->isAjax()) {
$this->redrawControl('ajaxChange');
}
}
}
?>
Tak ale co je pro mě naprosto nepochopitelné je že když si hodím
{dump $amount} ve svém snippetu tak se mi opravdu dumpne hodnota value kterou
uživatel vybral ze selectu, ale text se nepřekreslí
viz níže
<?php
{snippet changeAmount}
<h4 style="color: red">{$amount} g</h4> //zde je pořád původní hodnota 10
{dump $amount} // a toto mi dumpne hodnotu kterou chci dostat do řádku výše
{/snippet}
?>
Prosím, už jsem naprosto zoufalý, strávil jsem nad tímto problémem přes 10 hodin a pomalu začínám šílet.
Předem děkuji za jakoukoliv pomoc, zachraňte mě.
- unjustolaf
- Člen | 29
Kcko napsal(a):
$this->template->amount
Ahoj, kde přesně si myslíš že by mělo být $this->template->amount, protože když to kdekoliv změním už v latte přes dump nedostanu tu hodnotu ze selectu (pro upřesnění uvnitř toho snippetu). Nemyslím si, že tohle je ten problém, protože já tu hodnotu opravdu dostanu do latte jen se nepřepíše to textové pole (což jak už jsem psal výše absolutně nechápu), prostě uvnitř snippetu se mi ten {dump $amount} mění podle toho co uživatel vybere za možnost v selectu ale nepřepisuje se text.
- unjustolaf
- Člen | 29
Prostě v tuhle chvíli když kliknu na nějakou možnost ze selectu tak se mi vypíší v tom snippetu pomocí dump dvě hodnoty.
- V tracy debug baru je dump hodnoty $amount 10, což je ta defaultní
- V ajax debug baru pod tracy debug barem je dump hodnoty $amount 50 nebo 100, což jsou ty které potřebuji
Dokonce když udělám toto:
<?php
{snippet changeAmount}
<h4 style="color: red">{$amount} g</h4>
{if $amount == 50}
{dump $amount}
{/if}
{/snippet}
?>
Tak se ten dump provede jen když v selectu vyberu možnost 50g a když poté vybere něco jiného dump zmizí.
Takže ta hodnota tam ve finále je, ale prostě se nechce překreslit ten text
- Kcko
- Člen | 470
unjustolaf napsal(a):
Kcko napsal(a):
$this->template->amount
Ahoj, kde přesně si myslíš že by mělo být $this->template->amount, protože když to kdekoliv změním už v latte přes dump nedostanu tu hodnotu ze selectu (pro upřesnění uvnitř toho snippetu). Nemyslím si, že tohle je ten problém, protože já tu hodnotu opravdu dostanu do latte jen se nepřepíše to textové pole (což jak už jsem psal výše absolutně nechápu), prostě uvnitř snippetu se mi ten {dump $amount} mění podle toho co uživatel vybere za možnost v selectu ale nepřepisuje se text.
Promiň byl jsem na telefonu a nevšiml jsem si, že tam operuješ
s privátní proměnnou, která se jmenuje stejně jako v šabloně.
Když změníš renderItem na actionItem, tak co?
- unjustolaf
- Člen | 29
Kcko napsal(a):
unjustolaf napsal(a):
Kcko napsal(a):
$this->template->amount
Ahoj, kde přesně si myslíš že by mělo být $this->template->amount, protože když to kdekoliv změním už v latte přes dump nedostanu tu hodnotu ze selectu (pro upřesnění uvnitř toho snippetu). Nemyslím si, že tohle je ten problém, protože já tu hodnotu opravdu dostanu do latte jen se nepřepíše to textové pole (což jak už jsem psal výše absolutně nechápu), prostě uvnitř snippetu se mi ten {dump $amount} mění podle toho co uživatel vybere za možnost v selectu ale nepřepisuje se text.
Promiň byl jsem na telefonu a nevšiml jsem si, že tam operuješ s privátní proměnnou, která se jmenuje stejně jako v šabloně.
Když změníš renderItem na actionItem, tak co?
To jsem taky zkoušel, tak je dump hodnoty $amount nezávisle na tom na jakej option uživatel klikne 10 což je ta defaultní která se nastaví právě v tom renderItem nebo v tomhle případě actionItem, takže tohle je ještě horší.
- Kcko
- Člen | 470
unjustolaf napsal(a):
Kcko napsal(a):
unjustolaf napsal(a):
Kcko napsal(a):
$this->template->amount
Ahoj, kde přesně si myslíš že by mělo být $this->template->amount, protože když to kdekoliv změním už v latte přes dump nedostanu tu hodnotu ze selectu (pro upřesnění uvnitř toho snippetu). Nemyslím si, že tohle je ten problém, protože já tu hodnotu opravdu dostanu do latte jen se nepřepíše to textové pole (což jak už jsem psal výše absolutně nechápu), prostě uvnitř snippetu se mi ten {dump $amount} mění podle toho co uživatel vybere za možnost v selectu ale nepřepisuje se text.
Promiň byl jsem na telefonu a nevšiml jsem si, že tam operuješ s privátní proměnnou, která se jmenuje stejně jako v šabloně.
Když změníš renderItem na actionItem, tak co?To jsem taky zkoušel, tak je dump hodnoty $amount nezávisle na tom na jakej option uživatel klikne 10 což je ta defaultní která se nastaví právě v tom renderItem nebo v tomhle případě actionItem, takže tohle je ještě horší.
A generuje to správně snippety v konzoli? Nemáš VisualStudioCode? Je tam LiveShare, mrknul bych se na to, nebo případně TeamViewer.
- unjustolaf
- Člen | 29
Kcko napsal(a):
unjustolaf napsal(a):
Kcko napsal(a):
unjustolaf napsal(a):
Kcko napsal(a):
$this->template->amount
Ahoj, kde přesně si myslíš že by mělo být $this->template->amount, protože když to kdekoliv změním už v latte přes dump nedostanu tu hodnotu ze selectu (pro upřesnění uvnitř toho snippetu). Nemyslím si, že tohle je ten problém, protože já tu hodnotu opravdu dostanu do latte jen se nepřepíše to textové pole (což jak už jsem psal výše absolutně nechápu), prostě uvnitř snippetu se mi ten {dump $amount} mění podle toho co uživatel vybere za možnost v selectu ale nepřepisuje se text.
Promiň byl jsem na telefonu a nevšiml jsem si, že tam operuješ s privátní proměnnou, která se jmenuje stejně jako v šabloně.
Když změníš renderItem na actionItem, tak co?To jsem taky zkoušel, tak je dump hodnoty $amount nezávisle na tom na jakej option uživatel klikne 10 což je ta defaultní která se nastaví právě v tom renderItem nebo v tomhle případě actionItem, takže tohle je ještě horší.
A generuje to správně snippety v konzoli? Nemáš VisualStudioCode? Je tam LiveShare, mrknul bych se na to, nebo případně TeamViewer.
Konzole je naprosto prázdná (ve Firefoxu na macu) a nemám nic z toho, teamviewer klidně stáhnu, jsem už tak zoufalý, že bych toho kdo mi pomůže vzal na dovču do karibiku.
- Kcko
- Člen | 470
unjustolaf napsal(a):
Kcko napsal(a):
unjustolaf napsal(a):
Kcko napsal(a):
unjustolaf napsal(a):
Kcko napsal(a):
$this->template->amount
Ahoj, kde přesně si myslíš že by mělo být $this->template->amount, protože když to kdekoliv změním už v latte přes dump nedostanu tu hodnotu ze selectu (pro upřesnění uvnitř toho snippetu). Nemyslím si, že tohle je ten problém, protože já tu hodnotu opravdu dostanu do latte jen se nepřepíše to textové pole (což jak už jsem psal výše absolutně nechápu), prostě uvnitř snippetu se mi ten {dump $amount} mění podle toho co uživatel vybere za možnost v selectu ale nepřepisuje se text.
Promiň byl jsem na telefonu a nevšiml jsem si, že tam operuješ s privátní proměnnou, která se jmenuje stejně jako v šabloně.
Když změníš renderItem na actionItem, tak co?To jsem taky zkoušel, tak je dump hodnoty $amount nezávisle na tom na jakej option uživatel klikne 10 což je ta defaultní která se nastaví právě v tom renderItem nebo v tomhle případě actionItem, takže tohle je ještě horší.
A generuje to správně snippety v konzoli? Nemáš VisualStudioCode? Je tam LiveShare, mrknul bych se na to, nebo případně TeamViewer.
Konzole je naprosto prázdná (ve Firefoxu na macu) a nemám nic z toho, teamviewer klidně stáhnu, jsem už tak zoufalý, že bych toho kdo mi pomůže vzal na dovču do karibiku.
Můžeš mě pak v případě uspěchu pozvat na pivo (jestli jsi z Jesenice vedle Herinku/Modletic atd) ;-)
- unjustolaf
- Člen | 29
EDIT: vše mi Kcko pomohl přes teamviewer vyřešit
řešení:
z
<?php
$(function(){
$.nette.init();
$('#amount').change(function() {
$.ajax({
method: 'get',
url: {link changeVariable!},
data: { value: $(this).val() }
});
});
});
?>
udelal toto:
<?php
$(function(){
$.nette.init();
$('#amount').change(function() {
$.nette.ajax({
url: {link changeVariable!},
data: { value: $(this).val() }
});
});
});
?>
a vše se rozběhlo, tímto mu ještě jednou děkuji, opravdu velmi ochotný člověk, který mě díky svým 10 minutám ušetřil mnoho hodinového trápení.