Formulář: nefunkční tlačítko

vyndalin
Člen | 11
+
0
-

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

nightfish
Člen | 474
+
0
-
  1. Nezapomínáš vyrenderovat nějaký prvek, který má nastaveno setRequired()?
  2. Pokud ne, změní se něco, když kód v šabloně upravíš na {input email}, resp. {input send}?
vyndalin
Člen | 11
+
0
-

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 | 474
+
0
-

@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 | 762
+
0
-

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
+
+1
-

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