pebble icon indicating copy to clipboard operation
pebble copied to clipboard

Including two templates that import the same macros under the same name causes an exception

Open grishka opened this issue 5 years ago • 2 comments

Rendering this template:

{% extends "page" %}
{% block content %}
<div class="singleColumn">
	{% include 'login_form' %}
	<h2>{{ serverDisplayName }}</h2>
	<p>{{ serverDescription | raw }}</p>
	{% if signupMode=='OPEN' or signupMode=='INVITE_ONLY' %}
	{% include 'register_form' %}
	{% elseif signupMode=='CLOSED' %}
	<div class="notMuchContent" align="center">{{ L('signups_closed') }}</div>
	{% endif %}
</div>
{% endblock %}

login_form.twig:

{% import "forms" as form %}
<h2>{{ L('login_title') }}</h2>
<form action="/account/login{{ additionalParams }}" method="post">
	{{ form.start('login', message) }}
		{{ form.textInput('username', L('email_or_username')) }}
...

register_form.twig:

{% import "forms" as form %}
<form action="/account/register" method="post">
	{% if preFilledInvite is not null %}
...

Causes this exception:

com.mitchellbosecke.pebble.error.PebbleException: More than one named template can not share the same name: form (?:?)
	at com.mitchellbosecke.pebble.template.EvaluationContextImpl.addNamedImportedTemplates(EvaluationContextImpl.java:163)
	at com.mitchellbosecke.pebble.template.PebbleTemplateImpl.importNamedTemplate(PebbleTemplateImpl.java:230)
	at com.mitchellbosecke.pebble.node.ImportNode.render(ImportNode.java:33)
	at com.mitchellbosecke.pebble.node.BodyNode.render(BodyNode.java:43)
	at com.mitchellbosecke.pebble.node.RootNode.render(RootNode.java:30)
	at com.mitchellbosecke.pebble.template.PebbleTemplateImpl.evaluate(PebbleTemplateImpl.java:155)
	at com.mitchellbosecke.pebble.template.PebbleTemplateImpl.includeTemplate(PebbleTemplateImpl.java:279)
	at com.mitchellbosecke.pebble.node.IncludeNode.render(IncludeNode.java:50)
	at com.mitchellbosecke.pebble.node.BodyNode.render(BodyNode.java:43)
	at com.mitchellbosecke.pebble.node.IfNode.render(IfNode.java:81)
	at com.mitchellbosecke.pebble.node.BodyNode.render(BodyNode.java:43)
	at com.mitchellbosecke.pebble.node.BlockNode$1.evaluate(BlockNode.java:56)
	at com.mitchellbosecke.pebble.template.PebbleTemplateImpl.block(PebbleTemplateImpl.java:440)
	at com.mitchellbosecke.pebble.template.PebbleTemplateImpl.block(PebbleTemplateImpl.java:434)
	at com.mitchellbosecke.pebble.node.BlockNode.render(BlockNode.java:37)
	at com.mitchellbosecke.pebble.node.BodyNode.render(BodyNode.java:43)
	at com.mitchellbosecke.pebble.node.RootNode.render(RootNode.java:30)
	at com.mitchellbosecke.pebble.template.PebbleTemplateImpl.evaluate(PebbleTemplateImpl.java:155)
	at com.mitchellbosecke.pebble.template.PebbleTemplateImpl.evaluate(PebbleTemplateImpl.java:166)
	at com.mitchellbosecke.pebble.template.PebbleTemplateImpl.evaluate(PebbleTemplateImpl.java:104)
	at smithereen.templates.RenderedTemplateResponse.renderToWriter(RenderedTemplateResponse.java:39)
	at smithereen.templates.RenderedTemplateResponse.renderToString(RenderedTemplateResponse.java:46)
	at smithereen.Main.indexPage(Main.java:289)
	at spark.RouteImpl$1.handle(RouteImpl.java:72)
	at spark.http.matching.Routes.execute(Routes.java:61)
	at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:134)
	at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1671)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
	at org.eclipse.jetty.server.Server.handle(Server.java:505)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
	at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:698)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:804)
	at java.base/java.lang.Thread.run(Thread.java:830)

Isn't {% import %} only supposed to import within the template where it is written? It feels illogical that these imports propagate upwards from the included template into the root one, and then back into another include where they then have the potential to cause a name conflict.

grishka avatar Oct 29 '20 04:10 grishka

Can confirm, two completely different contexts that used the same import name caused this error. Only solution I know of is to use a different name or no name...

ogrammer avatar Oct 29 '20 12:10 ogrammer

Only solution I know of is to use a different name or no name...

Yes, I ended up renaming it to _form in the login template and of course it worked.

grishka avatar Oct 29 '20 12:10 grishka