Ajax – překreslení formuláře nenačte data
- d@rkWolf
- Člen | 167
Zdravím,
mám add/edit formulář na adresu v komponentně – když odstraním ajax,
vše funguje, data se uloží, redirect(this) reloadne stránku, formulář se
načte s nově uloženými údaji, změní se popisek tlačítka
(přidat->upravit).
Jak přidám třídu ajax, fungovat to přestane. Data se sice uloží, ale
dotaz v ActionDefault, který má ty uložené údaje načíst a vyplnit je do
formuláře vyjde s výsledkem null(ten bdump) – ten samý, který při
redirectu funguje správně. Díky tomu nezmění tlačítko a nedoplní id
záznamu, takže další úprava není možná. Je to u přihlášeného
uživatele, getId() vrací ID správně, pokud si dotaz s výsledkem null
skopíruju z Tracy do PhpMyAdmin, výsledkem je správně uložený řádek. Je
tam použitá Naja 1.8×.
Úplně mi uniká, kde je problém.
Presenter:
final class MyPresenter extends BasePresenter
{
use AddressFormFactory;
public function actionDefault(int $itemId): void
{
$address = $this->webAddressRepo->getByUser($this->getUser()->getId());
bdump($address);
if ($address) {
$addressForm =$this->getComponent('addressForm')['form'];
$addressForm->addHidden('id');
/** @var SubmitButton $send */
$send = $addressForm->getComponent('send');
$send->setCaption('Update address');
$addressForm->setDefaults($address);
}
}
}
Traita s továrnou komponenty
trait AddressFormFactory
{
#[Inject]
public IAddressFormFactory $addressFormFactory;
protected function createComponentAddressForm(): AddressForm
{
$control = $this->addressFormFactory->create($this->getUser()->getId());
$control->onSave[] = function (AddressForm $control) {
$control->flashMessage($this->translator->translate('Address saved'), 'alert alert-success');
if ($this->isAjax()) {
$control->redrawControl('form');
$control->redrawControl('flashes');
} else {
$this->redirect('this');
}
};
return $control;
}
}
šablona komponenty s formulářem (použil jsem bootstrap formátování jako je v jednom z Examples)
{import '../../Presenters/templates/@components/form-bootstrap5.latte'}
<div n:snippet="flashes" data-naja-history-nocache>
<div n:foreach="$flashes as $flash" n:class="alert, $flash->type, alert-dismissible, fade, show" role="alert">
{$flash->message}
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
</div>
</div>
<div class="account-form-area" n:snippet="form">
{include bootstrap-form form}
</div>
v šabloně presenteru už je to pak vloženo jen takto:
{control addressForm}
Editoval d@rkWolf (8. 4. 19:37)