general: add menu template tag (#6198)

This commit is contained in:
Frédéric Péters 2015-01-02 20:56:09 +01:00
parent c9fea9fecb
commit 2534f36acd
6 changed files with 69 additions and 0 deletions

View File

@ -63,6 +63,22 @@ class Page(models.Model):
parts.append(page.slug)
return '/' + '/'.join(reversed(parts))
def get_page_of_level(self, level):
'''Return page of given level in the page hierarchy.'''
parts = [self]
page = self
while page.parent_id:
page = page.parent
parts.append(page)
parts.reverse()
try:
return parts[level]
except IndexError:
return None
def get_siblings(self):
return Page.objects.filter(parent=self.parent)
def has_children(self):
return Page.objects.filter(parent_id=self.id).exists()

View File

@ -87,3 +87,29 @@ div#sidebar {
top: 0em;
width: 20%;
}
div#menu {
}
div#menu ul {
margin: 0;
margin-left: 2em;
padding: 0;
}
div#menu li {
display: inline-block;
background: #0078ff;
padding: 1ex 1em;
}
div#menu li.selected {
background: linear-gradient(to top, #0036f1 5%, #0078ff 90%) top right no-repeat;
border-bottom: 1px solid black;
}
div#menu li a {
text-decoration: none;
color: white;
font-weight: bold;
}

View File

@ -0,0 +1,9 @@
{% if menuitems %}
<ul>
{% for menuitem in menuitems %}
<li {% if menuitem.selected %}class="selected"{% endif %}><a
href="{{ menuitem.page.get_online_url }}">{{ menuitem.page.title }}</a></li>
</li>
{% endfor %}
</ul>
{% endif %}

View File

@ -7,6 +7,7 @@
</head>
<body class="page-{{ page.slug }}">
<div id="title"><h1>{{ page.title }}</h1></div>
<div id="menu">{% show_menu %}</div>
<div id="content">
{% block combo-content %}
{% placeholder "content" %}

View File

@ -7,6 +7,7 @@
</div>
<div id="sidebar">
<h2>Sidebar</h2>
{% show_menu 1 %}
{% placeholder "sidebar" %}
</div>
{% endblock %}

View File

@ -27,3 +27,19 @@ def placeholder(context, placeholder_name):
@register.simple_tag(takes_context=True)
def render_cell(context, cell):
return cell.render(context)
@register.inclusion_tag('combo/menu.html', takes_context=True)
def show_menu(context, level=0):
current_page = context['page']
page_of_level = current_page.get_page_of_level(level)
if page_of_level is None:
context['menuitems'] = []
return context
menuitems = []
for sibling in page_of_level.get_siblings():
menuitem = {'page': sibling}
if sibling == page_of_level:
menuitem['selected'] = True
menuitems.append(menuitem)
context['menuitems'] = menuitems
return context