Závislý select podle kuchařky
- Nodon
- Člen | 8
Ahoj, snažím se vytvořit závislý select dle kuchařky a bohužel problém nastává ihned po zkopírování kódů bez nějakých dalších změn, jakmile vyberu jinou hodnotu ve statickém selectu, proběhne ajax ale v dynamickém se nic nezmění.
public function renderClasses()
{
$this->template->_form = $this['selectForm'];
}
/**
* Loads new values to select
* @param int value from parent select
* @return array values for dynamic select
**/
public function handleSelectLoad($static_id)
{
$form = $this->getComponent("selectForm"); // our form
// for demo only! this part will use database to load your select using $value
// $this->models->options->getItemsForGroup($static_id);
$newArray = array(
"I am new, I have changed!",
);
$form["dynamic"]->setItems($newArray); // set up new values
$this->invalidateControl("form"); // invalidate ajax snippet
}
/**
* Simple form
**/
protected function createComponentSelectForm()
{
$staticArray = array(
"I am static",
"I am static two/too",
);
$dynamicArray = array(
"Change the 'static' and I will change",
"Me too",
);
$form = new Form;
$form->addSelect("static","Choose me:", $staticArray);
$form->addSelect("dynamic","I am dynamic:", $dynamicArray);
$form->addSubmit("send", "Submit");
$form->onSuccess[] = callback($this, "selectFormSent");
return $form;
}
/**
* Shows values from selects
* @param form
**/
public function selectFormSent(Form $form)
{
$values = $form->getHttpData(); // getValues() is not enough for $form["dynamic"]
unset($values["send"]); // we don't need this
// save values...
}
{form selectForm}
{label static /} {input static}
{snippet form}
{label dynamic /} {input dynamic}
{/snippet}
{/form}
<script type="text/javascript">
$("form").delegate('#'+{$control["selectForm-static"]->htmlId}, 'change', function() {
$.get("?do=selectLoad", {"static": $(this).val()});
});
</script>
- raketoplan2005
- Člen | 147
Mám pravděpodobně stejný problém. handle se zavolá (200 OK), ale nic se nestane, jako by se mi neinvalidoval ten formulář.
- raketoplan2005
- Člen | 147
Právě že ne, přitom handler se zavolá správně a v šabloně mám:
{snippet form}
{control myForm}
{/snippet}
a v handleru volám:
$this->invalidateControl("form");
- raketoplan2005
- Člen | 147
Aha, děkuji, to jsem nevěděl že si tam můžu přepnout na JSON a zobrazit obsah snippetu, kontroloval jsem tam jen jestli se volá handle a že vrací 200 OK.
Když si zobrazím ve firebugu obsah snippetu tak je tam te nový, změněný obsah, na webu ale mám v selectu data stará.
- duskohu
- Člen | 778
urob test, ci sa ti bude invalidovat snippet, pokial mas tento kod v presenteru tak si pridaj do presenteru, ak v komponente tak v komponente si pridaj:
public $test = "testovacia hodnota";
//do render si pridaj:
$this->template->test = $this->test;
// sablona na zaciatku ti ma vypisat "testovacia hodnota"
{snippet test}
{$test}
{/snippet}
// do handle si pridaj:
$this->test = "moja nova hodnota";
// a invaliduj
$this->invalidateControl('test');
takze ak prejde invalidacia zobrazi sa ti nova hodnota, a skontroluj aj JSON ci tam bude nova hodnota
- raketoplan2005
- Člen | 147
Děkuji, to jsem už zkoušel, V JSONu mám nový obsah selectu invalidováného přes „form“ a starý obsah proměnné invalidované přes „test“. Ještě se na to budu muset podívat. Netuším ale zatím kde hledat chybu.
- pavelplzak
- Člen | 21
Vyřešil jsi to nějak? Mám stejný problém. Požadavek vrátí 200, v JSONu je ten správný nový obsah snippetu, ale obsah se neaktualizuje.
EDIT:
Vyřešeno. Protože používám nette.ajax.js nemohl jsem volat přímo $.get
ale poslat AJAX požadavek takto: https://forum.nette.org/…ic-nepripise#…
Editoval pavelplzak (26. 12. 2012 22:26)
- raketoplan2005
- Člen | 147
pavelplzak: Děkuji, na to jsem nepřišel :-) Už to běhá!
Editoval raketoplan2005 (27. 12. 2012 13:57)
- kmaci
- Člen | 6
Ahoj,
pokusil jsem se rozchodit závislý select, měl jsem stejný problém, tudíž jsem přepsal kód na toto:
$("form").delegate('#'+{$control["selectForm-static"]->htmlId}, 'change', function() {
$.nette.ajax({
type: 'GET',
url: {link selectLoad!}, { "static": $(this).val() });
});
Stále je však někde problém, budu rád za rady :) Díky.
PS: Jinak mám vše nastavené podle kuchařky.
- jiri.pudil
- Nette Blogger | 1029
$.nette.ajax({
type: 'GET',
url: {link selectLoad!},
data: { "static": $(this).val() }
});
To ti IDE nebo JS konzole nezařvaly, že ti tam chybí závorka a název property?
- kmaci
- Člen | 6
Bohužel ne :) Díky.
Stejně ale problém zůstává.
Nyní mám kód takto, JS však vůbec nereaguje na změnu. Díval jsem se i do
konzole, nic se však neděje. Jako by nebyl potřebný skript připojen
k dokumentu, to jsem ale samozřejmě několikrát kontroloval. Nenapadá
někoho ještě nějaká rada? :)
Moc díky.
<script>
$("form").delegate('#'+{$control["selectForm-static"]->htmlId}, 'change', function() {
$.nette.ajax({
type: 'GET',
url: {link selectLoad!},
data: { "static": $(this).val() }
});
});
</script>
Jinak v konzoli se mi zobrazí po výběru SELECTu toto:
Uncaught TypeError: Cannot call method ‚ajax‘ of undefined.
Editoval kmaci (11. 3. 2013 20:04)
- piskotek
- Člen | 35
ahoj, ja to mam podle tohoto navodu
mel jsem problem: ajax se provedl, ale neaktualizoval druhy selectbox…
a mohl za to tento callback
$form->addSubmit("send", "Submit");
$form->onSuccess[] = callback($this, "selectFormSent");
provedl jsem tuto zmenu a funguje mi to
$form->addSubmit('show', 'Show')->onClick[] = array($this, 'update');
return $form;
treba ti to pomuze a nebude to moc off topic