Získání dat z low-level formuláře

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

Zdravím, musel jsem díky lepšímu stylování sáhnout k low level formuláři, v šabloně ho mám definovaný takto

{form addReview}
... data
{/form}

V presenteru pak

protected function createComponentAddReview() {
    $form = new Form;
    $form->addProtection('Platnost formuláře vypršela! Zkuste to prosím znovu.');
    $form->onSuccess[] = [$this, 'addReviewSucceeded'];
    return $form;
}

protected function addReviewSucceeded(Form $form, $values) {
        dump($values);
}

Problém nastává na řádku onSuccess.
Tracy vyhazuje tento error Call to undefined method parent::addReviewSucceeded()., nevím, proč se volá metoda rodiče ale i když jsem i dal do rodičovské třídy, házelo to podobné blbosti.

Potřeboval bych vytáhnout data z formuláře a uložit je do databáze.
Mohl by mi někdo poradit co dělám špatně?

David Grudl
Nette Core | 8239
+
+1
-

Nejspíš nemůže být protected, ale musí být public.

Johnczek
Člen | 37
+
0
-

David Grudl napsal(a):

Nejspíš nemůže být protected, ale musí být public.

Funguje. Ještě menš ídotaz k tomu. Ta metoda addReviewSucceeded(Form $form) se provede hned po načtení šablony, což je nežádoucí chování, rád bych aby proběhla pouze a jen po submitu. Lze to nějak provést?

Vypadá to zatím takto

public function createComponentAddReview() {
    $form = new Form;
    $form->addProtection('Platnost formuláře vypršela! Zkuste to prosím znovu.');
    $form->onSuccess[] = [$this, 'addReviewSucceeded'];
    return $form;
}

public function addReviewSucceeded(Form $form) {
    $data = $form->getHttpData();
        if($data['isUpdate'] == 1) {
            $this->updateReview($data['reviewId'], $data['type'],$data['text'], $data['ratio']);
        } else {

        }

        if($this->product) {
            $this->flashMessage("Recenze úspěšně vložena", "success");
            $this->redirect("Detail:default");
        }
}
ali
Člen | 342
+
0
-

onSuccess callback se spousti az po odeslani a uspesne validaci formulare, ne pri jeho renderovani.. nespoustis tu metodu nekde v presenteru?

A vytvoreni componenty dej protected, to ale tvuj momentalni problem nevyresi.
protected function createComponentAddReview() {

Johnczek
Člen | 37
+
0
-

ali napsal(a):

onSuccess callback se spousti az po odeslani a uspesne validaci formulare, ne pri jeho renderovani.. nespoustis tu metodu nekde v presenteru?

A vytvoreni componenty dej protected, to ale tvuj momentalni problem nevyresi.
protected function createComponentAddReview() {

Nevolám. Jediné dva výskyty názvu metody je při její definici a při definici onsuccess př ivytváření komponenty. Výsledný form je takový

<form action="/GITprojects/IDS-IIS/www/detail/?id=1" method="post" id="frm-addReview">
                                    <div class="row">
                                        <div class="col-12 text">
                                            <textarea name="text" class="form-control" rows="6">Dlouhy text bla bla</textarea>
                                        </div>
                                    </div>
                                    <div class="row">
                                        <div class="col-6">
                                            <label>Hodnocení:</label>
                                            <div class="radio-review-block">
                                                <div class="radio review">
                                                        <label class="radio-inline"><b>0</b><input type="radio" name="ratio" value="0"></label>
                                                        <label class="radio-inline"><b>1</b><input type="radio" name="ratio" value="1"></label>
                                                        <label class="radio-inline"><b>2</b><input type="radio" name="ratio" value="2"></label>
                                                        <label class="radio-inline"><b>3</b><input type="radio" name="ratio" value="3"></label>
                                                        <label class="radio-inline"><b>4</b><input type="radio" name="ratio" value="4"></label>
                                                        <label class="radio-inline"><b>5</b><input type="radio" name="ratio" value="5"></label>
                                                        <label class="radio-inline"><b>6</b><input type="radio" name="ratio" value="6"></label>
                                                        <label class="radio-inline"><b>7</b><input type="radio" name="ratio" value="7"></label>
                                                        <label class="radio-inline"><b>8</b><input type="radio" name="ratio" value="8"></label>
                                                        <label class="radio-inline"><b>9</b><input type="radio" name="ratio" value="9"></label>
                                                        <label class="radio-inline"><b>10</b><input type="radio" name="ratio" value="10" checked=""></label>
                                                </div>
                                                <div class="max-value">/10</div>
                                            </div>
                                        </div>
                                        <div class="offset-2 col-4">
                                            <label for="type">Typ recenze:</label>
                                            <select id="type" name="type" class="form-control">
                                                <option value="Uživatelská">Uživatelská</option>
                                                <option value="Odborná" selected="">Odborná</option>
                                            </select>
                                        </div>
                                    </div>
                                    <div class="row">
                                        <div class="offset-10 col-2 submit-row">
                                            <input type="submit" class="btn btn-primary">
                                        </div>
                                    </div>

                                    <input type="hidden" name="isUpdate" value="1">
                                    <input type="hidden" name="productId" value="1">
                                    <input type="hidden" name="userId" value="4">
                                        <input type="hidden" name="reviewId" value="3">

                                <input type="hidden" name="_token_" value="dpqw9mk76qPq1AjFUnFgnLFKyw7MtpOUPfdp0="><input type="hidden" name="_do" value="addReview-submit"><!--[if IE]><input type=IEbug disabled style="display:none"><![endif]-->
</form>

Nevím proč se to spouští při renderu… :(

CZechBoY
Člen | 3608
+
0
-

Jeste ukaz tu presenterovou cast.

Johnczek
Člen | 37
+
0
-

Už to funguje, asi cache.

Editoval Johnczek (24. 8. 2017 21:08)