BlockBundle

El BlockBundle proporciona integración con SonataBlockBundle. Este te asiste gestionando fragmentos de contenido, conocidos como bloques. Lo que hace BlockBundle es similar a lo que hace Twig, pero para bloques almacenados en una BD. De esta manera, un editor puede modificar los bloques. Además, el BlockBundle proporciona la lógica para determinar qué bloque se tendría que dibujar en cuáles páginas.

El BlockBundle por sí mismo no proporciona una funcionalidad de edición para bloques. No obstante, puedes encontrar ejemplos de cómo hacer editables los bloques en el recinto de seguridad del CMF de Symfony.

Dependencias

Este paquete está basado en el SonataBlockBundle

Configurando

La clave de configuración para este paquete es symfony_cmf_block

  • YAML
    # app/config/config.yml
    symfony_cmf_block:
        document_manager_name:  default
    

Bloque documento

Antes de que puedas dibujar un bloque, necesitas crear un objeto que represente los datos de tu bloque en el repositorio. Lo puedes conseguir con el siguiente fragmento de código (ten en cuenta que $parentPage necesita ser una instancia de una página definida por el ContentBundle):

$myBlock = new SimpleBlock();
$myBlock->setParentDocument($parentPage);
$myBlock->setName('sidebarBlock');
$myBlock->setTitle('My first block');
$myBlock->setContent('Hello block world!');

$documentManager->persist($myBlock);

Ten en cuenta que sidebarBlock es el identificador que escogimos para el bloque. Junto con el documento padre del bloque, esto hace único al bloque. Las otras propiedades son específicas de Symfony\Cmf\Bundle\BlockBundle\Document\SimpleBlock.

Nota

El sencillo bloque ahora está listo para dibujarlo, ve Dibujando el bloque.

Nota

Siempre asegúrate de implementar la interfaz Sonata\BlockBundle\Model\BlockInterface o un bloque de documento existente tal como Symfony\Cmf\Bundle\BlockBundle\Document\BaseBlock.

Bloque de servicio

Si miras dentro de la clase SimpleBlock, notarás el método getType. Este define el nombre del servicio de bloque que procesa el bloque al dibujarlo.

Un bloque de servicio contiene:

  • Un método execute
  • configuración predefinida
  • configuración de formulario
  • configuración de caché
  • activos js y css por cargar
  • un método load

Échale un vistazo a los bloques de servicio en Symfony\Cmf\Bundle\BlockBundle\Block para ver algunos ejemplos.

Nota

Asegúrate de implementar siempre la interfaz Sonata\BlockBundle\Block\BlockServiceInterface o un bloque de servicio existente tal como el Sonata\BlockBundle\Block\BaseBlockService.

El método execute

Este contiene el controlador lógico. Combina las opciones predefinidas en este método si lo quieres utilizar:

// ...
if ($block->getEnabled()) {
    // combina las opciones
    $settings = array_merge($this->getDefaultSettings(), $block->getSettings());

    $feed = false;
    if ($settings['url']) {
        $feed = $this->feedReader->import($block);
    }

    return $this->renderResponse($this->getTemplate(), array(
        'feed' => $feed,
        'block' => $block,
        'settings' => $settings
    ), $response);
}
// ...

Nota

Si tienes que usar mucha lógica, la puedes mover a un servicio específico e inyectarlo en el bloque de servicio. Luego usar ese servicio específico en el método execute.

configuración predefinida

El método getDefaultSettings contiene las opciones predefinidas de un bloque. Las opciones después se pueden alterar en múltiples sitios, reflejándose en una cascada como esta:

  • las opciones predefinidas se almacenan en el bloque de servicio

  • las opciones se pueden alterar a través de los ayudantes de plantilla:

    {{ sonata_block_render({
      'type': 'acme_main.block.rss',
      'settings': {
          'title': 'Symfony2 CMF news',
          'url': 'http://cmf.symfony.com/news.rss'
      }
    }) }}
    
  • y las opciones también se pueden alterar en un bloque de documento, la ventaja es que las opciones están almacenadas en PHPCR y te permiten implementar una interfaz de usuario final o de administración para cambiar algunas o todas las opciones.

configuración de formulario

Los métodos buildEditForm y buildCreateForm contienen configuración de formulario para editar utilizando una interfaz de usuario final o de administración. El método validateBlock contiene la configuración de validación.

configuración de caché

El método getCacheKeys contiene las claves utilizadas para el bloque de la memoria caché.

js y css

Puedes usar los métodos getJavascripts y getStylesheets para definir activos js y css. Usa los ayudantes de Twig sonata_block_include_javascripts y sonata_block_include_stylesheets para reproducirlos.

{{ sonata_block_include_javascripts() }}
{{ sonata_block_include_stylesheets() }}

Nota

Esto reproducirá los bloques js y css* de todos los bloques cargados en el contenedor de servicios de tu aplicación.

El método load

Puedes usar el método load para cargar datos adicionales. Este se invoca cada vez que se reproduce un bloque y antes de llamar al método execute.

Dibujando el bloque

Para realmente reproducir el bloque del ejemplo de la sección del bloque documento, solo añade el siguiente código a tu plantilla Twig:

{{ sonata_block_render({'name': 'sidebarBlock'}) }}

Esto hará que se dibuje el BlockBundle según el bloque en cada página que tenga un bloque llamado 'sidebarBlock'. Naturalmente, es necesario que la página real sea reproducida por la plantilla que contiene el fragmento anterior.

Esto pasa al reproducir un bloque, ve las siguientes secciones para más detalles:

  • se carga un documento basándose en el nombre
  • si está configurada la memorización en caché, se revisa la caché y si el contenido se encuentra se devuelve
  • Cada bloque documento también tiene un servicio block, se invoca al método execute:
    • aquí puedes poner lógica como en un controlador
    • esta llama a una plantilla
    • el resultado es un objeto Respuesta

También Puedes incorporar bloques en contenido utilizando el filtro cmf_embed_blocks.

Tipos de bloque

El BlockBundle viene con cuatro bloques de propósito general:

  • SimpleBlock: Un bloque sencillo con nada más que un título y un campo de hipertexto. Este normalmente sería el que un editor modificaría directamente, por ejemplo, la información de contacto
  • ContainerBlock: Un bloque que contiene de 0 a n bloques descendientes
  • ReferenceBlock: Un bloque que hace referencia a un bloque almacenado en algún otro lugar en el árbol de contenido. Por ejemplo, podrías desear referir partes de la información de contacto desde la página inicial
  • ActionBlock: Un bloque que invoca acciones de Symfony2. «¿Por qué utilizar esto en vez de llamar a la acción directamente desde mi plantilla?», te podrías preguntar. Bien, imagina el siguiente caso: Provees un bloque que dibuja reflexiones de tus últimas noticias. Sin embargo, no hay ninguna regla de en dónde debería aparecer. En su lugar, tu cliente quiere decidir en qué páginas se mostraría este bloque. Proporcionando un ActionBlock acorde, permites a tu cliente hacerlo sin llamarte (¡una y otra vez!) para cambiar algunas plantillas.

Además el BlockBundle tiene bloques más específicos:

  • RssBlock: Este bloque extiende el ActionBlock: El bloque documento guarda la url del alimentador y la acción del controlador recupera elmentos del alimentador. La implementación predefinida utiliza el EkoFeedBundle para leer elementos del alimentador.

Ejemplos

Puedes encontrar ejemplos de uso de este paquete en el Recinto de seguridad del CMF de Symfony. Dale un vistazo en el BlockBundle del recinto de seguridad. También te muestra cómo hacer editables los bloques usando el CreateBundle.

Bifúrcame en GitHub