Invalidating dynamic snippets with {include template} is broken

4 years ago

Pavel Janda
Backer | 877
+
0
-

Hi,

I will start with an example.

1, Start with nette/web-project
2, Add jquery and nette.ajax.js.
3, Presenter:

class HomepagePresenter extends Nette\Application\UI\Presenter
{

	public function renderDefault()
	{
		if (!isset($this->template->items)) {
			$this->template->items = [['id' => 1, 'name' => 'a'], ['id' => 2, 'name' => 'b']];
		}
	}


	public function handleA()
	{
		$this->template->items = [['id' => 1, 'name' => 'c']];
		$this->redrawControl('data');
	}

}

4, Little template t.latte:

{$param}

5, Homepage template:

{block content}
	<table border="1">
		<thead>
			<!-- never redraw thead! -->
		</thead>
		<tbody n:snippet="tbody">
			{snippetArea data}
				{foreach $items as $item}
					{var $id = $item['id']}
					<tr n:snippet="data-$id">
						<td>
							{* {include 't.latte', param => $item['name']} *}
							{$item['name']}
						</td>
					</tr>
				{/foreach}
			{/snippetArea}
		</tbody>
	</table>

	<a class="ajax" n:href="a!">Do stuff!</a>
{/block}

Now, that works fine, when you click on Do stuff, instead of a the template shows c.
But if i instead of direct output include an template with same value, the invalidation brokes down:

{block content}
	<table border="1">
		<thead>
			<!-- never redraw thead! -->
		</thead>
		<tbody n:snippet="tbody">
			{snippetArea data}
				{foreach $items as $item}
					{var $id = $item['id']}
					<tr n:snippet="data-$id">
						<td>
							{include 't.latte', param => $item['name']}
							{* {$item['name']} *}
						</td>
					</tr>
				{/foreach}
			{/snippetArea}
		</tbody>
	</table>

	<a class="ajax" n:href="a!">Do stuff!</a>
{/block}

Now when you click the link, instead of c there is nothing.

Last edited by Pavel Janda (2016-01-14 17:48)