2× VisualPaginator s AJAX
- basovnik
- Člen | 23
Ahoj, předem se omlouvám, že zakládám nové téma, ale
k následujícímu tématu mi nešlo už nic dopsat…
4×
visualPaginator vedle sebe a ajax
Základní VisualPaginator s AJAXem mi dle tutorialu funguje.
ALE:
Mám v bočním panelu aplikace dvě komponenty: Nejbližší akce, Nejnovější zprávy. Nejde mi plně rozchodit AJAX u VisualPaginatoru. První komponenta vypadá následovně a druhá je úplně analogicky napsaná.
ActionViewComponent.php
<?php
namespace Components;
final class ActionsViewComponent extends BaseComponent
{
protected function createComponentPaginator()
{
$visualPaginator = new \VisualPaginator();
return $visualPaginator;
}
public function render()
{
$template = $this->template;
$count = $this->presenter->getModel('action')->findAll()->count();
if ($count > 0)
{
// Set edited template for paginato with only two buttons: next, previous
$this['paginator']->template->setFile(dirname(__FILE__) . '/../../paginator.latte');
$paginator = $this['paginator']->getPaginator();
$paginator->itemsPerPage = 5;
$paginator->itemCount = $count;
$this->template->actions = $this->presenter->getModel('action')->findAll()->limit($paginator->itemsPerPage, $paginator->offset);
}
$template->setFile(dirname(__FILE__) .'/ActionsViewComponent.latte');
$template->render();
}
}
?>
Šablona vypadá následovně
{snippet ActionsView}
{if isset($actions) && count($actions) > 0}
<div class="box">
<h3>Nejbližší akce</h3>
{foreach $actions as $action}
<h4>{$action['title']}</h4>
<time n:if="!is_null($action['from_datetime'])">kdy: {$action['from_datetime']|curlyDatetime}</time><br>
<address n:if="!is_null($action['locality'])">kde: {$action['locality']}</address>
{/foreach}
<br>
<center>{control paginator}</center>
</div>
{/if}
{/snippet}
Využívám upravený template pro paginator pouze s tlačítky:
Předchozí, Další.
paginator.latte
{if $paginator->pageCount > 1}
<div class="paginator">
{if $paginator->isFirst()}
<span class="button">« Předchozí</span>
{else}
<a href="{link this, 'page' => $paginator->page - 1}" class="ajax">« Předchozí</a>
{/if}
|
{if $paginator->isLast()}
<span class="button">Další »</span>
{else}
<a href="{link this, 'page' => $paginator->page + 1}" class="ajax">Další »</a>
{/if}
</div>
{/if}
Komponentu vytvářím takhle:
<?php
...
$component = new FlashesViewComponent($this, $name);
$component->invalidateControl('FlashesView');
return $component;
...
?>
AJAX mi funguje jen u 1. komponenty a u druhé ne! I u první ale nefunguje úplně košér. Po prvním kliknutí na další se už nedostanu nikdy úplně na začátek a už jen překlepávám mezi ostatními stránkami výpisu.
Myslím si, že invalidaci komponenty nedělám asi dobře a
možná i nějak špatně pojmenovávám proměnné. Nevím, zda se nebije
proměnná $paginator
v paginator.latte mezi
těmi komponentami. Snad jste pochopili, o co mi jde :)
Děkuji za jakoukoliv radu.
PS: Javascripty mám includované dobře, to by mi nešel AJAX vůbec. Mně jde, ale blbě.
Editoval basovnik (6. 9. 2011 23:28)
- basovnik
- Člen | 23
Já perzistetní komponentu nepotřebuji, aspoň doufám. V tuto chvíli mi bude stačit, když bude AJAX s paginatorem fungovat. Už na to koukám několik hodin a nemohu s tím hnout.
AJAX mi jinak funguje i pro více stejných komponent na stránce. Zkoušel jsem si vytvořit třeba 2 ajaxové komponenty Counter a funguje to správně. Viz níže:
CounterComponent.php
<?php
namespace Components;
final class CounterComponent extends Nette\Application\UI\Control
{
/** @persistent */
public $value = 0;
public function handleClick()
{
$this->invalidateControl("counter");
$this->value++;
}
public function getValue()
{
return $this->value;
}
public function render()
{
$template = $this->template;
$template->setFile(dirname(__FILE__) .'/CounterComponent.latte');
$template->render();
}
}
?>
CounterComponent.latte
{snippet counter}
<a n:href="Click" class="ajax">
<strong>{$control->getValue()}</strong>
</a>
{/snippet}
Píšu to principielně správně? Na tomto principu dělám i komponentu, která má vnořený paginator a prostě to nemůžu rozjet! Jak jsem ale zmínil, klasický ajaxový výpis s paginatorem mi funguje, když není výpis v komponentě. Možná bude zádrhel v tom, že nevím, jak se odkazovat linkem v šabloně paginatoru na handler v nadřazené komponentě výpisu. Na presenter přes {plink ..} se mi z té šablony taky nejde dostat. Píše to chybu:
Call to a member function link() on a non-object
Poraďte někdo prosím. Musí to být nějaká blbost, ale jsem ve slepé uličce :(