Obsluha formuláře v control nezachycuje callback po submitu
- Mesiah
- Člen | 240
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…
- Mesiah
- Člen | 240
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
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
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
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)