Zmazanie produktu v košíku podľa CD-collection Nette a následná chyba Call to a member function delete()

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

Zdravím ľudia,
Pokúšam sa vytvoriť košík cez DB a použil som renderDelete(), createComponentDeleteForm() a deleteFormSucceeded z CD-collection Nette no pri odoslaní mi vyhodí Call to a member function delete() on a non-object Ukazuje to na

public function deleteFormSucceeded()
	{
		$this->public_cart->findById($this->getParameter('cart_id'))->delete();
		...
		...
	}

Hľadal som aj na fórume ale nič som nenašiel iba staré témy ale na moju chybu bez odpovedi
Všetkým vopred Ďakujem.

Jan Suchánek
Člen | 404
+
0
-

Podívej se co vrací $this->public_cart->findById (public_cart je podle mě nějaký tvůj model), vrací vždy objekt? Já myslím, že ne.

Editoval jenicek (8. 7. 2014 10:30)

SontoEremo
Člen | 341
+
0
-

jenicek napsal(a):

Podívej se co vrací $this->public_cart->findById (public_cart je podle mě nějaký tvůj model), vrací vždy objekt? Já myslím, že ne.

Prepáč ale ako to zistím? ja viem hlúpa otázka

Jan Suchánek
Člen | 404
+
0
-

Podívej se do modelu $this->public_cart co vrací metoda findById.

SontoEremo
Člen | 341
+
0
-

@jenicek

/** @return Nette\Database\Table\ActiveRow */
	public function findById($cart_id)
	{
		return $this->findAll()->get($cart_id);
	}
David Matějka
Moderator | 6445
+
0
-

A co je v tom parametru cart_id? pripadne existuje zaznam s timto id?

Jan Suchánek
Člen | 404
+
0
-

A co takhle?

$cart_id = $this->getParameter('cart_id');

if($row = $this->public_cart->findById($cart_id)) {
	$row->delete();
}

Proč nepoužívas CamelCase ($this->publicCart, $cartId)?

Editoval jenicek (8. 7. 2014 11:39)

SontoEremo
Člen | 341
+
0
-

@jenicek
Síce sa tvári, že maže ale nič viac produkt ostáva v db

public function deleteFormSucceeded()
	{
		$mycart_id = $this->getParameter('cart_id');
		if($row = $this->public_cart->findById($mycart_id)) {
		    $row->delete();
		}
		$this->flashMessage('Produkt bol zmazaný.');
		$this->redirect('this');
	}

Proč nepoužívas CamelCase ($this->publicCart, $cartId)? prepáč ale nerozumiem

Editoval SontoEremo (8. 7. 2014 15:07)

Jan Suchánek
Člen | 404
+
0
-

Zjisti si co předáváš za parametr v $cart_id, podle mě tam předáváš NULL.

Jan Suchánek
Člen | 404
+
0
-

Šlo by to také delegovat celé na repositář:

public function deleteFormSucceeded()
{
	$id = $this->getParameter('cart_id');

	if($this->cartRepostiory->delete($id)){
		$this->flashMessage('Produkt '.$id.' bol zmazaný.');
	}

	$this->redirect('this');
}

Editoval jenicek (8. 7. 2014 17:08)

SontoEremo
Člen | 341
+
0
-

Ahaaaa došiel som na to stačilo do
PublicCart.php

pridať

/** @return Nette\Database\Table\ActiveRow */
	public function delete()
	{
		return $this->findAll()->delete();
	}

a potom do HomepagePresenter.php

public function deleteFormSucceeded()
	{
	    $id = $this->getParameter('vl_cart_id');

	    if($this->vl_public_cart->delete($id)){
	        $this->flashMessage('Produkt '.$id.' bol zmazaný.');
	    }

	    $this->redirect('this');
	}

a všetko funguje :) hádam to mám tak správne

Editoval SontoEremo (8. 7. 2014 21:44)

SontoEremo
Člen | 341
+
0
-

Neviete prečo to vyhodí chybu
Undefined variable: todo
robené podľa Dokončení základní aplikace Signály

BasePresenter.php

/**
	 * @var \App\Model\PublicCart
	 * @inject
	 */
	protected $public_cart;

	public function __construct(\App\Model\PublicCart $public_cart)
	{
		$this->public_cart = $public_cart;
	}

public function handleDelete($cart_id)
	{
	    $todo = $this->public_cart->findById($cart_id);
	    if($todo) {
	        $todo->delete();
	    }
	    $this->redirect('this'); // this vyjadřuje aktuální presenter i view, ale bez signálu
	}

layout.latte

<a href="{plink delete!, $todo->cart_id}" class="product-remove" title="Odstrániť">
					  <i class="fa fa-trash-o"></i>
					</a><!-- .product-remove -->

PublicCart.php

/** @return Nette\Database\Table\ActiveRow */
	public function delete($cart_id)
	{
		return $this->findAll()->select('cart_id')->where('cart_id', $cart_id)->delete();
	}
David Matějka
Moderator | 6445
+
0
-
  1. ten tutorial je pro 0.9, takze ho zavri a koukni do https://doc.nette.org/cs/quickstart
  2. vyhodi ji to asi proto, ze neexistuje. Asi si nepostupoval podle toho (byt stareho) tutorialu, kde je v https://doc.nette.org/cs/quickstart#… radek <tr n:foreach="$todos as $todo" class="todo-row" rel="{$todo->id}">
SontoEremo
Člen | 341
+
0
-

hej ale ono to je riešené cez formulár a ja som myslel, že sa to dá cez handleDelete alebo actionDelete alebo niečo podobné a do inputu sa napr. nedá vložiť

<i class="fa fa-trash-o"></i> aby tam bola iba ikonka

Prosím niekto kto by mi to laicky vysvetlil…

Editoval SontoEremo (10. 7. 2014 19:22)

SontoEremo
Člen | 341
+
0
-

Podľa quickstart-u to neviem spraviť aby to bolo bez formulára a inputov a už ma nič nenapadá.
Na fórumé síce sú handleDelete() a ako a čo ale to je spojované iba s ajaxom a ja neviem či potrebujem aj ajax.