Раньше
я показал, как
сваять заготовку для 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

Комментариев нет:
Отправить комментарий