Smazání příspěvku z databáze – Doplnění quickstart – první aplikace – Blog s příspěvky
- martiksnette
- Člen | 2
Doplnění quickstart – mazání příspěvků
Návod z příspěvku na stejné téma hází chybu Tracy „Undefined
variable $id“
PostPresenter:
<?php
declare(strict_types=1);
namespace app\Presenters;
use Nette;
use Nette\Application\UI\Form;
final class PostPresenter extends Nette\Application\UI\Presenter
{
private \Nette\Database\Explorer $database;
public function __construct(\Nette\Database\Explorer $database)
{
$this->database = $database;
}
public function renderShow(int $postId): void
{
$post = $this->database
->table(‚posts‘)
->get($postId);
if (!$post) {
$this->error(‚Stránka nebyla nalezena‘);
}
$this->template->post = $post;
$this->template->comments =
$post->related(‚comments‘)->order(‚created_at‘);
}
protected function createComponentCommentForm(): Form
{
$form = new Form; // means Nette\Application\UI\Form
$form->addText(‚name‘, ‚Jméno:‘)
->setRequired();
$form->addEmail(‚email‘, ‚E-mail:‘);
$form->addTextArea(‚content‘, ‚Komentář:‘)
->setRequired();
$form->addSubmit(‚send‘, ‚Publikovat komentář‘);
$form->onSuccess[] = [$this, ‚commentFormSucceeded‘];
return $form;
}
public function commentFormSucceeded(\stdClass $data): void
{
$postId = $this->getParameter(‚postId‘);
$this->database->table(‚comments‘)->insert([
‚post_id‘ ⇒ $postId,
‚name‘ ⇒ $data->name,
‚email‘ ⇒ $data->email,
‚content‘ ⇒ $data->content,
]);
$this->flashMessage(‚Děkuji za komentář‘, ‚success‘);
$this->redirect(‚this‘);
}
public function handleDelete($id)
{
$this->database->table(‚posts‘)->get($Id)->delete();
//tady to smažeš z DB, případné předtím ověříš, zda má na mazání
uživatel práva
$this->flashMessage(„Smazáno“);
$this->redirect(„this“);
}
}
a šablona default.latte
{block content}
<h1 n:block = „title“> Můj blog </h1>
<div style
=„align:right“>{=„now“|date:‚j.n.Y‘}</div>
<a n:href=„Edit:create“>Napsat nový příspěvek</a>
<p>
<div n:foreach=„$posts as $post“ class=„post“>
<div class=„date“>{$post->created_at|date:‚F j,
Y‘}</div>
<h2><a n:href=„Post:show
$post->id“>{$post->title}</a></h2>
<div class =„flash“>
{$post->content|truncate:256}
<a n:href=„delete!, id ⇒ $id“ onClick=„return
confirm(‚Opravdu smazat?‘);“>Smazat</a>
</div>
<form method=„GET“ id=„my_form“></form>
</div>
{/block}
Jak to upravit nebo doplnit, aby to mazání příspěvku fungovalo?
Děkuji.
- martiksnette
- Člen | 2
Pepino napsal(a):
<a n:href="delete!, id ⇒ $post->id" onClick="return confirm('Opravdu smazat?');">Smazat</a>
Přendal jsem handleDelete z PostPresenteru do HomepagePresenteru a opravil
v šabloně defaultlatte
na <a n:href=„delete!, id ⇒ $post->id“ onClick=„return
confirm(‚Opravdu smazat?‘);“>Smazat</a>
to funguje… ale nesmaže to záznam z databáze MySQL, ale Tracy ukáže
chybu:
Call to a member function delete() on null
co s tím?
Dík předem za vysvětlení postupu.
HomePagePresenter:
<?php
declare(strict_types=1);
namespace app\Presenters;
use Nette;
use Nette\Application\UI\Form;
final class HomepagePresenter extends Nette\Application\UI\Presenter
{
private \Nette\Database\Explorer $database;
public function __construct(\Nette\Database\Explorer $database)
{
$this->database = $database;
}
public function renderDefault(): void
{
$this->template->posts = $this->database
->table(‚posts‘)
->order(‚created_at DESC‘)
->limit(5);
}
public function handleDelete($postId)
{
$this->database->table(‚posts‘)->get($postId)->delete(); //tady
to smažeš z DB, případné předtím ověříš, zda má na mazání
uživatel práva
$this->flashMessage(„Smazáno“);
$this->redirect(„this“);
}
}
- Pepino
- Člen | 257
!!! https://forum.nette.org/…v-tomto-foru#… !!!
public function handleDelete($id)
{
$this->database->table('posts')->where('id', $id)->delete(); //tady to smažeš z DB, případné předtím ověříš, zda má na mazání uživatel práva
$this->flashMessage("Smazáno");
$this->redirect("this");
}