Думаю все сталкивались с необходимостью создания «номеров страниц» для сайта. В Pylons где то был нумератор (в webhelpers) но функциональность его мне не понравилась. Если делать нумератор достаточно быстрым и гибким (не просто все номера) то код получается не маленьким и его клонирование усложняет шаблоны. И тут к нам приходят на помощь шаблонные функции Mako.
Обычно все функции я выношу в отедльные .mako файлы к примеру эта функция у меня лежит в файле std_func.mako по этому в целевом шаблоне делаем:
и потом можно использовать наш нумератор:
т.е. вы всегда можете конструировать url и подставлять номер страницы куда нужно.
В данном случае я предполагаю, что в переменной контекста есть переменные page_number (текущая страница) и pages_max (максимальное количество страниц) но их так же всегда можно передать как аргумент функции. Пример можно увидеть тут: mjv-art.org/jvwall/view_posts/0?lang=ru. Функция там малёк сложнее так как подставляется не только номер страницы но и ещё текущий язык на сайте.
- <%def name="draw_numeric_pages(url, page_number=None, pages_max=None)">
- <p>
- <%
- page_i = 0
- if page_number==None:
- page_number = c.page_number
- if pages_max==None:
- pages_max = c.pages_max
- %>
- %if page_number > 0:
- <a href="${(url%(page_number-1).replace('%%', '%')}"><</a>
- %endif
- %while page_i <= pages_max:
- %if page_i == page_number:
- (${page_i})
- %else:
- %if abs(page_i - page_number) < 5:
- <a href="${(url%(page_i).replace('%%', '%')}">${page_i}</a>
- %elif abs(page_i - pages_max) < 5:
- <a href="${(url%(page_i).replace('%%', '%')} ">${page_i}</a>
- %elif abs(page_i - pages_max) < 10 and abs(page_i - pages_max) > 5:
- .
- %elif page_i < 5:
- <a href="${(url%(page_i).replace('%%', '%')}">${page_i}</a>
- %elif page_i > 5 and page_i < 10:
- .
- %elif page_i >= 10 and page_i < page_number:
- <%
- page_i = page_number - 4
- continue
- %>
- %elif page_i > page_number and abs(page_i - pages_max) > 10:
- <%
- page_i = pages_max - 9
- continue
- %>
- %endif
- %endif
- <% page_i += 1 %>
- %endwhile
- %if page_number < pages_max:
- <a href="${(url%(page_number+1).replace('%%', '%')}">></a>
- %endif
- </p>
- </%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. Функция там малёк сложнее так как подставляется не только номер страницы но и ещё текущий язык на сайте.