ajax komponenta a predani proměnné

crookslovacko
Člen | 74
+
0
-

Mám komponentu a v ní formulář. Na input ico formuláře je navázán script pro odeslání ica do handlaru v komponentě. Proc je prosím ico null v handl komponenty? Jde to tak predat?
Pokud je handler v presenteru tak se ico preda.

        <script>
            function ares(){
                            ico = document.getElementById("ico").value;
                            alert(ico);
                            $.ajax({
                                    method: 'get',
                                    url: {link ares!},
                                    data: { ico: ico }
                            });

            };
        </script>

public function handleAres($ico)
    {
       bdump($ico);
    }

     public function createComponentCreateCompanyForm()

    {
        $form = new Form;

        $form->addText('ico','IČO:')
             ->setRequired('Zadejte IČO')
              ->setHtmlAttribute('id', 'ico')
             ->setHtmlAttribute('onchange', 'ares()');

        $form->addText('dic','DIČ:')
             ->setRequired('Zadejte DIČ');

        $form->addText('company_name','Název firmy:')
            ->setRequired('Zadejte název firmy');

        $form->addText('company_adress','Adresa firmy:')
            ->setRequired('Zadejte adresu firmy');

        $form->addText('company_person_name','Adresa firmy:')
                        ->setRequired('Zadejte jméno');

        $form->addText('company_person_email','Adresa firmy:');

        $form->addSubmit('send', 'Uložit')
        ->setAttribute('class', 'btn btn-info btn-sm');


        $form->onSuccess[] = [$this, 'processForm'];
        return $form;
    }

Editoval crookslovacko (31. 3. 2022 4:51)

nightfish
Člen | 468
+
+1
-

@crookslovacko
Zatímco parametry, předávané do presenteru, se jmenují stejně, jak je uvedeš v signatuře action*() nebo render*() metody, u komponent jsou v URL prefixovány názvem komponenty (resp. v případě zanořených komponent názvy celého stromu nadřazených komponent – tedy např. companyForm-ico).

Řešit se to dá třeba tak, že si udělám odkaz na handle už s parametrem s nějakou dummy hodnotou a při provádění ajaxového požadavku ji nahradím skutečnou hodnotou z formuláře. Něco ve stylu:

<script>
	function ares(){
		let ico = document.getElementById("ico").value;
		let link = {link ares! ico => '__placeholder__'};
		let url = link.replace('__placeholder__', ico);

		console.log({
			ico: ico,
			link: link,
			url: url
		});

		$.ajax({
			method: 'get',
			url: url
		});
	};
</script>

(psáno z hlavy, bez záruky)

crookslovacko
Člen | 74
+
0
-

MOc děkuji za vysvětlení funguje

crookslovacko
Člen | 74
+
0
-

Tak omlouvám se ale ještě mi něco nejde.
Nevím jak teď dostat získané data do formuláře.
Myslel jsem to nějak takhle:
Kousek kodu z handluares .. je to ten kde jsem posilal ico

 $form = $this->getComponent('createCompanyForm');
          $form->setDefaults(['dic'=>$ares_dic_fin,
                              'company_name'=>$ares_firma_fin,
                              'company_adress'=>$ares_cp1_fin
                             ]);
         $this->redrawControl(form);

Pak v .latte komponenty mam

{block content}
{snippet form}
{control createCompanyForm}
{/snippet}
 <script src="{$basePath}/js/jquery-3.6.0.min.js"></script>

<script>
	function ares(){
		let ico = document.getElementById("ico").value;
		let link = {link ares! ico => '__placeholder__'};
		let url = link.replace('__placeholder__', ico);

		console.log({
			ico: ico,
			link: link,
			url: url
		});

		$.ajax({
			method: 'get',
			url: url
		});
	};
</script>

ale formular se daty neaplni..tedy bdump form value ma ale neprekresli se.

Ozzrel
Generous Backer | 51
+
0
-

No a není to tím že nemáš nikoho kdo to překreslí?
viz AJAX & snippety dokumentace

nightfish
Člen | 468
+
0
-

@crookslovacko

V presenteru:

public function handleAres($ico)
{
   // ... ziskani $ares_dic_fin, $ares_firma_fin, $ares_cp1_fin
  $this->sendJson([
    'dic' => $ares_dic_fin,
    'company_name' => $ares_firma_fin,
    'company_adress' => $ares_cp1_fin
  ]);
}

V šabloně:

$.ajax({
    method: 'get',
    url: url
}).done(function(data) {
    console.log(data); // data.dic, data.company_name
});