Strankovanie za pomoci visualpaginator

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

Ahojte, skúšal som využiť Visualpaginator (https://componette.org/search/?…) aby so pridal stránkovanie pre môj výpis z DB.

Môj prezenter vyzerá asi takto:

<?php

use Nette\Application\UI\Form;


class BannedPresenter extends BasePresenter
{
	/** @var AlbumRepository */
	private $banned;


	public function inject(Banned $banned)
	{
		$this->banned = $banned;
	}


	protected function startup()
	{
		parent::startup();
		echo "Neco urob...";
	}

	public function LoggedUser()
	{
		if (!$this->user->isLoggedIn()) {
			if ($this->user->logoutReason === Nette\Http\UserStorage::INACTIVITY) {
				$this->flashMessage('Bol si odhlasený.');
			}
			$this->redirect('banned', array('backlink' => $this->storeRequest()));
		}
	}


	/********************* view default *********************/


	public function renderDefault()
	{
		$this->template->banned = $this->banned->findAll()->order('id')->order('admin');
		$vp = new VisualPaginator($this, 'vp');
		$paginator = $vp->getPaginator();
		$paginator->itemsPerPage = 15;
		$paginator->itemCount = count($this->template->banned);

	}


	/********************* views add & edit *********************/


	public function renderAdd()
	{
		$this['albumForm']['save']->caption = 'Add';
	}

	public function renderEdit($id = 0)
	{
		$form = $this['albumForm'];
		if (!$form->isSubmitted()) {
			$banned = $this->banned->findById($id);
			if (!$banned) {
				$this->error('Record not found');
			}
			$form->setDefaults($banned);
		}
	}


	/********************* view delete *********************/


	public function renderDelete($id = 0)
	{
		$this->template->banned = $this->banned->findById($id);
		if (!$this->template->banned) {
			$this->error('Record not found');
		}
	}


	/********************* component factories *********************/


	/**
	 * Edit form factory.
	 * @return Form
	 */
	protected function createComponentAlbumForm()
	{
		$this->LoggedUser();
		$form = new Form;
		$form->addText('name', 'Zabanovany:')
			->setRequired('Vlozte nick zabanovaneho hraca.');

		$form->addText('reason', 'Dovod:')
			->setRequired('Prosim vlozte dovod banu.');

		$form->addSubmit('save', 'Save')
			->setAttribute('class', 'default')
			->onClick[] = $this->albumFormSucceeded;

		$form->addSubmit('cancel', 'Cancel')
			->setValidationScope(NULL)
			->onClick[] = $this->formCancelled;

		$form->addProtection();
		return $form;
	}


	public function albumFormSucceeded($button)
	{
		$values = $button->getForm()->getValues();
		$id = (int) $this->getParameter('id');
		if ($id) {
			$this->banned->findById($id)->update($values);
			$this->flashMessage('Ban bol upravený.');
		} else {
			$this->banned->insert($values);
			$this->flashMessage('Ban bol pridany.');
		}
		$this->redirect('default');
	}


	protected function createComponentDeleteForm()
	{
		$form = new Form;
		$form->addSubmit('cancel', 'Cancel')
			->onClick[] = $this->formCancelled;

		$form->addSubmit('delete', 'Delete')
			->setAttribute('class', 'default')
			->onClick[] = $this->deleteFormSucceeded;

		$form->addProtection();
		return $form;
	}


	public function deleteFormSucceeded()
	{
		$this->banned->findById($this->getParameter('id'))->delete();
		$this->flashMessage('Ban bol zmazany!');
		$this->redirect('default');
	}


	public function formCancelled()
	{
		$this->redirect('default');
	}

}
?>

Následne som dal len na konci templatu toto:
{control vp}

Bohužial sice sa stale urobi výpis ale hlasi to
Nette\FileNotFoundException

Missing template file ‚app\presenters/template.phtml‘.

Ako sa poznám robím nieco uplne zle.
Moja otáka teda je, našiel by sa tu niekto kto by mi vedel poradit, idealne presne povedat co mam spatne?

p.s. Ten template tam celkom urcite nakopirovany je: )

Editoval Andurit (14. 11. 2013 18:12)

romiix.org
Člen | 343
+
0
-

Kde máš nakopírované súbory so samotnou komponentou VisualPaginatora? Vyzerá to tak, že máš súbor VisualPaginator.php priamo v priečinku app/presenters.

Celú zložku paginátora nakopíruj do zložky libs.

Inak, nejak som si nevšimol, kde sa snažíš získané hodnoty ($paginator->offset, $paginator->itemsPerPage) z paginátora použiť.

David Matějka
Moderator | 6445
+
0
-

jo bude to tim, jak pise romiix

pokud ale pouzivas novy sandbox, kde je slozka /vendor, tak to nakopiruj do /vendor/others
(ja osobne preferuji pro tyhle veci slozku /app/libs, ale je to na tobe).. ale samotna slozka /libs, kterou radi romiix, nemusi byt vzdy viditelna pro robot loader (jeho nastaveni je v bootstrapu). takze jednoduse: dej to proste tam, kam robot loader vidi :)

a nepouzivej count($this->template->banned);
to udela nasledujici: vybere vsechny zaznamy z tabulky a spocita pocet polozek v poli.
pouzij radeji:

$count = $this->template->banned->count('*');

Editoval matej21 (14. 11. 2013 18:42)

Andurit
Člen | 131
+
0
-

Obom vám ďakujem, vaše rady dosť pomohli. Po prepisani par ciest a drobnosti mi stránkovanie normalne nabehlo. Naneštastie stále ukazuje kompletný výpis namiesto jeho časti. Samozrejme je chyba niekde v modely a mojom predavani offsetu a limitu

Hadzem vam tu funkcny model bez tychto veci, kam by ste to zapisali?

<?php


class Banned extends Nette\Object
{
	private $database;


	public function __construct(Nette\Database\Connection $database)
	{
		$this->database = $database;
	}

	public function findAll()
	{
		return $this->database->table('banlist');
	}


	public function findById($id)
	{
		return $this->findAll()->get($id);
	}


	public function insert($values)
	{
		return $this->findAll()->insert($values);
	}

}
?>
romiix.org
Člen | 343
+
0
-

Metóda findAll() je dosť nešťastne nazvaná. Kričí najmä jej zavolanie v metóde insert(). Nazval by som ju getTable().

Následne by mohla vyzerať metóda renderDefault() takto:

public function renderDefault()
{
	$vp = new VisualPaginator($this, 'vp');
	$paginator = $vp->getPaginator();
	$paginator->itemsPerPage = 15;
	$paginator->itemCount = $this->banned->getTable()->count("*");
	$this->template->banned = $this->banned->getTable()->order('id, admin')->limit($paginator->itemsPerPage,$paginator->offset);
}
Andurit
Člen | 131
+
0
-

Je to plne funkčné, znova ďakujem.

Editoval Andurit (15. 11. 2013 0:40)

NiNu
Člen | 31
+
0
-

Ľudia diky moc, aj mne sa to podarilo úspešne rozbehať dokonca s Bootstrap 3 formátovaním.
Môj postup:

  1. Do app/components som uložil stiahnuté súbory VisualPaginator.php a visualPaginator.latte (originál sa latte volalo template.pthml, ale radšej som to premenoval a vo VisualPaginator.php som potom upravil cestu v metóde render na → $this->template->setFile(dirname(__FILE__) . ‚/visualPaginator.latte‘); )
  2. Do VisualPaginator.php som doplnil:
use Nette\Application\UI\Control,
	Nette\Utils\Paginator;
  1. Do presenteru do funkcie render som vložil:
$vp = new \VisualPaginator($this, 'vp');
$paginator = $vp->getPaginator();
$paginator->itemsPerPage = 3;
$paginator->itemCount = $this->newsRepository->countAll();
$this->template->news = $this->newsRepository->getAllNews()->limit($paginator->itemsPerPage, $paginator->offset);
  1. A nakoniec do template-u stačilo vložiť {control vp} a trocha to naformátovať