Ajax, selectBox, formulář – začátečník

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

Dobrý den,

prosím o radu s problémem. Podobný problém se ve foru řešil už vícekrát, ale i přesto se mi nepodařilo najít řešení. S Ajaxem nemám zatím větší zkušenosti.

Co chci docílit, v selectBoxu vyberu položku a na základě ní se pak automaticky doplní další data do inputu.

Postupoval jsem podle tohoto řešení https://forum.nette.org/…aru-s-ajaxem .

Výsledek je takový, že se mi data vypisují, ale hodně podivně:

  • Ulice: ulice 2 Číslo popisné: cislo popisne 2 Město: mesto 2
  • Číslo popisné:
  • Město:

Muj kód

<?php
class HomepagePresenter extends Presenter
{
    private $objednavatel = array(
         '1'  => 'Objednavatel 1',
         '2' => 'Objednavatel 2',
         '3' => 'Objednavatel 3'
    );

    public function renderDefault()
	{
		$this->template->form = $this['formObjednavka'];
	}

    public function createComponentFormObjednavka()
    {
        $form = new AppForm;

        $form->addSelect('objednavatel', 'Objednavatel: ', $this->objednavatel);
        $form->addText('ulice', 'Ulice: ');
        $form->addText('cp', 'Číslo popisné: ');
        $form->addText('mesto', 'Město: ');
        $form->addSubmit('submit1', 'Odeslat');

        $form->onSubmit[] = array($this,"onSubmit");

          $form['objednavatel']->getControlPrototype()
                ->onchange('loadBox(this.value);');

         return $form;
    }

    public function onSubmit(Form $form)
    {
        $data = $form->getValues();
        Debug::dump($data);
    }


    public function handleLoadData($value)
    {
        $form =  $this->getComponent('formObjednavka');

        $form['ulice']->setValue('ulice '.$value);

        echo $form['ulice']->getLabel();
        echo $form['ulice']->getControl().'<br>';

        $form['cp']->setValue('cislo popisne '.$value);
        echo $form['cp']->getLabel();
        echo $form['cp']->getControl().'<br>';

        $form['mesto']->setValue('mesto '.$value);
        echo $form['mesto']->getLabel();
        echo $form['mesto']->getControl();

        $this->terminate();
    }
}
?>

V šabloně

{control $form begin}
    <ul>
        <li>{$form['objednavatel']->label} {$form['objednavatel']->control}</li>
        <li>{$form['ulice']->label} {$form['ulice']->control}</li>
        <li>{$form['cp']->label} {$form['cp']->control}</li>
        <li>{$form['mesto']->label} {$form['mesto']->control}</li>
    </ul>
    {$form['submit1']->label} {$form['submit1']->control}
{control $form end}

Skript:

<script type="text/javascript">
    function loadBox(value)
    {

        console.log(value);

        $.get("?do=loadData", {"value": value}, function(data) {
                        $('#frmformObjednavka-ulice').parent().html(data);
                        $('#frmformObjednavka-cp').parent().html(data);
                        $('#frmformObjednavka-mesto').parent().html(data);
                });
    }
</script>

Myslím, že těch chyb bude více. Už jsem toho vyzkoušel více, ale pořad mám chaotický výsledek.

Radoss
Člen | 15
+
0
-

Zkusim se zeptat jednodušeji.

Když mam handle metodu:

<?php
public function handleLoadData($value)
    {
        $form =  $this->getComponent('formObjednavka');

        $form['ulice']->setValue('ulice '.$value);
        echo $form['ulice']->getLabel();
        echo $form['ulice']->getControl();

        $form['cp']->setValue('cislo popisne '.$value);
        echo $form['cp']->getLabel();
        echo $form['cp']->getControl();

        $form['mesto']->setValue('mesto '.$value);
        echo $form['mesto']->getLabel();
        echo $form['mesto']->getControl();

        $this->terminate();
    }
}
?>

Jakým způsobem vykreslím znovu formulář, který jsem naplnil daty pomicí setValue(), aby nebylo v handle metodě presenteru echo…

<?php
echo $form['ulice']->getLabel();
echo $form['ulice']->getControl();

echo $form['cp']->getLabel();
echo $form['cp']->getControl();

atd.
?>

Děkuji za trpělivost.

srigi
Nette Blogger | 558
+
0
-

Ty asi iba potrebujes naplnit do inputov nejake dynamicky ziskane udaje. Tak si ich posli cez payload a v JS ich injektuj priamo do policok. Neposielaj si nove HTML elementy.

Radoss
Člen | 15
+
0
-

Srigi, ano, tak jak pises. Potrebuji inputy naplnit dynamickymi udaji. S Ajaxem nemam zatim zadne zkusenosti a zatim nevim, jak data poslat pres payload a jak injektovat do policek :-/

Radoss
Člen | 15
+
0
-

Zatim jsem to vyresil zasilanim novych HTML elementu. Dival jsem se, ze se v Quick Startu chysta kapitola „Přidáváme AJAX“, tak se budu tesit.

srigi
Nette Blogger | 558
+
0
-

Radoss >> ak sa najde cez tyzden cas, rad sa podujmem napisat test aplikacku, tak ako som to spravil tu. BTW skus sa pozriet na tie zdrojaky, je to tiez o AJAXe, mozno ti to pomoze.

Radoss
Člen | 15
+
0
-

Srigi, mrknu, diky moc.