Smazání příspěvku z databáze – Doplnění quickstart – první aplikace – Blog s příspěvky

martiksnette
Člen | 2
+
0
-

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.

Pepino
Člen | 249
+
+1
-
<a n:href="delete!, id ⇒ $post->id" onClick="return confirm('Opravdu smazat?');">Smazat</a>
martiksnette
Člen | 2
+
0
-

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 | 249
+
0
-

!!! 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");
 }