Как добавить пункт меню в навигационное меню CKAN?

Я хочу сделать функциональность пользовательского расширения доступной через пункт меню в главном меню навигации CKAN. Не уверен, как я могу добавить этот новый пункт меню из моего кода расширения. Любая помощь будет оценена по достоинству.

Спасибо, ПК


person user1380140    schedule 21.07.2013    source источник


Ответы (3)


Если вы хотите воспользоваться главным навигационным меню CKAN, это становится немного сложнее. (Нам просто нужно было это выяснить. Не уверен, что мы сделали это правильно, но мы заставили его работать с CKAN 2.2):

Во-первых, вам нужен дополнительный контент в вашем пути расширения. Предполагая, что это my_extension/amazing.html, вы хотите добавить следующее в файл my_extension/templates/header.html (в своем пользовательском расширении):

{% ckan_extends %}

{% block header_site_navigation_tabs %}
  {{ h.build_nav_main(
    ('search', _('Datasets')),
    ('organizations_index', _('Organizations')),
    ('group_index', _('Groups')),
    ('about', _('About')),
    ('amazing', _('Amazing Extension'))
  ) }}
{% endblock %}

Это вызовет ошибку сервера, так как Amazing не был зарегистрирован в пилонах в качестве сопоставленного маршрута. Мы исправим это дальше. Если вы правильно создали расширение, у вас должен быть файл my_extension/plugins.py, к которому вам нужно добавить следующее в определение класса вашего плагина:

class AmazingPlugin(plugins.SingletonPlugin, tk.DefaultDatasetForm):
    #or
    plugins.implements(plugins.IRoutes, inherit=True)
    def before_map(self, m):
        m.connect('amazing', #name of path route
            '/amazing', #url to map path to
            controller='ckanext.my_extension.controller:AmazingController', #controller
            action='amazing') #controller action (method)
        return m

..где ckanext.my_extension.controller — это путь включения к my_extension/controller.py, который мы создадим далее. Он должен состоять из:

import ckan.plugins as p
from ckan.lib.base import BaseController

class AmazingController(BaseController):
    def amazing(self):
        return p.toolkit.render('amazing.html')

Вот и все. Теперь у вас есть контроллер, сопоставляющий URL с элементом навигации, который вы можете вызывать с помощью h.build_nav_main(). Просто, верно? ;) Последняя вещь. Вам нужно будет перезапустить apache, чтобы он вступил в силу.

Изменить: в части header.html была опечатка.

person Jon Weers    schedule 07.12.2013

расширение CKAN Pages (для CKAN 2.2+) позволяет добавлять в CKAN базовые страницы, включая добавление соответствующих ссылок в главное меню. Пользователи с правами администратора могут настроить порядок страниц в меню и использовать предпочитаемый CKAN язык Markdown для установки содержимого страниц. По сути, это превращает CKAN в базовую CMS.

Дополнительная информация: https://github.com/ckan/ckanext-pages.

Расширение является официальным расширением, первоначально придуманным OKNF (создателями CKAN), поэтому оно хорошо сделано и (в настоящее время) хорошо поддерживается.

person Jon Weers    schedule 08.07.2014

Вам просто нужно добавить соответствующие шаблоны в ваше расширение с HTML для ваших пунктов меню. См. http://docs.ckan.org/en/latest/theming/index.html

person Sean Hammond    schedule 23.07.2013