我想通过 CKAN 主导航菜单中的菜单项提供自定义扩展的功能。不知道如何从我的扩展代码中添加这个新菜单项。任何帮助,将不胜感激。
谢谢,PK
CKAN Pages 扩展(适用于 CKAN 2.2+)允许向 CKAN 添加基本页面,包括向主菜单添加适当的链接。管理员用户可以在菜单中配置页面的顺序,并使用 CKAN 的首选 Markdown 语言来设置页面的内容。本质上,它使 CKAN 成为一个基本的 CMS。
更多信息:https ://github.com/ckan/ckanext-pages
该扩展是最初由 OKNF(CKAN 的制造商)创造的官方扩展,因此它做得很好并且(目前)得到了很好的支持。
如果你想利用 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 %}
这将导致服务器错误,因为“惊人”尚未在 pylons 中注册为映射路线。我们接下来会解决这个问题。如果您已经正确构建了扩展,您应该有一个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
..whereckanext.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 部分有拼写错误
您只需将相关模板与菜单项的 HTML 一起添加到您的扩展程序中。见http://docs.ckan.org/en/latest/theming/index.html