2016-06-17 2 views
3

Avec Dexterity types de contenu, la manière canonique est d'utiliser le transformateur:Quelle est la manière canonique pour obtenir un texte du champ RichText avec Archétypes

from plone.app.textfield.interfaces import ITransformer 
from plone.app.textfield.value import IRichTextValue 


def get_text_field(obj): 
    """Get text field in object on Dexterity.""" 
    transformer = ITransformer(obj) 
    text = '' 
    if IRichTextValue.providedBy(obj.text): # Dexterity 
     text = transformer(obj.text, 'text/plain') 
    return text 

Mais je ne peux pas trouver la manière canonique de le faire avec Archetypes, le transformateur n'a pas fonctionné avec le raw html, juste avec RichTextValue objet.

Mon approche consiste à utiliser maintenant lxml.html pour convertir html en texte, mais je ne sais pas si cela fonctionne comme il devrait être:

def get_text_field(obj): 
    """Get text field in object on both, Archetypes and Dexterity.""" 
    text = '' 
    try: 
     raw = obj.getText() # Archetypes 
     if raw != '': 
      from lxml import html 
      el = html.fromstring(raw) 
      text = el.text_content() 
    except AttributeError: 
     from plone.app.textfield.value import IRichTextValue 
     if IRichTextValue.providedBy(obj.text): # Dexterity 
      from plone.app.textfield.interfaces import ITransformer 
      transformer = ITransformer(obj) 
      text = transformer(obj.text, 'text/plain') 
    return text 

Répondre

8

En Archétypes le getter régulier fait pour vous.

Donc, si vous appelez getText sur un certain type AT qui a un champ de texte, vous avez les valeurs rétrotransformées: Vérifier https://github.com/plone/Products.Archetypes/blob/e9ad0f4e76544b7890835ca93d25adeca4fc064f/Products/Archetypes/Field.py#L1564

Il utilise les mimetype spécifiés sur le terrain.

Si le type de sortie est text/html et que vous souhaitez text/plain.

Vous pouvez obtenir en appelant le getter sur le terrain avec le paramètre mimetype:

obj.getField('text').get(obj, mimetype='text/plain') 

De plus: obj.getRawText renvoie le contenu réel, comme obj.text.raw sur une teneur en DX avec un RichTextValue.

Et vous pouvez vérifier si le contenu fournit IBaseObject au lieu de attraper AttributeError.

+1

Merci pour la réponse Mathias – rodfersou

+1

De rien :-) – Mathias