Obsluha formuláře v control nezachycuje callback po submitu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Mesiah
Člen | 240
+
0
-

Ahoj,
prosím Vás, z nějakého důvodu se mi v controlu nezachycuje submit formuláře; můžete mi prosím poradit, v čem může být problém?
Samotný control:

namespace Questions\Controls;
use Questions\Forms,
    Nette\Application\UI;

/**
 * Description of AskQuestion
 *
 * @author Sebastian
 */
class AskQuestion extends UI\Control
{
    /**
     * @var \Model\Entity\User
     */
    private $user;

    public function __construct(\Model\Entity\User $user) {
        parent::__construct();
        $this->user = $user;
    }

    /**
     * Render component
     */
    public function render() {
        $this->template->setFile(dirname(__FILE__) . '/templates/AskQuestion.latte');
        $this->template->render();
    }

    /**
     * Component form factory
     */
    public function createComponentAskForm() {
        $form = new Forms\AskQuestion();
        $form->onSuccess[] = callback($this, 'askFormSubmitted');
        return $form;
    }

    /**
     * Handler pro obsluhu postbacku
     */
    public function askFormSubmitted(UI\Form $form) {
        throw new \Nette\Application\ApplicationException("Fuck!");
        $values = $form->getValues();
        dump($values);

        try {
            $this->presenter->flashMessage('...');
        }
        catch (\Exception $ex) {
            $this->presenter->flashMessage($ex->getMessage());
        }
        //$this->presenter->redirect('this');
    }
}

registrace v base presenteru

/**
     * Create ask question form
     * @return \Questions\Controls\AskQuestion
     */
    public function createComponentAskQuestion() {
        $user = NULL;

        if ($this->user->isLoggedIn()) {
            $user = $this->userOrchestration->find($this->user->id);
        }

        $control = new \Questions\Controls\AskQuestion($user);
        return $control;
    }

Když kouknete na kód, měl bych vyhodit ApplicationException, což se ale nestane…

Oli
Člen | 1215
+
0
-

Jen takovej prvni nastřel, nevytvaříš odesílací tlačítko jako addButton? Musí být addSubmit. Toho jsem si jednou nevšiml a hodinu kolem toho lítal jak zběsilej :-) Kdyžtak ještě přihoď jak vytváříš ten formulář…

Mesiah
Člen | 240
+
0
-

Hh, kéž by :)
Podobně vytvářím také registrační formulář, ale ten funguje jak má… Určitě půjde o nějakou hloupost, ale jak na to pořád koukám, tak to asi přehlížím… :/

namespace Questions\Forms;
use Nette\Forms\Rendering\DefaultFormRenderer;

/**
 * Description of AskQuestion
 *
 * @author Sebastian
 */
class AskQuestion extends BaseForm
{
    public function __construct() {
        parent::__construct();

        $renderer = $this->getRenderer();
        if ($renderer instanceof DefaultFormRenderer) {
            $renderer->wrappers['controls']['container'] = NULL;
            $renderer->wrappers['pair']['container'] = NULL;
            $renderer->wrappers['pair']['.error'] = NULL;
            $renderer->wrappers['control']['container'] = NULL;
            $renderer->wrappers['label']['container'] = NULL;
            $renderer->wrappers['control']['description'] = NULL;
            $renderer->wrappers['control']['errorcontainer'] = NULL;
        }
    }

    protected function buildForm() {
        $this->addText('title')->setRequired('Vyplňtě prosím krátký popis k otázce.');
        $this->addTextArea('text')->setRequired('Vyplňte prosím text otázky.');
        $this->addSelect('tags')->setHtmlId('tags');

        $this->addSubmit('send', 'Submit');
    }
}

EDIT: vyřešeno.
Z nějakého důvodu mi form nereagoval na onSuccess (je to snad špatně napsané?), ale na onSubmit ano – mimochodem není onSubmit nedoporučovaný?

/**
 * Component form factory
 */
public function createComponentAskForm() {
    $form = new Forms\AskQuestion();
    //$form->onSuccess[] = callback($this, 'askFormSubmitted');
    $form->onSubmit[] = callback($this, 'askFormSubmitted');
    return $form;
}

Editoval Mesiah (7. 4. 2014 16:37)

Jiří Nápravník
Člen | 710
+
0
-

OnSubmit ale budeš mít (pokud se nemýlím) vyvolaný i v případě, že nebude formulář validní. OnSuccess jen v případě, že je formulář vlaidní. a tak mě napadá:

nemáš tam nějaké valdiace, přes které neprojde.

druhá věc ten baseform dědí z nette\application\ui\form a ne ne nette\forms\form?

Mesiah
Člen | 240
+
0
-

Speciální validace nemám žádné, jen ty co jsou v metodě createForm…
Pro úplnost dodám vše k formulářům

namespace Questions\Forms;

/**
 * Abstract class for forms in application
 */
abstract class BaseForm extends Form
{
    public function __construct()
    {
        parent::__construct();
        $this->buildForm();
        $this->getElementPrototype()->addAttributes(array(
            'role' => 'form',
            'class' => 'form-horizontal'
        ));
    }

    /**
     * @return void
     */
    protected abstract function buildForm();
}
namespace Questions\Forms;
use Nette\Forms\Rendering\DefaultFormRenderer;

/**
 * Main base class for forms
 */
class Form extends \Nette\Application\UI\Form
{
    public function __construct()
    {
        parent::__construct();

        $renderer = $this->getRenderer();
        if ($renderer instanceof DefaultFormRenderer) {
            $renderer->wrappers['controls']['container'] = NULL;
            $renderer->wrappers['pair']['container'] = 'div class=form-group';
            $renderer->wrappers['pair']['.error'] = 'has-error';
            $renderer->wrappers['control']['container'] = 'div class=col-sm-9';
            $renderer->wrappers['label']['container'] = 'div class="col-sm-3 control-label"';
            $renderer->wrappers['control']['description'] = 'span class=help-block';
            $renderer->wrappers['control']['errorcontainer'] = 'span class=help-block';
        }
    }
}
Mesiah
Člen | 240
+
0
-

Ok, tak už vím i proč nefunguje onSuccess, jde o to, že mám definovaný select, jenže bez položek (Kendo UI z něj vytváří MultiSelectList) ale to neprojde Nette validací a jak ze selectu je vytvořený multiselectlist, tak se skryje validační zpráva…

Ok, tak jsem koukal, že před 9 měsíci to už bylo nahlášeno jako bug.
Challange accepted!

Editoval Mesiah (7. 4. 2014 18:56)