Zmazanie produktu v košíku podľa CD-collection Nette a následná chyba Call to a member function delete()
- SontoEremo
- Člen | 341
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
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
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
- SontoEremo
- Člen | 341
@jenicek
/** @return Nette\Database\Table\ActiveRow */
public function findById($cart_id)
{
return $this->findAll()->get($cart_id);
}
- David Matějka
- Moderator | 6445
A co je v tom parametru cart_id? pripadne existuje zaznam s timto id?
- Jan Suchánek
- Člen | 404
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
@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
Š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
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
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
- ten tutorial je pro 0.9, takze ho zavri a koukni do https://doc.nette.org/cs/quickstart
- 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
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
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.