Po odoslaní sa nezavolá callback
- zeero
- Člen | 15
Zdravím,
mám Nette 2.0.3 v PHP 5.3 a vo formulári sa po odoslaní nezavolá callback. Formulár je UI/Form. Vie mi niekto poradiť, kde môže byť problém?
Môj zdroják:
<?php
use Nette\Application\UI\Control,
Nette\Application\UI\Form,
Nette\Forms\Controls\SubmitButton,
Nette\Utils\Html;
protected function createComponentFormData() {
$form = new Form;
.
.
$form->addSubmit('save', 'Uložiť');
$form->onSubmit[] = callback($this, 'saveData');
return $form;
}
public function saveData($form) {
$values=$form->getValues(TRUE);
var_dump($values);
}
?>
Ďakujem za pomoc.
- zeero
- Člen | 15
jtousek napsal(a):
Kdy se ten callback má podle tebe zavolat, ale nezavolá?
Po odoslaní formulára sa mi dá do URL ?do=formData-submit a potom by sa mal zavolať callback a predať vyplnené údaje z formulára. Lenže nič sa nezavolá. Formulár sa odošle správne, lebo keď som si dal pokusne vypísať POST priamo do template, tak sú v poriadku.
- Jan Endel
- Člen | 1016
@zeero: Pošli co ta šablona vygeneruje, nějak se mi to celé nezdá, odešle se ten formulář jako takový nebo submit nereaguje?
@22: Nikde nemá ve zpracování formuláře isVallid(), tak jsem ho chtěl jen nasměrovat na správnou cestu, aby se nedostával do nekonzistentního stavu.
- zeero
- Člen | 15
pilec napsal(a):
@zeero: Pošli co ta šablona vygeneruje, nějak se mi to celé nezdá, odešle se ten formulář jako takový nebo submit nereaguje?
Formulár sa odošle správne a aj submit button reaguje a po jeho kliknutí odošle dáta, len sa nezavolá callback aby ich predal ďalej.
Formulár vygeneruje toto:
<form action="/admin.php?do=formData-submit" method="post" id="frm-formData">
<table>
<tr>
<th><label for="frmformData-input_1">Číslo operácie:</label></th>
<td><input type="text" class="text" name="input_1" id="frmformData-input_1" data-nette-rules="{op:':integer',msg:"Mus\u00ed obsahova\u0165 iba cel\u00e9 \u010d\u00edslo"},{op:':range',msg:"Hodnota mus\u00ed by\u0165 v\u00e4\u010dsia ako 1",arg:[1,null]}" value="" /></td>
</tr>
<tr>
<th><label for="frmformData-input_2">Názov operácie:</label></th>
<td><input type="text" class="text" name="input_2" id="frmformData-input_2" data-nette-rules="{op:':minLength',msg:"Polo\u017eka nie je vyplnen\u00e1",arg:1}" value="" /></td>
</tr>
<tr>
<th><label for="frmformData-input_3">Týždenná kapacita (min):</label></th>
<td><input type="text" class="text" name="input_3" id="frmformData-input_3" data-nette-rules="{op:':integer',msg:"Mus\u00ed obsahova\u0165 iba cel\u00e9 \u010d\u00edslo"},{op:':range',msg:"Hodnota mus\u00ed by\u0165 v\u00e4\u010dsia ako 1",arg:[1,null]}" value="" /></td>
</tr>
<tr>
<th> </th>
<td><input type="submit" class="button" name="save" id="frmformData-save" value="Uložiť" /></td>
</tr>
</table>
</form>
- zeero
- Člen | 15
Cely presenter:
<?php
use Nette\Application\UI\Control,
Nette\Application\UI\Form,
Nette\Forms\Controls\SubmitButton,
Nette\Utils\Html;
class SchedulePresenter extends BasePresenter
{
protected function createComponentFormData() {
$form = new Form;
//$form->getElementPrototype()->setNovalidate('novalidate');
if (isset($_GET['menu']))
{
$form->addHidden("tableName")->setDefaultValue("data_".$_GET['menu']);
$form->addHidden("site")->setDefaultValue($_GET['site']);
$datas=dibi::query("select *,forms.id as id from forms INNER JOIN types ON types.id = forms.id_types where forms.id_pages={$_GET['menu']} order by forms.sort asc");
$data=$datas->fetchAll();
foreach ($data as $key => $value)
{
$name=$value['name'];
$id=$value['id'];
$type=$value['type'];
$value=$value['default'];
$default=NULL;
switch ($type)
{
case 'number':
$form->addText('input_'.$id, $name.':')->addRule(Form::INTEGER, 'Musí obsahovať iba celé číslo')->addRule(Form::RANGE, 'Hodnota musí byť väčsia ako %d', array(1, NULL))->setDefaultValue(@$default);
break;
case 'email':
$form->addText('input_'.$id, $name.':')->setEmptyValue('@')->addCondition(Form::FILLED)->addRule(Form::EMAIL, 'E-mailová adresa je neplatná');
break;
case 'text':
$form->addText('input_'.$id, $name.':')->addRule(Form::MIN_LENGTH, 'Položka nie je vyplnená',1);
break;
}
}
$form->addSubmit('save', 'Uložiť');
$form->onSuccess[] = callback($this, 'saveData');
}
return $form;
}
public function saveData($form)
{
$values=$form->getValues(TRUE);
var_dump($values);
}
}
?>
Cely template:
{var $robots = noindex}
{block #content}
{control formData}
{/block}
{block #head}
<script>
("form :input").focusout(function(){
var elmName = $(this).attr("name");
$("#inline-error-" + elmName).remove();
var b = document.getElementById($(this).closest("form").attr("id"));
if (b) {
var c = nette.getFormValidators(b);
if (c[elmName]) {
var q = c[elmName](b);
if (q) {
$(this).parent().append("<p id='inline-error-" + elmName + "' class='inline-error'>" + q + "</p>");
}
}
}
});
</script>
{/block}