gofiber / template

🧬 Template engine middleware for Fiber
https://docs.gofiber.io/guide/templates
MIT License
270 stars 52 forks source link

🐛 [Bug]: Mustache template engine; partials don't work #383

Open Durandle46 opened 6 months ago

Durandle46 commented 6 months ago

Bug Description

When using the Mustache template engine, partials don't appear to work and the engine does not produce any errors or output in the logs, even when using deliberately non-existent template names.

How to Reproduce

Using: go version go1.22.2 windows/amd64 Using: latest version of Fiber and related modules (go get -u ./...)

Expected Behavior

Partials rendered into the template.

Template package Version

v2.0.10

Code Snippet (optional)

Checklist:

ReneWerner87 commented 6 months ago

@Durandle46 which fiber version do you exactly use? Latest is v3 and this is not compatible with template at the moment or latest of v2?

ReneWerner87 commented 6 months ago

Pls also share your setup code

Durandle46 commented 6 months ago

@ReneWerner87 Sorry that was not the best written bug report, I was doing it away from home on my mobile.

Fiber version is v2.52.4, I've not looked at v3 since I it's not production ready.

I've worked out what the issue is. The path requires the complete relative path, not the relative path to the base directory given to the template engine.

So for example, setting up the engine with:

Files:

serve>
  views>
    index.mustache
    partials>
      header.mustache
      footer.mustache
    layouts>
      main.mustache
engine := mustache.New("serve/views", ".mustache")
engine .Debug(true)
engine .Verbose = true

and then using a partial with:

{{> views/partials/header}}

Doesn't work. No error in the logs about not finding the partial either, it silently fails.

However doing:

{{> serve/views/partials/header}}

Does work.

It's not at all obvious this is required, and the docs don't mention this. Since the engine has already been handed the base directory to operate from, one might assume the name/path given is relative to that. To make it even less obvious, the debug output when parsing all the templates at start-up chops the path off entirely, making it seem like you can reference them using those names/paths:

2024/05/06 14:39:01 views: parsed template: index
2024/05/06 14:39:01 views: parsed template: layouts/main
2024/05/06 14:39:01 views: parsed template: partials/footer
2024/05/06 14:39:01 views: parsed template: partials/header

And lastly, since the engine does render the layouts and views using the short name/path, it makes no sense to expect the partials to require the complete relative path:

return c.Render(
    "index",
    fiber.Map{},
    "layouts/main",
)
Durandle46 commented 6 months ago

Also it's not lost on me that when I wrote Created a project that mirrors the example in the Fiber Mustache docs. its not accurate because I used additional path elements.

ReneWerner87 commented 6 months ago

thanks we will test it with your code

ReneWerner87 commented 6 months ago

image image

ReneWerner87 commented 6 months ago

Doesn't work. No error in the logs about not finding the partial either, it silently fails.

However doing:

{{> serve/views/partials/header}}> Does work.

It's not at all obvious this is required, and the docs don't mention this. Since the engine has already been handed the base directory to operate from, one might assume the name/path given is relative to that. To make it even less obvious, the debug output when parsing all the templates at start-up chops the path off entirely, making it seem like you can reference them using those names/paths:

we will add some docus and try to improve our rendering info

ReneWerner87 commented 6 months ago

thx for the report