مشکل در منطق ساخت breadcrumb و منو


#1

با درود خدمت شما . من در یک مشکل کوچیک دچار انسداد مغزی شدم :smiley: من در حال ساخت مسیر من در سایت کجاست یا breadcrumb هستم. یک مشکلی در کد هام دارم که اصل کد به شرح زیر می باشد

<nav aria-label="breadcrumb" class="breadcrumb">
  <div class="container">
    <ol class="breadcrumb">
      <li class="breadcrumb-item"><a href="<%= page_path(@conn, :index) %>" class="a-home"><i class="fa fa-home" aria-hidden="true"></i>  ترانگل</a></li>
      <%= for %{title: title, link: link} <- @breadcrumb do %>
      <%= if @conn.request_path == link && length(@breadcrumb) > 1 do %>
        <li class="breadcrumb-item"><a href="<%= link %>"><%= title %></a></li>
      <% else %>
        <li class="breadcrumb-item active" aria-current="page"><%= title %></li>
      <% end %>
      <% end %>
    </ol>
  </div>
</nav>

اگر به شرط نگاه کنید متوجه می شید که من گفتم اگر لینک مسیر جاری با لینک متغییری که من دارم ارسال می کنم به تمپلیت خودم یکی بود بیا مثلا فلان html رو بزار

تا اینجا مشکلی نیست کار می کنه ولی دوتا مشکل در آینده پیش می یاد

۱. اگر من صفحه بندی داشته باشم مثلا به این شرح

get "/blog/:page", BlogController, :index 

۲. و مشکل بعدی فکر کنید کاربر بخواد روی یک مطلب در blog کلیک کنه و بره تو مطلبی ولی باز باید مثلا اون html خاص برای منوی مادر فعال باشه

که در دو گزینه بالا من مشکل دارم .


در مثال منو شما فکر کنید وارد یک سایت می شید روی وبلاگ می زنید و وبلاگ متنش برجسته تر می شه چون روی اون منو هستید و تا اینجا مشکلی نیست حالا فکر کنید صفحه بندی می یاد یا می خواهید وارد یک مطلب بشید دیگه نمی تونه شرط رو بشناسه متاسفانه .

به عنوان مثال کد به شرح زیر می باشد

<%=if length(sub) > 0 do %>
              <%=if addres === @conn.request_path do
                tag(:li, class: "nav-item dropdown active")
              else
                tag(:li, class: "nav-item dropdown")
              end %>
              <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                <%= name %>
              </a>
              <div class="dropdown-menu" aria-labelledby="navbarDropdown">
              <%= for {subname, subaddres, icon}  <- sub do
                raw "<a class=\"dropdown-item\" href=#{subaddres}><i class=\"#{icon}\" aria-hidden=\"true\"></i> #{subname}</a><div class=\"dropdown-divider\"></div>"
              end %>
              </div>
            </li>
          <% else %>
          <%=
            if addres === @conn.request_path do
              tag(:li, class: "nav-item active")
            else
              tag(:li, class: "nav-item")
            end
          %>

و منو به شرح زیر می باشد:

def main_menu do
    menu = [
      home: {"خدمات", "/", [
          {"طراحی وب اپلیکیشن", "/sup1", "fa fa-code"}, {"طراحی اپلیکیشن موبایل", "/sup2", "fa fa-television"}, {"افزونه نویسی جوملا", "/sup3", "fa fa-tablet"}
        ]},
      blog: {"بلاگ", "/blog", [

        ]},
      about: {"درباره ما", "/about", [
        ]},
      contact: {"ارتباط با ما", "/contact", [

        ]}
    ]
    menu
  end
end

من در مسیر دهی و شناخت روتر اصلی دچار مشکل شدم . شما در این رابطه چه کاری می کردید ؟


برای درک بهتر نمونه سالم رو ببنید

حالا همین نمونه و باگ به وجود اومده در صفحه بندی


پیوست

در حال حاظر می تونم این کارو دستی ترش کنم ولی می خواستم داینامیک تر باشه و بیشتر خود کد بتونه خودشو با شرایط مختلف وقف بده


#2

دوستان اگر مقاله ای برای فونیکس ۱.۳ برای منوی جاری یا همون کارنت منو در دست داشتید ممنون می شم لطف کنید و اشتراک بگذارید. منطق من باگ های خیلی زیادی داره


#3

اینو دیدی؟


#4

ممنون سام عزیز نه ندیده بودمش الان می بینمش ولی مشکلمو فکر کنم حل کردم

برای منو اومدم در کنترلر در فانکشن اکشن یک متغییری رو فرستادم که شامل عدد هست و چک می کنه با اصل مپ منو هام که اونجا اگر یکی بود اکتیو می کنه

و در قسمت breadcrumb هم اومدم یک عدد به اون لیستی که داشتم درست می کردم اضافه کردم مثل زیر

breadcrumb =
      [
        %{
          title: "بلاگ",
          link: "/blog",
          number: 1
        },
        %{
          title: "بلاگ",
          link: "/blog",
          number: 2
        }
      ]

حالا اومدم در تمپلیتم این تغییر رو دادم و گفتم اگر آخرین عدد مساوی با آخرین عدد بود پس بشه فلان html فکر کنم دیگه باگ نداشته باشه یک فانکشن رو هم حذف کردم

<%= for %{title: title, link: link, number: number} <- @breadcrumb do %>
        <%= if number != Enum.at(@breadcrumb,-1).number do %>
          <li class="breadcrumb-item"><a href="<%= link %>"><%= title %></a></li>
        <% else %>
          <li class="breadcrumb-item active" aria-current="page"><%= title %></li>
        <% end %>
      <% end %>

فقط من نمی دونم اینا رو چیجوری بیام تبدیل به پلاگ یا چیزی بکنم که بعدا هرجا خواستم ازش استفاده کنم یعنی دوباره کپی پست نکنم راه مناسبش شما بودید همین قطعه کد هارو جایی نگه می داشتید یا تبدیل به چیزی می کردید؟ برای پروژه بعدیم منظورمه