2× VisualPaginator s AJAX

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

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á $paginatorpaginator.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)

Filip Procházka
Moderator | 4668
+
0
-

Střelím od boku… máš nastaveny obě komponenty jako persistentní?

basovnik
Člen | 23
+
0
-

Myslíš, že to musím nastavit jako perzistentní? Kvůli čemu? Perzistenci komponenty udělám tak, že před ni dám kód uvedený níže?

<?php
/**
 * @persistent
 */
final class MyComponent extends Control {
...
?>
basovnik
Člen | 23
+
0
-

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