Formulář: nefunkční tlačítko
- vyndalin
- Člen | 11
Ahoj,
mám presenter:
<?php
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Form;
use Nette\Mail\Message;
use Nette\Mail\SendmailMailer;
final class RegExhibitorPresenter extends Nette\Application\UI\Presenter
{
/** @var Nette\Database\Context */
private $database;
/** @var Nette\Mail\Mailer */
private $mailer;
public function __construct(Nette\Database\Context $database, Nette\Mail\Mailer $mailer)
{
$this->database = $database;
$this->mailer = $mailer;
}
public function createComponentRegExhibitorForm(): Nette\Application\UI\Form
{
$form = new Form();
$form->addEmail('email', 'E-mail:')
->setAttribute('class', 'formbold-form-input')
->setHtmlAttribute('placeholder', '')
->setRequired('Prosím, zadejte svůj e-mail.');
//...další prvky
$form->addSubmit('send', 'Odeslat registraci')
->setHtmlAttribute('class', 'formbold-btn');
$form->onSuccess[] = [$this, 'process'];
return $form;
}
public function process(Form $form, array $values): void
{
$this->database->table('regexhibitors')->insert([
'email' => $values['email'],
//...další prvky
]);
$mail = new Nette\Mail\Message;
$mail->setFrom('newsletter@example.com')
->addTo($values['email'])
->setSubject('Jsi zaregistrován, ' . $values['name'] . '')
->setHtmlBody('<h1>Přihlaste se k odběru novinek ze světa Nette!</h1><p>TRvůj variabilní symbol je: ' . $uniqueId . '</p>');
$this->mailer->send($mail);
}
}
Pokud nechám formulář v šabloně vygenerovat přes {control regExhibitorForm}, tak vše funguje korektně. Pokud ale v šabloně zadávám prvky takto:
{form regExhibitorForm}
<div class="formbold-input-flex" >
//...
<div class="formbold-input-flex">
<div>
<label for="email" class="formbold-form-label"> E-mail *</label>
{$form['email']->getControl()}
</div>
<div>
//...
</div>
</div>
{$form['send']->getControl()}
{/form}
Tak mi tlačítko nefunguje a funkce ‚process‘ se nespustí. Když
v presenteru změním caption/label tlačítka, tak se změna v šabloně
projeví, což mě vede k myšlence, že se jedná o tlačítko ‚send‘,
ale ‚process‘ už to nespustí. Nevím co dělám špatně. Poradíte?
Děkuji moc.
Vyndalin
- vyndalin
- Člen | 11
Ahoj @nightfish,
Toto jsem zkoušel {input …}, ale chová se to stejně. Problém je v té
šabloně a konkrétně v tom tlačítku, protože i když tam nechám
všechny required pole a nechám nette formulář vygenerovat, tak se data do db
uloží a mail se odešle. Šablona ten prvek rozezná spravně (soudě dle
změny caption, která se projeví). Vše mě směřuje k myšlence, že
problém je v tom vykreslení. Protože ikdyž na tom tlačítku změním akci
na nesmysl, tak tracy nevyhodí chybu, pouze se form přenačte. Kdyby to při
změně caption nereagovalo, tak si řeknu, že se sice vykreslí nějaké
statické tlačítko, ale není to to moje. Ale takhle „jen“ neplní svou
funkci. Fakt nevím.Jestli tam mám zapnutý „vyndalin ignore mode“,
nebo co…
- nightfish
- Člen | 519
@vyndalin Jen pro jistotu: dumpni si v šabloně
{dump $form->getErrors()}
– třeba z toho něco
vykoukáš.
Pokud by ani tohle nepomohlo, tak si v presenteru přidej
$form->onSubmit[] = [$this, 'submitted'];
a k tomu metodu
public function submitted(Form $form): void
, v níž si dumpni
$form->getValues()
nebo
$form->getUntrustedValues()
v nette/forms
3.1 –
tím zjistíš, jestli se ti alespoň submit formuláře provede správně.
Dalším krokem je pak debuggování, kde si budeš proklikávat jednotlivé kroky zpracování requestu/formulář než zjistíš, kde se to ztrácí.
- Kamil Valenta
- Člen | 822
Ono by bylo úplně nejrychlejší ukázat celý formulář (bez výpustky
//…další pravky) a celé latte (bez výpustky //…).
Protože jsi ukázal to, kde problém není – a schoval to, kde problém
s největší pravděpodobností je.
- vyndalin
- Člen | 11
Kamil Valenta napsal(a):
Ono by bylo úplně nejrychlejší ukázat celý formulář (bez výpustky //…další pravky) a celé latte (bez výpustky //…).
Protože jsi ukázal to, kde problém není – a schoval to, kde problém s největší pravděpodobností je.
Ahoj Kamile,
děkuji za reakci. Skryl jsem jen další prvky formuláře, aby kód nebyl tak
dlouhý.
Každopádně problém vyřešen aniž bych cokoliv dělal. Pouze jsem
kamarádovi ukazoval v čem je problém, takže jsem si {form …}..{/form}
zakomentoval, napsal {control …} a pak vrátil zpět a {form …}najednou
začal fungovat přesně jak jsem očekával. Nic jiného jsem nedělal (ani
nemazal cache – prostě nic). Fakt nevím proč to včera nešlo.
Každopádně děkuji všem, kdo mi věnovali čas – jste skvělí.
Vyndalin