Překreslení závislého select boxu

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

Zdravím. Jsem začátečník a narazil jsem na problém se závislým select boxem. Po načtení stránky je vše ve výchozím stavu, ale po vybrání položky z prvního selectu se neprovede překreslení té následující. Pokud kliknu na submit button, tak se samozřejmě formulář odešle (včetně provvedení finálních akcí, což samozřejmě nechci) a vše vytvoří znovu, avšak v závislém boxu jsou již potřebné položky. Formulář jsem vytvářel přesně dle tohoto návodu

deleteBook.latte:

{form deleteBookForm}
  {label author}{/label}
  {input author}
  {snippet title}
    {label title}{/label}
    {input title}
  {/snippet}
  {input submit}
{/form}

CatalogPresenter.php

<?php
public function beforeRender () {

  parent::beforeRender ();
  $this->template->_form = $this['deleteBookForm'];
}

public function handleInvalidate ($value) {
  $this['deleteBookForm']['title']->setItems ($this->catalogManager->getTitles ($value))->setPrompt ('Vyberte titul');
  $this->redrawControl ('title');
}

protected function createComponentDeleteBookForm ($name) {
  $form = new Form;

  $this [$name] = $form;

  $authors = $this->catalogManager->getAuthors ();

  $form->addSelect ('author', 'Vyberte autora: ', $authors)->setPrompt('Vyberte autora');
  $form->addSelect ('title', 'Vyberte titul: ', $this->catalogManager->getTitles ($form['author']->value))->setPrompt ('Vyberte nejdříve autora');

  $form->addSubmit ('submit', 'Vyřadit z databáze');

  $form->onSuccess [] = $this->deleteBookFormSubmitted;

  return $form;
  }

public function deleteBookFormSubmitted (UI\Form $form, $vals) {
      dump ($vals);
{
?>

Z githubu jsem stáhl soubor nette.ajax.js, který mám připojený v hlavní šabloně
<script src="{$basePath}/js/nette.ajax.js"></script>

a toto

<script>
$(function(){
     $.nette.init();

     $('select[name=title]').change(function () {
         $.nette.ajax({
             url: {link invalidate!},
             data: {
                 'value': $('select[name=title]').val(),
             }
         });
     });
 });
</script>

mám umístěné po všech čertech, a stejně se nic nemění.

Neuměl by mi prosím někdo pomoc? Pročetl jsem tu několik vláken, hledám to na netu ale stále se mi to nedaří vyřešit. Budu moc vděčný za pomoc. Díky.

Šaman
Člen | 2668
+
0
-

Teď jsem řešil podobný problém, zdá se mi že nějak nefunguje, pokud je v překreslovaném snippetu ten, který má spouštět akci.
A u tebe máš ajax navázaný na title. Nechtěl jsi ho vázat spíš na autora? (Jedná se o ten první select v JS.)

Editoval Šaman (2. 12. 2014 18:25)

JARDA001
Člen | 4
+
0
-

Chyba se vloudila, nicméně ať provedu úpravu na

<script>
$(function(){
  $.nette.init();

  $('select[name=author]').change(function () {
    $.nette.ajax({
      url: {link invalidate!},
      data: {
	'value': $('select[name=title]').val(),
      }
    });
  });
});
</script>

či do obou dám author, tak se stejně nic nemění.

Jinak pro jistotu, kde že by měla být uvedena ta AJAX fce? Aby to nebyla zase další moje blbost…

Šaman
Člen | 2668
+
0
-

A reaguje ti ten JS? Zjistíš to ve FF ve výjojářské konzoli. Pokud ne, je problém v něm, pokud ano, tak se tam dá zjistit i odpověď, kde by třeba byla vypsaná chyba.
Ten JS mám vložený přímo do těla šablony a běhá to.

JARDA001
Člen | 4
+
0
-

Tak sa omlouvám, nakonec to byla vážně moje blbost. Já tu AJAX fci měl umístěnou v dílčí šabloně. Zkusil jsem ji přesunout do script bloku v hlavní šabloně (viz jak píšeš) a už to jede byť Opera (12.16) píše ve vývojářské liště toto:

Syntax error at line 487 while loading: syntax error
url: {link invalidate!},
-----------------^

Každopádně děkuju moc za pomoc a rady a omlouvám se za ochuzení o čas.

petr.pavel
Člen | 535
+
+2
-

Kam spěcháš, ještě jsi neskončil :-)
To, že ti Opera ukazuje kód z Latte, znamená, že ten Latte kód máš někde, kde se na něj Latte nedostane. Tipuju, že v souboru .js, který vracíš rovnou a ne přes Nette. Takže musíš zařídit, aby se ti parsoval.

Osobně si url předávám přes data atribut:

<select name="author" data-url="{link invalidate!}">
$('select[name=author]').change(function () {
    $.nette.ajax({
      url: $(this).data('url'),
...