IVR

IVR

Hi all,

I’m quite new to web development and recently I’ve started working on a website using Phoenix. I realized pretty quickly that I need to find a way to reuse as much of my HTML as possible, otherwise I’d end up duplicating a lot of code. Refactoring it later would be even more of a nightmare. I haven’t found an effective way of doing it though, so I was wondering if anyone here has any suggestions.

I’ve tried 2 approaches:

  1. Create a directory “components” inside your template (you can get creative here) and put a partial html.eex file there with parameters like <%= @arg %> and if needed <%= @content %> block as well. then inside your views create components_view.ex which might contain methods like render_modal(arg do: block), do: render_modal("_modal.html", content: block, arg: arg). It can then be used inside your other html.eex files as <%= MyAppWeb.ComponentsView.render_modal "arg1" do %> ... <%end%>.

  2. Surface UI: A React/Vue inspired library for LiveView. This is a very elegant solution and I really hope this project grows in popularity, however, I’ve struggled with it. First, I got the impression that its components only work with live page, not html.eex (I could we be wrong though) – this became a problem when I was dealing with authentication (phx.gen.auth) which I believe requires controllers. Second, it really concerned me that when I ran into problems, there was virtually no information online about the problems I was facing because this library is so new. Additionally, if you go with Surface, then I don’t think that you can use embedded Elixir anymore, you are forced to use the Surface directives, which I think is fair enough.

Of these two approaches, I’m choosing to go with (1) because it feels safer, but I still feel that this approach isn’t exactly smooth. I think Surface is what I’m really looking for, but it isn’t quite mature enough for someone inexperienced like myself to invest in. As for the full-blown frontend frameworks, I’d really prefer to avoid them if possible. They might help me organise my code, but they would introduce another layer of complexity.

I’d love to hear about your experience with this. Have you found an approach to organise your frontend in a way that works well? Do you have any recommendations? Surely it’s possible to create production-grade websites with Phoenix while keeping your codebase clean.

Many thanks!

Showing Posts 1 to 1

l00ker

l00ker

This is briefly covered in the Phoenix Guides.

What I do is similar to your (1) but I don’t add render functions in a view and call them directly.

I create a directory inside lib/my_app_web/templates which is usually named shared or partial and place the “shared” templates there. For this conversation I’ll just call it shared.

Create a template:

<%# lib/my_app_web/templates/shared/hello.html.eex %>

<strong>Hello <%= @name %>!</strong>

Then create the view:

# lib/my_app_web/views/shared_view.ex

defmodule MyAppWeb.SharedView do
  use MyAppWeb, :view

  # add any supporting functions for the shared templates
end

Then in any other template:

<%# lib/my_app_web/templates/page/index.html.eex %>

...
<%= render MyAppWeb.SharedView, "hello.html", name: "world" %>
...

Hello world!

If you want to nest directories under lib/my_app_web/templates/shared like lib/my_app_web/templates/shared/components for organization you’ll need to add pattern: "**/*", to the view function in lib/my_app_web.ex like so:

...
def view do
  quote do
    use Phoenix.View,
      root: "lib/my_app_web/templates",
+     pattern: "**/*",
      namespace: MyAppWeb
     ...
  end
end
...

Then when you use a template that is nested just provide the relative path to the template in the render function like so:

<%# lib/my_app_web/templates/page/index.html.eex %>

...
<%= render MyAppWeb.SharedView, "components/modal.html", conn: @conn, arg1: @arg1 %>

<%# If you're needing to pass many params (args) to the shared templates like arg1: @arg1, arg2: @arg2 etc., you can use `assigns` instead %>
<%= render MyAppWeb.SharedView, "components/modal.html", assigns %>
...

Hope that helps.

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
FlyingNoodle
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews