nefunkční signál po odeslání formuláře

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

Ahoj,
mám dynamicky generované formuláře s dynamickým počtem inputů:

<?php
	public function createComponentPersonResultsForm() {
		$this->books = $this->book->findAll();

		$form = new Nette\Application\UI\Multiplier(function ($person_id) {
            $form = new Nette\Application\UI\Form;
            $results = $form->addContainer("results");
            foreach ($this->books as $book) {
                $results->addText($book->id, $book->title)
                        ->setType('number')
                        ->setAttribute('class', "form-control number")
                        ->setAttribute('max', 9999)
                        ->setAttribute('maxlength', 4)
                        ->setDefaultValue(0)
                        ->addRule(Form::INTEGER, 'Musí být číslo')
                        ->addRule(Form::RANGE, 'Musí být v rozsahu %d do %d', array(0, 9999));
            }

            $form->addHidden('person_id', $person_id);
            $form->addSubmit('save', 'Uložit');
            $form->onSuccess[] = array($this, 'saveResults');
            return $form;
        });
		return $form;
	}

    public function saveResults(Form $form, $values) {
        $week_id = $this->week->getOrCreateWeekId($this->week_number, $this->year);

        foreach ($values->results as $book_id => $quantity) {
            $this->distribution->insertResult($values->person_id, $week_id, $book_id, $quantity);
        }

        $this->payload->points_sum = $this->distribution->getPersonSumPoints($values->person_id, $week_id);
        $this->payload->person_id = $values->person_id;
        $this->flashMessage("Výsledky byly uloženy", 'success');
        $this->sendPayload();
    }
?>

formulář posílám ajaxově:

<?php
$.nette.ajax({
    type: "POST",
    url: $(this).attr("action"),
    data: $(this).serialize(),
    beforeSend: function() {
        inputs.addClass("disabled")
              .prop('disabled', true);

        submit_button.val("Ukládám.");

    },
    success: function(payload) {
        var row = $('tr#person-' + payload.person_id);
        row.find("td[data-category='points']").html(payload.points_sum ? payload.points_sum : ".");
        inputs.removeClass("disabled")
              .prop('disabled', false);

        submit_button.val("Uložit");
    }
});
?>

šablona:

<?php
...
    <tr n:foreach="$persons as $person" id="person-{$person->id}">
        <td>{$person->name}</td>
        <td data-category="points">{isset($book_points[$person->id]) ? $book_points[$person->id] : "."}</td>
        <td>
        {form personResultsForm-$person->id}
            <table class="result-inputs">
            {foreach $books as $book}
                <tr><th>{label results-$book->id /}</th><td>{input results-$book->id}</td></tr>
            {/foreach}
            </table>
            {input person_id}{input save, class => "btn btn-primary submit"}
        {/form}
        </td>
    </tr>
...
?>

Pokud mám těch inputů okole deseti, tak vše funguje perfektně, formulář se odesílá, data se uloží do DB, odpověd příjde. V momentě kdy je těch inputů cca 60, tak se formulář odešle, proběhne metoda Action a Render, ale nedojde k zavolání signálu, přestože parametr „do“ je v POST požadavku a i dorazí na server. Nevíte čím by to mohlo být? Čím je způsobeno, že při vyším počtu prvků formuláře se to chová takto podivně?
Díky za odpověď.

Pavel Kravčík
Člen | 1196
+
0
-

A co Ti hlásí konzole? (https://getfirebug.com/firebuglite)

Bart
Člen | 11
+
0
-

Konzole vrátí HTML celé stránky, protože $this->sendPayload() je právě v tom signálu.

Bart
Člen | 11
+
0
-

žádný error, nic ani v loggeru ani v consoli

Bart
Člen | 11
+
0
-

volání signálu jsem přidal do metody Action:

<?php
if($this->isAjax()) {
	$person_form = $this->getSignal()[0];
    $this->saveResults($this[$person_form], $this[$person_form]->getValues());
}
?>

takto už to funguje, ale je mi záhadou, proč se ten signál nezavolá automaticky.