Administrace komentářů

Rudolf Svátek 2016-07-27 10:47

Stáhnout aplikaci k dnešnímu dni si můžeš: kapitola16.zip

Poslední věc, kterou v administraci vyrobíme, jsou komentáře. Uživatelům chceme dovolit, aby k článkům dali komentář. V administraci takový komentář vytvořit nepůjde. Sice bychom to mohli dovolit, ale nepovažuji to za poctivé, abych si vkládal komentáře k článkům v administraci. Budeme moci jen komentář schválit, nebo smazat.

Proto u komentářů nebudeme potřebovat žádné formuláře. Pouze modul, presenter a šablony.

Modul

V případě komentářů budeme pracovat s několika tabulkami. Když budeme komentáře vypisovat v gridu, chci vypsat název stránky, ke které komentář patří. Proto musíme do základního Mapperu a Repository doplnit funkce, které mi název stránky najdou.

Entitu a její interface už vypisovat nebudu. Normálně ji vytvoř z tabulky databáze.

Mapper

K základnímu konstruktoru tedy přidáme metodu pro výběr stránky, ke které komentář patří:

<?php

namespace App\Model;

use Dibi\Connection;

/**
 * Class CommentsMapper
 * @package App\Model
 */
class CommentsMapper extends BaseMapper
{

	/**
	 * CommentsMapper constructor.
	 * @param Connection $db
	 */
	public function __construct(Connection $db) {
		parent::__construct($db);
	}

	/**
	 * @param integer $articleId
	 * @return Dibi\Row | false
	 */
	public function getPage($articleId) {
		return $this->db->select('name')->from('pages')->where(['id' => $articleId])->fetch();
	}

}

Stějně upravíme základ v repositáři:

<?php

namespace App\Model;

/**
 * Class CommentsRepository
 * @package App\Model
 */
class CommentsRepository extends BaseRepository 
{

	/** @var CommentsMapper */
	private $mapper;

	/**
	 * CommentsRepository constructor.
	 * @param CommentsMapper $mapper
	 */
	public function __construct(CommentsMapper $mapper) {
		parent::__construct($mapper);
		$this->mapper = $mapper;
	}

	/**
	 * @return array
	 */
	public function getAllComments() {
		$allComments = $this->mapper->getAll();
		$comments = [];
		foreach($allComments as $comment) {
			$page = $this->mapper->getPage($comment->articleId);
			$comments[] = [
				'id' => $comment->id,
				'articleId' => $comment->articleId,
				'date' => $comment->date,
				'author' => $comment->author,
				'text' => $comment->text,
				'allowed' => $comment->allowed,
				'page' => $page->name
			];
		}
		return $comments;
	}
}

A to je k modulu vše, co potřebujeme.

Presenter

Jelikož nepotřebujeme žádné formuláře, tak v presenteru jen připravíme komponentu gridu a doplníme obslužné metody událostí pro schvalování a mazání komentářů:

<?php

namespace App\AdminModule\Presenters;

use App\Model\CommentsRepository;
use Grido\Grid;
use Nette\Utils\Html;
use Nette\Utils\Strings;

/**
 * Class CommentsPresenter
 * @package App\AdminModule\Presenters
 */
class CommentsPresenter extends BasePresenter
{

	/** @var CommentsRepository @inject */
	public $commentsRepository;

	/**
	 * Inicializace třídních proměnných
	 */
	public function startup() {
		parent::startup();
	}

	/**
	 * @param $id
	 */
	public function handleDelete($id) {
		$this->commentsRepository->delete($id);
		$this->flashMessage('Komentář byl smazán.', 'success');
		if (!$this->isAjax())
			$this->redirect('default');
		$this->redrawControl();
	}

	/**
	 * @param $id
	 */
	public function handleAllowed($id) {
		$comment = $this->commentsRepository->get($id);
		$comment->allowed(!$comment->allowed());
		$this->commentsRepository->save($comment);
		if (!$this->isAjax())
			$this->redirect('default');
		$this->redrawControl();
	}

	/**
	 * @param $name
	 * @return Grid
	 * @throws \Grido\Exception
	 */
	protected function createComponentGrid($name) {
		$grid = new Grid($this, $name);
		$grid->translator->lang = 'cs';

		$fluent = $this->commentsRepository->getAllComments();
		$grid->model = $fluent;

		$grid->addColumnText('author', 'Autor')
				->setSortable()
				->setFilterText();

		$grid->addColumnDate('date', 'Datum')
				->setSortable()
				->setFilterText();

		$grid->addColumnText('allowed', 'Schváleno')
						->setCustomRender(function ($item) {
							if ($item['allowed'] === 0) {
								$i = Html::el('i', ['class' => 'glyphicon glyphicon-thumbs-down']);
								$el = Html::el('a', ['class' => 'btn btn-danger btn-xs btn-mini ajax'])
										->href($this->presenter->link("allowed!", $item['id']))
										->setHtml($i);
							} else {
								$i = Html::el('i', ['class' => 'glyphicon glyphicon-thumbs-up']);
								$el = Html::el('a', ['class' => 'btn btn-success btn-xs btn-mini ajax'])
										->href($this->presenter->link("allowed!", $item['id']))
										->setHtml($i);
							}
							return $el;
						})
				->cellPrototype->class[] = 'center';

		$grid->addColumnText('text', 'Text')
				->setCustomRender(function ($item) {
					$el = Html::el('span')->setText(Strings::substring($item['text'], 0, 80));
					return $el;
				});
		$grid->getColumn('text')->headerPrototype->style['width'] = '45%';

		$grid->addColumnText('page', 'Ke stránce')
				->setSortable()
				->setFilterText();

		$grid->addActionEvent('delete', '')
				->setCustomRender(function ($item) {
					$i = Html::el('i', ['class' => 'fa fa-trash']);
					$el = Html::el('a', ['class' => 'btn btn-default btn-xs btn-mini ajax'])
							->href($this->presenter->link("delete!", $item['id']))
							->setHtml($i);
					return $el;
				});

		$grid->setDefaultSort(['date' => 'DESC']);
		$grid->setDefaultPerPage(50);
		$grid->filterRenderType = $this->filterRenderType;
		$grid->setExport();

		return $grid;
	}

}

Šablona

Tak tady je to vyslovene jednoduché. Jen zobrazíme komponentu gridu a kvůli ajaxu to obalíme do snippetu:

{block content}
	{snippet grid}
		{control grid}
	{/snippet}
{/block}

{block title}{_'Administrace komentářů'} |&nbsp;{/block}

No a to je vážně všechno. Uprav si třeba šablonu @layout.latte a doplň odkazy do menu. Tím končíme s administrací a v další kapitolce se začneme věnovat frontendu, čili tomu, co uvidí návštěvníci stránek.

Stáhnout aplikaci k dnešnímu dni si můžeš: kapitola16.zip

Redakční systém RS::RS Předchozí kapitola

Zapomenutá hesla

Redakční systém RS::RS Celý seriál

Vývoj redakčního systému v PHP

Redakční systém RS::RS Následující kapitola

Úvodní stránka

Komentáře (0)

Přidej svůj komentář

O mně

Jmenuji se Rudolf Svátek. Jsem lektor výpočetní techniky a PHP programátor. Stavím firemní stránky a eshopy. Aby se mi to dělalo pohodlně, vytvořil jsem redakční systém RS::RS, který ti tu nabízím k použití.

Rychlý kontakt na mně

  • Rudolf Svátek
  • Telefon:
    +420 777 828 353
  • Email:
  • Adresa:
    Josefa Hory 1097/5
    736 01 Havířov
    ČR



Tyto stránky používají Cookies. Používáním stránek s tím souhlasíte Další informace