11. Dexterity - Parte I: A través de la Web

¿Qué es un tipo de contenido?

Un tipo de contenido es una variedad de objetos que pueden almacenar información y es editable por los usuarios. Tenemos diferentes tipos de contenido para reflejar los diferentes tipos de información sobre la que tenemos que recopilar y mostrar la información. Páginas, carpetas, eventos, noticias, archivos (binarios) y las imágenes son todos los tipos de contenido.

Es común en el desarrollo de un sitio Web usted necesitará versiones personalizadas de los tipos de contenido comunes, o tal vez incluso totalmente nuevos tipos.

¿Recuerda los requisitos para nuestro proyecto? Queríamos ser capaces de solicitar y editar charlas de la conferencia. Podríamos utilizar el tipo de contenido Página para ese propósito. Sin embargo, hay bits de información que necesitamos para asegurarnos de que obtenemos sobre una charla y no sería seguro de obtener esa información si sólo pedimos ponentes potenciales para crear una página. Además, vamos a querer ser capaz de mostrar las charlas que ofrecen esa información especial, y nosotros queremos ser capaces de mostrar las colecciones de charlas. Un tipo de contenido personalizado será ideal.

Los elementos de un tipo de contenido Plone

Cada tipo de contenido Plone tiene las siguientes partes:

Esquema

Una definición de campos que comprenden un tipo de contenido; propiedades de un objeto.

FTI

La “Factory Type Information” configura el tipo de contenido en Plone, asigna un nombre, un icono, características adicionales y posibles vistas.

Vistas

Una vista es una representación del objeto y el contenido de sus campos que pueden prestarse en respuesta a una solicitud. Usted puede tener una o más vistas de un objeto. Algunos pueden ser visuales - destinados a la pantalla en forma de páginas Web - otros pueden estar destinados a satisfacer las peticiones AJAX y estar en formatos como JSON o XML.

Dexterity y Archetypes - Una comparación

Hay dos frameworks de contenido en Plone

  • Dexterity: nuevo y el que vendrá por defecto

  • Archetypes: los tipos de contenidos viejos, intentados y probados

  • Archetypes: extenso sin embargo con complementos

  • Plone 4.x: Archetypes es el predeterminado, con Dexterity disponible

  • Plone 5.x: Dexterity es el predeterminado, con Archetypes disponible

  • Por tanto, añadir y editar formularios se crean automáticamente a partir de un esquema

¿Cuales son las diferencias?

  • Dexterity: Nuevo, más rápido, modular, hay magia oscura para los métodos getters y setters

  • Archetypes tiene métodos setter / getter mágico - usa talk.getAudience() para el campo ‘audience’

  • Dexterity: los campos son atributos: talk.audience en vez de talk.getAudience()

A través de la Web:

  • Dexterity tiene una buena experiencia a través de la Web.

  • Archetypes no tiene experiencia a través de la Web, por defecto, solo vía productos adicionales de tercero sin soporte oficial.

  • Modelado UML: ArchGenXML para Archetypes, agx para Dexterity

Enfoques para Desarrolladores:

  • Esquema en Dexterity: A través de la Web, XML, Python. Interface = esquema, a menudo no hay clase necesaria

  • Esquema en Archetypes: Esquemas solamente en Python

  • Dexterity: Permisos fácil por cada campo. fácil personalización de formularios.

  • Archetypes: Permisos por campo duros, los formularios personalizados aún más difícil.

  • Si tiene que programar para los sitios antiguos ¡usted necesita saber Archetypes!

  • Si empieza desde cero en nuevo sitios, ¡use Dexterity!.

Extendiendo:

  • Dexterity tiene Comportamientos: fácilmente ampliable. Basta con activar un comportamiento a través de la Web y su tipo de contenido es, por ejemplo traducible (con el complemento plone.app.multilingual).

  • Archetypes tiene el producto archetypes.schemaextender. Potente pero no tan flexible.

Sólo hemos utilizado Dexterity en los últimos años. Enseñamos Dexterity y no Archetypes porque es más accesible a los principiantes, tiene una gran experiencia a través de la Web y es el futuro.

Vistas:

  • Tanto Dexterity y Archetypes tienen una vista predeterminada de tipos de contenido.

  • Las Browser Views proveen vistas personalizadas.

  • A través de la Web (en el futuro)

  • Formularios de visualización

Instalación

Nota

Podemos omitir este paso desde que instalamos el producto plone.app.contenttypes activando este al momento de crear nuestro sitio Plone en el principio.

Usted no tiene que modificar el archivo buildout puesto este esta incorporado desde Plone 4.2 y versiones posteriores con Dexterity. Sólo tienes que activarlo en el panel de control para Complementos.

Esta vez, sin razón aparente que no sea cada vez se sienta más cómodo con el ZMI, utilizaremos la herramienta portal_quickinstaller para instalar Dexterity.

  • Ir a la herramienta portal_quickinstaller en la ZMI.

  • Instale el producto “Tipos de contenido Dexterity”.

Modificando tipos existentes

  • Ir a panel de control http://localhost:8080/Plone/@@dexterity-types

  • Inspecciona algunos de los tipos de contenido existentes por defecto

  • Seleccione el tipo de contenidos Noticias y agregar un nuevo campo Hot News de tipo Sí/No

  • En otra pestaña agregar un tipo de contenido Noticia y entonces se ve el nuevo campo.

  • Valla al editor de esquema y haga clic en Editar el modelo de campo XML.

  • Note que el único campo en el esquema XML de la Noticia, es el que acaba de agregar. Todos los demás son proporcionados por los comportamientos.

  • Editar el tipo de widget del formulario por lo que dice:

    <form:widget type="z3c.form.browser.checkbox.SingleCheckBoxFieldWidget"/>
    
  • Edite de nuevo el elemento de Noticia. El widget de cambiado de un campo de radio a una casilla de verificación.

  • El nuevo campo Hot News no se visualiza cuando se representa la Noticia. Nosotros nos ocuparemos de esto más adelante.

Creando tipos de contenidos a través de la Web

En este paso vamos a crear un tipo de contenido llamado Talk (para las charlas) y probarlo. Cuando esté listo vamos a mover el código fuente de la Web para el sistema de archivos y en nuestro propio complemento. Más tarde vamos a ampliar ese tipo, los comportamientos y añadir un viewlet de las Charlas.

  • Agregar un nuevo tipo de contenido llamado “Talk” y algunos campos para el:

    • Agregue el campo “Type of talk”, de tipo “Selección”. Agregar opciones talk, keynote, training

    • Agregue el campo “Details”, de tipo “Rich Text” con un tamaño máximo de 2000

    • Agregue el campo “Audience”, de tipo “Selección múltiple”. Agregar opciones: beginner, advanced, pro

    • Marque los comportamientos que están habilitados: Metadatos Dublin Core, Nombre a partir del título. ¿Tenemos todos necesitamos?

  • Pruebe el tipo de contenido

  • Regrese al panel de control http://localhost:8080/Plone/@@dexterity-types

  • Extiende el nuevo tipo

    • “Speaker”, tipo: “Línea de texto (cadena de caracteres)”

    • “Email”, tipo: “Línea de texto (cadena de caracteres)”

    • “Image”, tipo: “Image”, no requerido

    • “Speaker Biography”, tipo: “Rich Text”

  • Probar otra vez

Aquí está el código completo de esquema XML creado por nuestras acciones.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<model xmlns:security="http://namespaces.plone.org/supermodel/security" xmlns:marshal="http://namespaces.plone.org/supermodel/marshal" xmlns:form="http://namespaces.plone.org/supermodel/form" xmlns="http://namespaces.plone.org/supermodel/schema">
  <schema>
    <field name="type_of_talk" type="zope.schema.Choice">
      <description/>
      <title>Type of talk</title>
      <values>
        <element>Talk</element>
        <element>Training</element>
        <element>Keynote</element>
      </values>
    </field>
    <field name="details" type="plone.app.textfield.RichText">
      <description>Add a short description of the talk (max. 2000 characters)</description>
      <max_length>2000</max_length>
      <title>Details</title>
    </field>
    <field name="audience" type="zope.schema.Set">
      <description/>
      <title>Audience</title>
      <value_type type="zope.schema.Choice">
        <values>
          <element>Beginner</element>
          <element>Advanced</element>
          <element>Professionals</element>
        </values>
      </value_type>
    </field>
    <field name="speaker" type="zope.schema.TextLine">
      <description>Name (or names) of the speaker</description>
      <title>Speaker</title>
    </field>
    <field name="email" type="zope.schema.TextLine">
      <description>Adress of the speaker</description>
      <title>Email</title>
    </field>
    <field name="image" type="plone.namedfile.field.NamedBlobImage">
      <description/>
      <required>False</required>
      <title>Image</title>
    </field>
    <field name="speaker_biography" type="plone.app.textfield.RichText">
      <description/>
      <max_length>1000</max_length>
      <required>False</required>
      <title>Speaker Biography</title>
    </field>
  </schema>
</model>

Moviendo el tipo de contenido dentro del código fuente

Es impresionante que podemos hacer tanto a través de la Web. Pero también es un callejón sin salida si queremos volver a utilizar este tipo de contenido en otros sitios.

También, para el desarrollo profesional, queremos ser capaces de utilizar el control de versiones para nuestro trabajo, y vamos a querer ser capaz de añadir la clase de lógica de negocio que requerirá de programación.

Por lo tanto, vamos a última instancia querer mover nuestro nuevo tipo de contenido en un paquete Python. Nos faltan algunas habilidades para hacer eso, y vamos a cubrir aquellos en los próximos dos capítulos.

Ejercicios

Ejercicio 1

Modificar Documentos para permitir subir una imagen como la decoración (como las Noticias).

Solución

Las imágenes se muestran por encima del título.

Ejercicio 2

Crear un nuevo tipo de contenido llamada Speaker y exportar el esquema a un archivo XML. Debe contener los siguientes datos:

  • First Name
  • Last Name
  • Email
  • Homepage (opcional)

  • Biography (opcional)

  • Company (opcional)

  • Twitter-Name (opcional)

  • IRC-Name (opcional)

  • Image (opcional)

Podríamos utilizar este tipo de contenido después de convertir los ponentes en los usuarios de Plone. Podríamos luego enlazar a sus charlas.

Solución

El esquema debería lucir así:

<model xmlns:security="http://namespaces.plone.org/supermodel/security"
       xmlns:marshal="http://namespaces.plone.org/supermodel/marshal"
       xmlns:form="http://namespaces.plone.org/supermodel/form"
       xmlns="http://namespaces.plone.org/supermodel/schema">
  <schema>
    <field name="first_name" type="zope.schema.TextLine">
      <title>First Name</title>
    </field>
    <field name="last_name" type="zope.schema.TextLine">
      <title>Last Name</title>
    </field>
    <field name="email" type="zope.schema.TextLine">
      <title>Email</title>
    </field>
    <field name="homepage" type="zope.schema.TextLine">
      <required>False</required>
      <title>Homepage</title>
    </field>
    <field name="biography" type="plone.app.textfield.RichText">
      <required>False</required>
      <title>Biography</title>
    </field>
    <field name="company" type="zope.schema.TextLine">
      <required>False</required>
      <title>Company</title>
    </field>
    <field name="twitter_name" type="zope.schema.TextLine">
      <required>False</required>
      <title>Twitter-Name</title>
    </field>
    <field name="irc_name" type="zope.schema.TextLine">
      <required>False</required>
      <title>IRC-Name</title>
    </field>
    <field name="image" type="plone.namedfile.field.NamedBlobImage">
      <required>False</required>
      <title>Image</title>
    </field>
  </schema>
</model>