CreateBundle

El CreateBundle integra a Symfony 2 las bibliotecas ayudante create.js y createphp.

create.js es una comprensible interfaz de edición web para Sistemas de administración de contenido (CMS). Está diseñado para proporcionar un moderno gestor de contenido, totalmente basado en un entorno de navegadores HTML5. Creado para poder adaptarlo para trabajar en casi cualquier interfaz de administración de contenido. Ve http://createjs.org/

Createphp es una biblioteca PHP para ayudarte con anotaciones RDF en tus entidades/documentos. Ve la documentación sobre como trabaja en https://github.com/flack/createphp.

Dependencias

Este paquete incluye create.js (el cuál empaca todas sus dependencias como jquery, vie, hallo, backbone, etc.) como submódulos git. No olvides añadir el guión del controlador de composer a tu archivo composer.json como se describe abajo.

Las dependencias de PHP son manejadas por medio de composer. Utilizamos createphp así como AsseticBundle, FOSRestBundle y por inferencia también JmsSerializerBundle. Asegúrate de crear una instancia de todos estos paquetes en tu nucleo y de configurar correctamente el assetic.

Instalando

Este paquete se incluye mejor utilizando Composer.

Edita el archivo composer de tu proyecto añadiendo un nuevo requisito para symfony-cmf/create-bundle. Luego, crea una sección de guiones o añádelo a una existente:

{
    "scripts": {
        "post-install-cmd": [
            "Symfony\\Cmf\\Bundle\\CreateBundle\\Composer\\ScriptHandler::initSubmodules",
            ...
        ],
        "post-update-cmd": [
            "Symfony\\Cmf\\Bundle\\CreateBundle\\Composer\\ScriptHandler::initSubmodules",
            ...
        ]
    }
}

Añade este paquete (y sus dependencias, si aún no están) al núcleo de tu aplicación:

// application/ApplicationKernel.php
public function registerBundles()
{
    return array(
        // ...
        new Symfony\Bundle\AsseticBundle\AsseticBundle(),
        new JMS\SerializerBundle\JMSSerializerBundle($this),
        new FOS\RestBundle\FOSRestBundle(),
        new Symfony\Cmf\Bundle\CreateBundle\SymfonyCmfCreateBundle(),
        // ...
    );
}

También necesitas configurar el FOSRestBundle para manejar json:

fos_rest:
    view:
        formats:
            json: true

Concepto

Createphp usa metadatos RDF sobre las clases de tu dominio, tal como Doctrine sabe cómo se almacenan los metadatos de un objeto en la base de datos. Los metadatos son modelados por el tipo de la clase y pueden provenir de cualquier fuente. Createphp proporciona controladores de metadatos que leen XML, arreglos PHP y uno que justo introspecciona objetos y crea metadatos no semánticos que serán suficientes para editar con create.js.

El RdfMapper se usa para traducir entre tu capa de almacenamiento y createphp. Este es pasado al objeto dominio y al objeto metadatos pertinente.

Con los metadatos y el ayudante de Twig, el contenido es dibujado con anotaciones RDF. create.js es cargado y habilitado para editar las entidades. Guarda en la interfaz de administración las operaciones que ocurrieron en llamadas ajax.

El controlador REST maneja esas llamadas ajax, y si quieres ser capaz de cargar imágenes, un controlador de imagen guarda las imágenes cargadas y devuelve la ubicación de la imagen.

Configurando

  • YAML
    # app/config/config.yml
    symfony_cmf_create:
        # cargando metadatos
    
        # Lista de directorios para buscar metadatos
        rdf_config_dirs:
            - "%kernel.root_dir%/Resources/rdf-mappings"
        # busca asociaciones en <Paquete>/Resources/rdf-mappings
        # auto_mapping: true
    
        # usa una clase diferente para el controlador REST
        # rest_controller_class: FQN\Classname
    
        # manejo de imagen
        imagen:
            model_class: ~
            controller_class: ~
    
        # rol para controlar el acceso para inclusión js, predefinido
        # REST y controladores de imagen
        # role: IS_AUTHENTICATED_ANONYMOUSLY
    
        # Habilita el asignador PHPCR-ODM de Doctrine
        phpcr_odm: true
    
        # asociación de tipo rdf name => class nombre usado al añadir ítems a colecciones
        map:
            rdfname: FQN\Classname
    
        # url para mejora semántica stanbol, de lo contrario la
        # predeterminada es la instalación del demo
        # stanbol_url: http://dev.iks-project.eu:8081
    
        # fija la barra de edición Hallo en lo alto de la página
        # fixed_toolbar: true
    
        # los tipos RDF para elementos a modificar en texto plano
        # plain_text_types: ['dcterms:title']
    
        # los tipos RDFa para crear las rutas correspondientes después de
        # añadido el contenido de estos tipos con Create.js. Esto no
        # es necesario con el SimpleCmsBundle, porque el contenido y las
        # rutas están en el mismo árbol del repositorio.
        # create_routes_types: ['http://schema.org/NewsArticle']
    

El archivo javascript proporcionado configura create.js y el editor «hallo». Activa algunos complementos como el editor de etiquetas para revisar colecciones de atributos skos:related. Esperamos poder añadir algunas opciones de configuración para modificar la configuración de create.js pero también puedes utilizar el archivo como una plantilla y hacer la propia si necesitas mayor personalización.

Metadatos

createphp necesita información de metadatos para cada clase de tu modelo del dominio. Por omisión, crea paquete usa el controlador de metadatos XML y busca los metadatos en los paquetes habilitados en <Paquete>/Resources/rdf-mappings. Si utilizas un paquete que no tiene ninguna asignación RDF, puedes especificar una lista de rdf_config_dirs que se analizará adicionalmente para buscar metadatos.

Consulta la documentación de createphp para el formato de los metadatos XML.

Controlando el acceso

Si utilizas el controlador REST predefinido, todos pueden editar el contenido una vez activado el crea paquete. Para restringir el acceso, especifica un rol para el paquete que no sea el predefinido IS_AUTHENTICATED_ANONYMOUSLY. Si especificas un rol diferente, create.js sólo se cargará si el usuario tiene ese rol y el controlador REST (y el controlador de imagen si está habilitado) revisará el rol.

Si necesitas un control de acceso más fino, busca en el método asignador isEditable. Puedes extender el asignador a utilizar y sustituir isEditable para que responda si el objeto dominio que se le pasa es editable.

Manejando imágenes

Activa el controlador de imágenes simplista con la configuración image > model_class | controller_class. Este controlador de imagen sólo despacha imágenes existentes en el repositorio PHPCR-ODM y también las sirve en peticiones.

Si necesitas un diferente tratamiento de imágenes, puedes sobrescribir image.model_class y/o image.controller_class, o implementar un servicio personalizado con ImageController y sustituir el symfony_cmf_create.image.controller.

Asignación de peticiones a objetos

Por ahora, el paquete sólo proporciona un servicio para asociar al PHPCR-ODM de Doctrine. Activado al establecer phpcr_odm en true. Si necesitas algo más, debes proporcionar un servicio symfony_cmf_create.object_mapper. (Si necesitas un contenedor para el ORM de Doctrine, mira los asignadores de la biblioteca createphp y haz una petición de extracción en la biblioteca, y otra para exponer el ORM como asignador del servicio en el crea paquete).

Además, ten en cuenta que createphp apoyaría diferentes asignadores para diferentes tipos de RDF. Si necesitas esto, escarva un poco en createphp y crea paquete y haz una petición de extracción para activar esa característica.

Para poder crear nuevos objetos, es necesario proporcionar una asociación entre los tipos RDF y los nombres de clase. (Pendiente: ¿no podemos indexar todas las asignaciones y hacer esto automáticamente?)

Enrutando

Por último añade la ruta correspondiente a tu configuración:

  • YAML
    create:
        resource: "@SymfonyCmfCreateBundle/Resources/config/routing/rest.xml"
    create_image:
        resource: "@SymfonyCmfCreateBundle/Resources/config/routing/image.xml"
    
  • XML
    <import resource="@SymfonyCmfCreateBundle/Resources/config/routing/rest.xml" type="rest" />
    <import resource="@SymfonyCmfCreateBundle/Resources/config/routing/image.xml" type="rest" />
    

Usando

Ajusta tu plantilla para cargar los archivos js del editor si la sesión actual tiene permitido editar el contenido.

If you are using Symfony 2.2 or higher:

{% render(controller("symfony_cmf_create.jsloader.controller:includeJSFilesAction"))  with {'_locale': app.request.locale} %}

For versions prior to 2.2, this will do:

{% render "symfony_cmf_create.jsloader.controller:includeJSFilesAction" with {'_locale': app.request.locale} %}

Además, asegúrate de que assetic está reescribiendo rutas en tus archivos css, y luego incluye los archivos css base (y personalízalos con tu propio css cuando sea necesario) con:

{% include "SymfonyCmfCreateBundle::includecssfiles.html.twig" %}

La otra cosa que tienes que hacer es proporcionar asignación RDF para las clases de tu modelo y ajusta tus plantillas para reproducir con createphp a modo de que create.js sepa cual contenido es editable.

Crea la asignación de metadatos XML en <Paquete>/Resources/rdf-mappings/ o una ruta a tu rdf_config_dirs configurado después del nombre completamente cualificado de tus clases del modelo sustituyendo \\ con un punto (.), es decir, Symfony.Cmf.Bundle.SimpleCmsBundle.Document.MultilangPage.xml. Para un ejemplo de asociación ve los archivos en el cmf-sandbox. La documentación de referencia está en el repositorio de la biblioteca createphp.

Para dibujar tu modelo, usa la etiqueta createphp de Twig:

{% createphp page as="rdf" %}
{{ rdf|raw }}
{% endcreatephp %}

O si necesitas más control sobre el HTML generado:

{% createphp page as="rdf" %}
<div {{ createphp_attributes(rdf) }}>
    <h1 class="my-title" {{ createphp_attributes( rdf.title ) }}>{{ createphp_content( rdf.title ) }}</h1>
    <div {{ createphp_attributes( rdf.body ) }}>{{ createphp_content( rdf.body ) }}</div>
</div>
{% endcreatephp %}

Editores alternativos

You can write your own templates to load a javascript editor. They have to follow the naming pattern SymfonyCmfCreateBundle::includejsfiles-%editor%.html.twig to be loaded. In the includeJSFilesAction, you specify the editor parameter. (Do not forget to add the controller call around the controller name inside render for Symfony 2.2, as in the example above.)

{% render “symfony_cmf_create.jsloader.controller:includeJSFilesAction” with {‘editor’: ‘aloha’, ‘_locale’: app.request.locale } %}

Nota

Create.js has built in support for Aloha and ckeditor, as well as the default hallo editor. Those should be supported by the CreateBundle as well. See these github issue for ckeditor and alhoa integration.

If you wrote the necessary code for one of those editors, or another editor that could be useful for others, please send a pull request.

Desarrollando el editor wysiwyg hallo

Puedes desarrollar el editor hallo dentro del Crea paquete. De manera predefinida, se usa una versión minimizada del hallo empacada con Crea paquete. Para desarrollar el código real, primero necesitas activar con checkout el repositorio hallo completo. Lo puedes hacer ejecutando la siguiente orden desde la línea de ordenes:

app/console cmf:create:init-hallo-devel

There is a special template to load the coffee script files. To load this, just use the hallo-coffee editor with the includeJSFilesAction. (Do not forget to add the controller call around the controller name inside render for Symfony 2.2, as in the example above.)

{% render "symfony_cmf_create.jsloader.controller:includeJSFilesAction" with {'editor': 'hallo-coffee', '_locale': app.request.locale } %}

The hallo-coffee template uses assetic to load the coffee script files from Resources/public/vendor/hallo/src, rather than the precompiled javascript from Resources/public/vendor/create/deps/hallo-min.js. This also means that you need to add a mapping for coffeescript in your assetic configuration and you need the coffee compiler set up correctly.

  • YAML
    assetic:
        filters:
            cssrewrite: ~
            coffee:
                bin: %coffee.bin%
                node: %coffee.node%
                apply_to: %coffee.extension%

In the cmf sandbox we did a little hack to not alwas trigger coffee script compiling. En el archivo config.yml hacemos configurable la extensión de coffee. Ahora si parameters.yml pone coffee.extension a \.coffee el coffeescript es compilado y el compilador de coffee debe estar instalado. Si lo pusiste a cualquier otra cosa tal como \.nocoffee entonces no es necesario tener instalado el compilador de coffee.

Los valores predefinidos para los tres parámetros son:

  • YAML
    coffee.bin: /usr/local/bin/coffee
    coffee.node: /usr/local/bin/node
    coffee.extension: \.coffee
    
Bifúrcame en GitHub