ajax komponenta a predani proměnné
- crookslovacko
- Člen | 75
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 | 517
@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 | 75
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 | 54
No a není to tím že nemáš nikoho kdo to překreslí?
viz AJAX & snippety
dokumentace
- nightfish
- Člen | 517
@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
});