Závislý select podle kuchařky

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

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
+
0
-

Mám pravděpodobně stejný problém. handle se zavolá (200 OK), ale nic se nestane, jako by se mi neinvalidoval ten formulář.

duskohu
Člen | 778
+
0
-

a invaliduje sa ti snippet? a ak ano, tak sa prenasaju nejake data?

raketoplan2005
Člen | 147
+
0
-

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");
duskohu
Člen | 778
+
0
-

Pozeral si to cez firebug v console? tam si vies v polozke JSON pozriet ci tam mas ten snippet a jeho obsah.

raketoplan2005
Člen | 147
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

pavelplzak: Děkuji, na to jsem nepřišel :-) Už to běhá!

Editoval raketoplan2005 (27. 12. 2012 13:57)

kmaci
Člen | 6
+
0
-

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
+
0
-
$.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
+
0
-

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 | 32
+
0
-

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