Utilice Rapido para crear un campo personalizado de SearchableText

Objetivo

Crear TTW (a través de la Web) a Tipo de contenido del Book donde los campos están indexados para una búsqueda de texto completo.

Tipo de contenido

Agregue un nuevo tipo de contenido Book en el panel de control Tipos de contenido Dexterity (http://localhost:8080/Plone/@@dexterity-types).

../_images/book-1.png

Edite la configuración de Book (http://localhost:8080/Plone/dexterity-types/book). En la pestaña Comportamientos, desmarque el comportamiento de los Metadatos de Dublin Core y Guardar. En la ficha Campos, haga clic en el botón Editar modelo de campo XML y reemplace el modelo XML por el siguiente:

<model xmlns:form="http://namespaces.plone.org/supermodel/form"
       xmlns:i18n="http://xml.zope.org/namespaces/i18n"
       xmlns:lingua="http://namespaces.plone.org/supermodel/lingua"
       xmlns:marshal="http://namespaces.plone.org/supermodel/marshal"
       xmlns:security="http://namespaces.plone.org/supermodel/security"
       xmlns:users="http://namespaces.plone.org/supermodel/users"
       xmlns="http://namespaces.plone.org/supermodel/schema">
  <schema>
    <field name="title" type="zope.schema.TextLine">
      <description/>
      <title>Title</title>
    </field>
    <field name="authors" type="zope.schema.Text">
      <description/>
      <required>False</required>
      <title>Authors</title>
    </field>
    <field name="year" type="zope.schema.Int">
      <description/>
      <required>False</required>
      <title>Year</title>
    </field>
    <field name="isbn_13" type="zope.schema.TextLine">
      <description/>
      <max_length>13</max_length>
      <min_length>13</min_length>
      <required>False</required>
      <title>ISBN 13</title>
    </field>
    <field name="image" type="plone.namedfile.field.NamedBlobImage">
      <description/>
      <required>False</required>
      <title>Image</title>
    </field>
    <field name="back_cover" type="plone.app.textfield.RichText">
      <description/>
      <required>False</required>
      <title>Back cover</title>
    </field>
  </schema>
</model>

Ahora puede agregar contenido de Book en su sitio web (http://localhost:8080/Plone/++add++book).

../_images/book-2.png

Campo de búsqueda de texto completo

Si tiene un montón de libros en su sitio, le gustaría buscar en el nombre del autor o el contenido de la portada. Para ello, debemos proveer un método o campo SearchableText el cual le de el contenido del índice de texto completo. Nosotros usaremos un bloque rapido y una acción de regla de contenido disponible en el paquete rapido para calcular este campo SearchableText.

Bloque Rapido

Vaya al panel de control Tema (http://localhost:8080/Plone/@@theming-controlpanel). Crea un nuevo tema llamado MyTheme con esta estructura siguiente.

index.html
manifest.cfg
rapido/
    book/
        blocks/
            fields.py
rules.xml

Busque, por ejemplo, en la sección Inheriting a new theme from Barceloneta de la documentación de Plone para obtener contenido de archivos index.html, manifest.cfg y rules.xml.

Contenido del archivo fields.py:

def update_searchabletext_field(context):
    transforms = context.api.portal.get_tool(name='portal_transforms')
    book = context.content
    back_cover_html = book.back_cover.output if book.back_cover else ""
    back_cover_plain = transforms.convertTo(
        'text/plain', back_cover_html, mimetype='text/html').getData()
    book.SearchableText = " ".join([
        book.title if book.title else "",
        book.authors if book.authors else "",
        str(book.year) if book.year else "",
        book.isbn_13 if book.isbn_13 else "",
        back_cover_plain
    ])
    book.reindexObject(idxs=['SearchableText'])

Usaremos la herramienta portal_transforms para convertir el campo HTML back_cover en texto plano. También necesitamos reindexar el contenido.

Acción de regla de contenido Rapido

Lo último que necesitamos es una acción de regla de contenido rapido que se usa en cada modificación del libro.

Vaya a las Reglas de contenido (http://localhost:8080/Plone/@@rules-controlpanel) y agregue una regla que se activa en el evento Objeto modificado.

../_images/book-3.png

Agregue una condición de Tipo de contenido en Book. Añade una acción de Rapido.

../_images/book-4.png

Asigne la regla de contenido en todo el sitio y Guardar.

../_images/book-5.png

Ejercicio

Modifique el código anterior para calcular un campo Descripción que se utilizará en los listados de Plone

Vista personalizada de Book

Para crear una vista del tipo de contenido book personalizada, la solución más simple es utilizar una regla de Diazo.

Por ejemplo, puede agregar en el archivo rules.xml de su tema la siguiente regla diazo:

<rules css:if-content="body.template-view.portaltype-book">
  <replace css:content="#content-core" method="raw">
    <xsl:variable name="image_url">
      <xsl:value-of select="substring-before(//span[@id='form-widgets-image']/img/@src,'view')"/>
    </xsl:variable>
    <div class="row">
        <div class="col-xs-12 col-sm-4">
            <xsl:if test="$image_url">
                <img src="{$image_url}@@images/image/large" style="width: 100%;" />
            </xsl:if>
        </div>
        <div class="col-xs-12 col-sm-8">
            <div><strong>Author(s) : </strong><xsl:copy-of css:select="#form-widgets-authors" /></div>
            <div><strong>ISBN-13(s) : </strong><xsl:copy-of css:select="#form-widgets-isbn_13" /></div>
            <div><strong>Year : </strong><xsl:copy-of css:select="#form-widgets-year" /></div>
            <div><xsl:copy-of css:select="#formfield-form-widgets-back_cover" /></div>
        </div>
    </div>
  </replace>
</rules>

Nuestras nuevas vistas de libros personalizadas:

../_images/book-6.png