Po odoslaní sa nezavolá callback

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

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.

Jan Endel
Člen | 1016
+
0
-

přejmenuj onSubmit na onSuccess.

zeero
Člen | 15
+
0
-

Nepomohlo, skúšal som aj OnClick a nepomohlo.

Jan Endel
Člen | 1016
+
0
-

Jak formulář vykresluješ?

zeero
Člen | 15
+
0
-

cez templates pomocou {control formData}

jtousek
Člen | 951
+
0
-

Kdy se ten callback má podle tebe zavolat, ale nezavolá?

zeero
Člen | 15
+
0
-

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.

jtousek
Člen | 951
+
0
-

Ano v tom případě by se měl callback zavolat. Tedy pokud projdou validátory, což snad jo. Nejspíše ti to kazí nějaká blbost někde mimo ten formulář. Věšteckou kouli bohužel nemáme. ;-)

22
Člen | 1478
+
0
-

pilec napsal(a):

přejmenuj onSubmit na onSuccess.

@pilec: čemu to mělo jako prospět?
onSubmit se provede vždy, kdežto onSuccess se volá jen v případě validních dat..

Jan Endel
Člen | 1016
+
0
-

@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.

jtousek
Člen | 951
+
0
-

@pilec: Data v $_POST jsou takže se odešle.

zeero
Člen | 15
+
0
-

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:&quot;Mus\u00ed obsahova\u0165 iba cel\u00e9 \u010d\u00edslo&quot;},{op:':range',msg:&quot;Hodnota mus\u00ed by\u0165 v\u00e4\u010dsia ako 1&quot;,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:&quot;Polo\u017eka nie je vyplnen\u00e1&quot;,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:&quot;Mus\u00ed obsahova\u0165 iba cel\u00e9 \u010d\u00edslo&quot;},{op:':range',msg:&quot;Hodnota mus\u00ed by\u0165 v\u00e4\u010dsia ako 1&quot;,arg:[1,null]}" value="" /></td>
</tr>
<tr>
	<th>&nbsp;</th>
	<td><input type="submit" class="button" name="save" id="frmformData-save" value="Uložiť" /></td>
</tr>
</table>
</form>
22
Člen | 1478
+
0
-

@pilec: tomu nerozumím, co tím chceš říct, to je přece callback, kde mě validata jaksi nezajímá..jinak by/bych použil onSuccess[]

Editoval 22 (20. 6. 2012 15:11)

vvoody
Člen | 910
+
0
-

@zeero: Zmenil si action cez setAction(…)?

zeero
Člen | 15
+
0
-

@vvoody: Nie, nezmenil, otvaram stranku cez admin.php.

jtousek
Člen | 951
+
0
-

@zeero: Možná to nikam nepovede, ale mohl bys ukázat celý Presenter?

Jinak v podobných situacích už si klidně otvírám zdrojáky Nette a sázím barDump() do Presenter::run().

zeero
Člen | 15
+
0
-

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}
jtousek
Člen | 951
+
0
-

Budu hádat… po odeslání formuláře isset($_GET[‚menu‘]) vrátí FALSE, že? ;-)

zeero
Člen | 15
+
0
-

@jtousek Máš pravdu, tam je tá chyba :) Ďakujem veľmi pekne za pomoc.

jtousek
Člen | 951
+
0
-

Mimochdem $_GET bys v Nette neměl potřebovat… zkus $this->getParameter(‚menu‘);