2012-01-22 81 views
1

在Plone 4.1.2中,我創建了一個靈巧的myContentType。它有3 zope.schema.Choice字段。其中兩人從硬編碼詞彙中獲得價值,另一種人從動態詞彙中獲得價值。在這兩種情況下,如果我選擇一個具有西班牙語重音的值,那麼當我保存添加表單時,選擇將消失並且不會顯示在視圖窗體中(不顯示任何錯誤消息)。但是,如果我選擇一個非重音值,一切正常。Plone /敏捷schema.Choice不允許西班牙字符

有關如何解決此問題的任何建議?

(大衛,我希望這是你問我)

# -*- coding: utf-8 -*- 

from five import grok 
from zope import schema 
from plone.directives import form, dexterity 

from zope.component import getMultiAdapter 
from plone.namedfile.interfaces import IImageScaleTraversable 
from plone.namedfile.field import NamedBlobFile, NamedBlobImage 

from plone.formwidget.contenttree import ObjPathSourceBinder 
from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm 
from zope.schema.interfaces import IVocabularyFactory 

from z3c.formwidget.query.interfaces import IQuerySource 
from zope.component import queryUtility 

from plone.formwidget.masterselect import (
    _, 
    MasterSelectField, 
    MasterSelectBoolField, 
) 

from plone.app.textfield.interfaces import ITransformer 
from plone.indexer import indexer 

from oaxaca.newcontent import ContentMessageFactory as _ 
from oaxaca.newcontent.config import OAXACA 

from types import UnicodeType 
_default_encoding = 'utf-8' 

def _encode(s, encoding=_default_encoding): 
    try: 
     return s.encode(encoding) 
    except (TypeError, UnicodeDecodeError, ValueError): 
     return s 

def _decode(s, encoding=_default_encoding): 
    try: 
     return unicode(s, encoding) 
    except (TypeError, UnicodeDecodeError, ValueError): 
     return s 
     view = view.encode('utf-8') 


def getSlaveVocab(master): 
    results = [] 
    if master in OAXACA: 
     results = sorted(OAXACA[master]) 
    return SimpleVocabulary.fromValues(results) 


class IFicha(form.Schema, IImageScaleTraversable): 
    """Describes a ficha 
    """ 

    tipoMenu = schema.Choice(
      title=_(u"Tipo de evento"), 
      description=_(u"Marque la opción que aplique o " 
          "seleccione otro si ninguna aplica"), 
      values=(
       u'Manifestación en lugar público', 
       u'Toma de instalaciones municipales', 
       u'Toma de instalaciones estatales', 
       u'Toma de instalaciones federales', 
       u'Bloqueo de carretera municipal', 
       u'Bloqueo de carretera estatal', 
       u'Bloqueo de carretera federal', 
       u'Secuestro de funcionario', 
       u'Otro',), 
      required=False, 
     ) 

    tipoAdicional = schema.TextLine(
      title=_(u"Registre un nuevo tipo de evento"), 
      description=_(u"Use este campo solo si marcó otro en el menú de arriba"), 
      required=False 
     ) 

    fecha = schema.Date(
      title=_(u"Fecha"), 
      description=_(u"Seleccione el día en que ocurrió el evento"), 
      required=False 
     ) 

    municipio = MasterSelectField(
      title=_(u"Municipio"), 
      description=_(u"Seleccione el municipio donde ocurrió el evento"), 
      required=False, 
      vocabulary="oaxaca.newcontent.municipios", 
      slave_fields=(
       {'name': 'localidad', 
       'action': 'vocabulary', 
       'vocab_method': getSlaveVocab, 
       'control_param': 'master', 
       }, 
      ) 
     ) 

    localidad = schema.Choice(
     title=_(u"Localidad"), 
     description=_(u"Seleccione la localidad donde ocurrió el evento."), 
     values=[u'',], 
     required=False, 
    ) 

    actores = schema.Text(
      title=_(u"Actores"), 
      description=_(u"Liste las agrupaciones y los individuos que participaron en el evento"), 
      required=False, 
     ) 

    demandas = schema.Text(
      title=_(u"Demandas"), 
      description=_(u"Liste las demandas o exigencias de los participantes"), 
      required=False 
     ) 

    depResponsable = schema.Text(
      title=_(u"Dependencias"), 
      description=_(u"Liste las dependencias gubernamentales responsables de atender las demandas"), 
      required=False 
     ) 

    seguimiento = schema.Text(
      title=_(u"Acciones de seguimiento"), 
      description=_(u"Anote cualquier accion de seguimiento que se haya realizado"), 
      required=False 
     ) 

    modulo = schema.Choice(
      title=_(u"Informa"), 
      description=_(u"Seleccione el módulo que llena esta ficha"), 
      values=(
       u'M1', 
       u'M2', 
       u'M3', 
       u'M4', 
       u'M5', 
       u'M6', 
       u'M7', 
       u'M8', 
       u'M9', 
       u'M10', 
       u'M11', 
       u'M12', 
       u'M13', 
       u'M14', 
       u'M15', 
       u'M16', 
       u'M17', 
       u'M18', 
       u'M19', 
       u'M20', 
       u'M21', 
       u'M22', 
       u'M23', 
       u'M24', 
       u'M25', 
       u'M26', 
       u'M27', 
       u'M28', 
       u'M29', 
       u'M30',), 
      required=False 
     ) 

    imagen1 = NamedBlobImage(
      title=_(u"Imagen 1"), 
      description=_(u"Subir imagen 1"), 
      required=False 
     ) 

    imagen2 = NamedBlobImage(
      title=_(u"Imagen 2"), 
      description=_(u"Subir imagen 2"), 
      required=False 
     ) 

    anexo1 = NamedBlobFile(
      title=_(u"Anexo 1"), 
      description=_(u"Subir archivo 1"), 
      required=False 
     ) 

    anexo2 = NamedBlobFile(
      title=_(u"Anexo 2"), 
      description=_(u"Subir archivo 2"), 
      required=False 
     ) 


@indexer(IFicha) 
def textIndexer(obj): 
    """SearchableText contains fechaFicha, actores, demandas, municipio and localidad as plain text. 
""" 
    transformer = ITransformer(obj) 
    text = transformer(obj.text, 'text/plain') 
    return '%s %s %s %s %s' % (obj.fecha, 
          obj.actores, 
          obj.demandas, 
          obj.municipio, 
          obj.localidad) 
grok.global_adapter(textIndexer, name='SearchableText') 


class View(grok.View): 
    """Default view (called "@@view"") for a ficha. 
    The associated template is found in ficha_templates/view.pt. 
    """ 

    grok.context(IFicha) 
    grok.require('zope2.View') 
    grok.name('view') 
+0

請告訴我們您的字符編碼的詞彙選擇。 – sdupton

+0

在我添加buildout.cfg: – user1162968

+0

在我添加buildout.cfg:[CMDS] 配方= plone.recipe.command 更新命令= $ {CMDS:命令} 命令= 搭配chmod 600 .installed.cfg cat> $ {buildout:directory} /bin/sitecustomize.py << EOF import sys sys.setdefaultencoding('utf-8') EOF ...作爲myContentType.py的第一行,我添加了:# - * - coding:utf-8 - * - – user1162968

回答

1

,我發現了同樣的問題在幾個月前就collective.nitf早期發展。

詞彙表上的標記必須標準化;這是我如何解決它:

# -*- coding: utf-8 -*- 

import unicodedata 

… 

class SectionsVocabulary(object): 
    """Creates a vocabulary with the sections stored in the registry; the 
    vocabulary is normalized to allow the use of non-ascii characters. 
    """ 
    grok.implements(IVocabularyFactory) 

    def __call__(self, context): 
     registry = getUtility(IRegistry) 
     settings = registry.forInterface(INITFSettings) 
     items = [] 
     for section in settings.sections: 
      token = unicodedata.normalize('NFKD', section).encode('ascii', 'ignore').lower() 
      items.append(SimpleVocabulary.createTerm(section, token, section)) 
     return SimpleVocabulary(items) 

grok.global_utility(SectionsVocabulary, name=u'collective.nitf.Sections') 
+0

GraciasHèctor,lotratarè。 – user1162968

0

Plone中使用gettext實現國際化。防彈方法將用英語實現您的自定義功能,並使用locales作爲您的特定語言。 Look at the relevant parts of the community manual on how this is done.由於您已經設置了MessageFactory,所以您甚至可以使用如用於快速提取消息字符串的zettwerk.i18nduder

+0

謝謝克里斯。我會試試看。 – user1162968

+0

我在http://collective-docs.readthedocs.org/en/latest/models/vocabularies.html中找到了部分解釋/解決方案。如果我這樣做,我可以在視圖中獲得西班牙字符: – user1162968

0

我找到了部分解釋/解決方案here。我可以在視圖形式西班牙字符,如果我做的:

- - 編碼:UTF-8 - -

從plone.directives

從Zope的輸入模式 導入表單 從五個進口神交 從plone.directives導入形式,靈巧 從zope.schema.vocabulary進口SimpleVocabulary

myVocabulary = SimpleVocabulary.fromItems(( (U 「富」, 「id_foó」), (U 「可愛狗狗」, 「id_baroó」 )))

類IPrueba(form.Schema):

tipoMenu = schema.Choice(
     title=_(u"Tipo de evento"), 
     description=_(u"Marque la opción que aplique o " 
         "seleccione otro si ninguna aplica"), 
     vocabulary=myVocabulary, 
     required=False, 
    )