Как стать автором
Обновить

Универсальный нумератор как шаблонная функция Mako

Время на прочтение 7 мин
Количество просмотров 1.5K
Думаю все сталкивались с необходимостью создания «номеров страниц» для сайта. В Pylons где то был нумератор (в webhelpers) но функциональность его мне не понравилась. Если делать нумератор достаточно быстрым и гибким (не просто все номера) то код получается не маленьким и его клонирование усложняет шаблоны. И тут к нам приходят на помощь шаблонные функции Mako.

  1. <%def name="draw_numeric_pages(url, page_number=None, pages_max=None)">
  2.         <p>
  3.                 <%
  4.                 page_i = 0
  5.                 if page_number==None:
  6.                         page_number = c.page_number
  7.                 if pages_max==None:
  8.                         pages_max = c.pages_max
  9.                 %>
  10.                 %if page_number > 0:
  11.                         <a href="${(url%(page_number-1).replace('%%', '%')}"><</a>
  12.                 %endif
  13.                 %while page_i <= pages_max:
  14.                         %if page_i == page_number:
  15.                                 (${page_i})
  16.                         %else:
  17.                                 %if abs(page_i - page_number) < 5:
  18.                                         <a href="${(url%(page_i).replace('%%', '%')}">${page_i}</a>
  19.                                 %elif abs(page_i - pages_max) < 5:
  20.                                         <a href="${(url%(page_i).replace('%%', '%')} ">${page_i}</a>
  21.                                 %elif abs(page_i - pages_max) < 10 and  abs(page_i - pages_max) > 5:
  22.                                         .
  23.                                 %elif page_i < 5:
  24.                                         <a href="${(url%(page_i).replace('%%', '%')}">${page_i}</a>
  25.                                 %elif page_i > 5 and page_i < 10:
  26.                                         .
  27.                                 %elif page_i >= 10 and page_i < page_number:
  28.                                         <%
  29.                                         page_i = page_number - 4
  30.                                         continue
  31.                                         %>
  32.                                 %elif page_i > page_number and abs(page_i - pages_max) > 10:
  33.                                         <%
  34.                                         page_i = pages_max - 9
  35.                                         continue
  36.                                         %>
  37.                                 %endif
  38.                         %endif
  39.                         <% page_i += 1 %>
  40.                 %endwhile
  41.                 %if page_number < pages_max:
  42.                         <a href="${(url%(page_number+1).replace('%%', '%')}">></a>
  43.                 %endif
  44.         </p>
  45. </%def>


Обычно все функции я выношу в отедльные .mako файлы к примеру эта функция у меня лежит в файле std_func.mako по этому в целевом шаблоне делаем:
<%namespace name="std_func" file="/std_func.mako"/>
и потом можно использовать наш нумератор:
${std_func.draw_numeric_pages("/forum/posts/%i")}
т.е. вы всегда можете конструировать url и подставлять номер страницы куда нужно.
В данном случае я предполагаю, что в переменной контекста есть переменные page_number (текущая страница) и pages_max (максимальное количество страниц) но их так же всегда можно передать как аргумент функции. Пример можно увидеть тут: mjv-art.org/jvwall/view_posts/0?lang=ru. Функция там малёк сложнее так как подставляется не только номер страницы но и ещё текущий язык на сайте.
Теги:
Хабы:
+4
Комментарии 19
Комментарии Комментарии 19

Публикации

Истории

Ближайшие события

PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн
Weekend Offer в AliExpress
Дата 20 – 21 апреля
Время 10:00 – 20:00
Место
Онлайн