Раньше
я показал, как
сваять заготовку для Zope product (учтите,
Zope 2.10!).
Теперь покажу,
как кастомизировать скин Наудок/Zope. Ну,
или просто добавить в пакет свой скин.
При кастомизации
имеющегося файла самое сложное – найти
этот файл. Тут надо умело объединить
навыки поиска текста в файлах, анализа
кода веб-страниц, понимания – откуда
веб-страница взялась, знание устройства
Zope CMF и прочие полезные скиллы.
Допустим, так
или иначе, где-то в недрах папок «skins»
нужный файл найден. И даже кастомизирован
через инструмент ZMI — site — portal_skins Zope.
Теперь самое время убрать из папки ZODB
custom старую версию и сделать кастомизацию
по взрослому. Через пакет Python.
В пакете сделаем
папочку
MyPackege/skins/naucustom
и в нее положим
найденный файл. Отредактировав его как
требуется.
Осталась
мелочь, зарегистрировать свой скин в
portal_skins, так, чтобы наш слой оказался
выше оригинального, но ниже спецслоя
«custom».
Я это сделал
так:
# MyPackage/skin.py import os import string import types import logging from App.Common import package_home from OFS.Image import manage_addImage from Products.CMFCore.utils import getToolByName import Products.CMFCore.DirectoryView as cmf_dv from Products.CMFNauTools.Utils import joinpath, minimalpath import Products.CMFNauTools.Exceptions as nau_errs skin_layers = ('naucustom',) def registerDirectory(): cmf_dv.registerDirectory('skins', globals()) for lyr in skin_layers: cmf_dv.registerDirectory('skins/%s' % lyr, globals()) class SkinsInstaller: def install(self, portal): self.site = portal ps = getToolByName(portal, 'portal_skins') self.portal_skins = ps for lyr in skin_layers: self.addSkinLayer( 'bgpackage_%s' % lyr, 'skins/%s' % lyr, globals(), after='custom' ) def addSkinLayer(self, id, path, namespace=None, skin=None, before=None, after=None): ps = self.portal_skins if hasattr(ps, id): ps.manage_delObjects([id]) # ensure the path is absolute if not os.path.isabs(path): if namespace is None: namespace = globals() package_path = minimalpath(package_home(namespace)) path = joinpath(package_path, path) # createDirectoryView try: cmf_dv.createDirectoryView(ps, path, id) except nau_errs.DuplicateIdError: #~ This identifier is already in use log('SkinsInstaller.addSkinLayer: createDirectoryView failed, %s exists already' % id) # normalize parameters if not skin: skin = ps.getDefaultSkin() skin_path = ps.getSkinPath(skin) paths = map(string.strip, skin_path.split(',')) if id in paths: # remove id from layers list clean_paths = [x for x in paths if x != id] paths = clean_paths # calculate layer place if before is after is None: place = len(paths) elif after is None: # before is not None if type(before) is types.ListType: places = [paths.index(bef) for bef in before] places.sort() place = places[0] else: place = paths.index(before) # may raise IndexError elif before is None: # after is not None place = paths.index(after) + 1 # may raise IndexError else: raise SimpleError("'before' or|and 'after' must be None") # add layer to list paths.insert(place, id) ps.addSkinSelection(skin, ','.join(paths)) |
# MyPackage/__init__.py import os import string import types import logging from App.Common import package_home from OFS.Image import manage_addImage from Products.CMFCore.utils import getToolByName import Products.CMFCore.DirectoryView as cmf_dv from Products.CMFNauTools.Utils import joinpath, minimalpath import Products.CMFNauTools.Exceptions as nau_errs import skin def getZopeApp(product_context): """Return Zope2 Application from ProductContext http://product-developers.narkive.com/mJghBKT8/grabbing-app-root-in-product-initialization """ bobo_application = None try: from Zope2 import bobo_application except ImportError: log("can't import bobo_application") if bobo_application is not None: app = bobo_application() else: app = product_context._ProductContext__app return app def initialize(context): app = getZopeApp(context) si = skin.SkinsInstaller() si.install(app.docs) skin.registerDirectory() |
Болдом выделено
главное.
Чуть не забыл,
хотя я и использовал куски кода и модули
Наудок, для лаконичности, можно скины
добавить и без них, кусков из Наудок.
original post http://vasnake.blogspot.com/2015/03/naudoczope-210-skins.html
Комментариев нет:
Отправить комментарий