Strankovanie za pomoci visualpaginator
- Andurit
- Člen | 131
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
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
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
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
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);
}
- NiNu
- Člen | 31
Ľudia diky moc, aj mne sa to podarilo úspešne rozbehať dokonca
s Bootstrap 3 formátovaním.
Môj postup:
- 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‘); )
- Do VisualPaginator.php som doplnil:
use Nette\Application\UI\Control,
Nette\Utils\Paginator;
- 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);
- A nakoniec do template-u stačilo vložiť {control vp} a trocha to naformátovať