Form při odeslání vyhodí error a neodešle se

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

Ahoj, pomocí ajaxu si vykreslím Nette form, ale při odeslání tohoto formu se mi do souboru vypíše error

Nette\UnexpectedValueException: Method AdminPresenter::createComponentEditCouponForm() did not return or create the desired component. in C:\xampp\htdocs\market\libs\Nette\ComponentModel\Container.php:177 @ http://localhost/…dmin/coupons?… @@ exception-2014–01–14–22–39–24–227d25ef9a42ce506a79ff9958024439.html

a nic se nestane.

Přikládám části ze šablony, kde je na začátku ten snippet s tabulkou a o kus níže ajaxový odkaz který volá funkci na vykreslení toho snippetu.

{snippet editCouponForm}
{if $couponToEdit !== null}
<h3>Editovat slevový kupón</h3>
{form editCouponForm class => ajax}
    <span class="jstooltip" data-original-title="Token zadává uživatel při uplatnení slevy">Token:</span> {input token class => randomString} <a class="jstooltip" data-original-title="Vygeneruje náhodný text o délce 15 znaků<br>a dá ho do políčka vlevo." href="#" onclick="randomString();">Vygenerovat náhodný token</a><br>
    <span class="jstooltip" data-original-title="Do kdy bude kupón platný">Expirace:</span> {input expiration} (Neměňte, pokud chcete, aby kupón neměl expiraci)<br>
    <span class="jstooltip" data-original-title="Sleva (v procentech)">Sleva (%):</span> {input discount} <br>
    {input submit}
{/form}
{/if}
{/snippet}

<a class="ajax" n:href="editCoupon! $coupon->id">Upravit</a>

A zde jsou funkce z presenteru obsluhující ten form, snippet a ajaxový odkaz.

public function handleEditCoupon($couponId){
	$this->couponToEdit = $couponId;
	if(!$this->isAjax()){
	    $this->redirect("this");
	}
	$this->redrawControl("editCouponForm");
}

protected function createComponentEditCouponForm(){
	$info = $this->cr->getCoupon($this->couponToEdit)->fetch();

	if(!$info){
	    $this->flashMessage("Tento kupón neexistuje.", "danger");
	    return null;
	}

	$exp;
	if($info->expiration_time !== 0){
	    $exp = date('Y-m-d', $info->expiration_time);
	}else {
	    $exp = null;
	}

	$form = new UI\Form;

	$form->addText("token")->setRequired("Musíte uvést token (nebo ho vygenerovat).")->setValue($info->token);
	$form->addText("expiration")->setType("date")->setValue($exp);
	$form->addText("discount")->setType("number")->setValue($info->discount);
	$form->addSubmit("submit", "Editovat");

	$form->onSuccess[] = $this->editCouponFormSubmitted;
	return $form;
}

public function editCouponFormSubmitted(UI\Form $form){
	$values = $form->getValues();

	if(empty($values->token)){
	    $this->flashMessage("Token nesmí být prázdný.", "danger");
	    return;
	}

	$this->cr->editCoupon($this->couponToEdit, $values->token, $values->discount, null, $values->expiration);

	$this->flashMessage("Kupón byl upraven.", "success");
	$this->couponToEdit = null;
	if(!$this->isAjax()){
	    $this->redirect("this");
	}
	$this->redrawControl("editCouponForm");
	$this->redrawControl("couponsTable");
}

Editoval zdenda204 (15. 1. 2014 0:01)

David Matějka
Moderator | 6445
+
0
-

jelikoz vracis null

$info = $this->cr->getCoupon($this->couponToEdit)->fetch();

if(!$info){
    $this->flashMessage("Tento kupón neexistuje.", "danger");
    return null;
}
  1. tohle overuj v action nebo handle, ne v createComponent
  2. handle* metoda se pri zpracovavani formulare nezavola, tudiz je couponToEdit prazdny…

Editoval matej21 (15. 1. 2014 0:13)

zdenda204
Člen | 21
+
0
-

Díky, určitě si budu pamatovat.
Zkoušel jsem pár úprav, ale vždy skončím na zpracování toho formuláře.
Nejspíše to přepíšu do trochu jiné podoby, takto mi to s tím formulářem nevyhovuje.