Ajax závislý select box(kuchařka) – nepředá se parametr

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

Zdarvim,
udělal jsem si závislý select box pomocí kuchařky. A zasekl jsem se na předání parametru hodnoty vybraného selectu. Mám následující:
@layout.latte:

{snippet form}
    {control selectForm}
         <script>
          $("form").delegate('#'+{$control["selectForm-static"]->htmlId}, 'change', function(){
                $.get({link selectLoad!}, {"id": $(this).val()});
          });
         </script>
{/snippet}

HomePagePresenter:

public function handleSelectLoad()
    {
      if($this->isAjax()){
          $form = $this->getComponent("selectForm"); // our form
          $newArray = array(
            $this->getParam('id'),
          );

          $form["dynamic"]->setItems($newArray); // set up new values

          $this->invalidateControl('form');
      }

    }

Snažil jsem se to natvrdo dostat přes getParam, ale bohužel to pole je prázdný. Když jsem tam zkusil dát getParam(‚do‘), tak to vyhodí selectLoad, ale nevim proč to id nic nevyhodí. Zkoušel jsem ve firebugu zjistit, jaký data se odesílají a id se tam předává:?do=selectLoad&id=2.
Takže nechápu, jaktože to není schopný to id převzít v tom presentru. Za pomoc budu velmi rád.

Prochy
Člen | 91
+
0
-

Nakonec jsem si to vyřešil následovně:

$.get({$basePath}+'/homepage/default/'+$(this).val()+'?do=selectLoad');

Snažil jsem to udělat následovně:
$.get({link selectLoad!,id=>$(this).val()});
Ale bohužel se mi nepodařilo zjistit, jak se přenáší do latte zápisu proměnná z jquery. Tak si prozatím musim postačit s tímhle.

Tomáš Votruba
Moderator | 1114
+
0
-

Prochy napsal(a):

Snažil jsem se to natvrdo dostat přes getParam, ale bohužel to pole je prázdný. Když jsem tam zkusil dát getParam(‚do‘), tak to vyhodí selectLoad, ale nevim proč to id nic nevyhodí. Zkoušel jsem ve firebugu zjistit, jaký data se odesílají a id se tam předává:?do=selectLoad&id=2.
Takže nechápu, jaktože to není schopný to id převzít v tom presentru. Za pomoc budu velmi rád.

Ahoj, píšeš, že id se předává, což je obvykle stěžejní problém (na js tedy nic měnit nemusíš). Metoda handleSelectLoad() by měla přijímat id:

public function handleSelectLoad($selectId) // pozor, zda v url již nemáš $id, např. edit/32 apod.
{
	dump($selectId); // v tvém případě 2
}

Doporučuji debugovat tak, že si do adresy dáš ?do=selectLoad&id=2 a budeš testovat, zda se formulář nějak změnil, či ne.

Prochy
Člen | 91
+
0
-

Tak závislost mi už funguje. Ale po odeslání formuláře se neuloží proměnný. Prostě když dám getValue u toho závislýho selectu, tak to vyhodí null. Zatím to řeším pomocí persistetní proměnný, kde nastavuju hodnoty toho selectu, aby se následně při refreshi objevili v továrničce. Ještě mě napadlo řešit to celý pomocí ajaxu, ale nevim jak předat všechny hodnoty inpůtu v jquery.

Tomáš Votruba
Moderator | 1114
+
0
-

Prochy napsal(a):

Tak závislost mi už funguje. Ale po odeslání formuláře se neuloží proměnný. Prostě když dám getValue u toho závislýho selectu, tak to vyhodí null. Zatím to řeším pomocí persistetní proměnný, kde nastavuju hodnoty toho selectu, aby se následně při refreshi objevili v továrničce. Ještě mě napadlo řešit to celý pomocí ajaxu, ale nevim jak předat všechny hodnoty inpůtu v jquery.

Tohoto sis v kuchařce všiml?

/**
 * 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...
}
boky
Člen | 18
+
0
-

Jestli to mas v komponente, tak zkus tohle…

https://forum.nette.org/…e-neziska-id#…