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 :(