Media Block para Entidades Padre-Hijo

Publicado por Lucas Hedding el 4 de Abril de 2013

Aquí están los requisitos. Tiene una relación padre-hijo (uno-a-muchos) entre dos tipos de contenido. Hay tres campos de contenido de tipo media relacionados en estos contenidos. Su tarea consiste en mostrar el primer campo rellenado en un bloque de unos paneles página administrados. El orden es 1) video de Brightcove 2) set de fotos de Flickr 3) archivo de imagen. Si uno de los campos no se rellena en el tipo de contenido infantil, encontrará su padre y ver si el padre tiene un campo poblado. El primer inconvenient que apareció fue Vistas. Hay una llamada adicional al módulo llamado views_ifempty que parece encajar perfectamente al proyecto. Sin embargo, sólo funciona en el mismo nodo. No hace cadena de la petición a un nodo padre. Así que fui con PHP estrecho y entity_metadata_wrapper del módulo entidad.

El código es bastante directo a continuación, a excepción de alguna lógica elegante al principio de la línea 6 y una devolución de llamada recursiva hacia abajo en la parte inferior de la línea 56. En la línea 6, si no hemos hecho una devolución de llamada recursiva, a continuación, $ entidad es NULL y seguimos adelante y procesar el nodo normalmente. En la parte inferior, si hemos pasado por toda la lógica para comprobar la población de un campo y estamos en un nodo hijo, a continuación, llamar example_block_media () de forma recursiva con el nodo padre. Esta vez, cuando comprobamos que la entidad en la línea 6, no va a estar vacío.

El resto del código simplemente escupe el HTML con el tema para Brightcove videos, colecciones de fotos Flickr y fotos. Aquí está el código completo de trabajo.

/**
 * Block call back for a media block.
 */
function example_block_media($entity = NULL, $child_title = NULL) {
  $block = array();
  $wrapper = empty($entity) ? entity_metadata_wrapper('node', menu_get_object()) : $entity;
 
  if ($wrapper->type->value() == 'parent' || $wrapper->type->value() == 'child') {
    if ($value = $wrapper->field_video_embed_code->value(array(
      'sanitize' => TRUE
    ))) {
      $block['content'] = theme('example_brightcove', array(
        '@videoPlayer' => $value[0],
        'videoID' => '1234567910',
        'attributes' => array(
          'class' => 'example-media',
        ),
      ));
    }
    elseif ($value = $wrapper->field_flickr->value(array(
      'sanitize' => TRUE
    ))) {
      $block['content'] = theme('example_flickr_set_slideshow', array(
        'set_id' => $value,
        'attributes' => array(
          'class' => 'example-media',
        ),
      ));
    }
    elseif ($wrapper->field_files->value()) {
      $description = $wrapper->field_files[0]->description->value() !== '' ? $wrapper->field_files[0]->description->value()
          : $description = $wrapper->title->value();
 
      // If we call recursively, and no description is set, then use the title of the child
      if (isset($child_title) && $wrapper->field_files[0]->description->value() == '') {
        $description = $child_title;
      }
 
      $description = filter_xss($description);
 
      $block['content'] = theme('image', array(
        'path' => $wrapper->field_files[0]->file->url->value(),
        'alt' => $description,
        'title' => $description,
        'width' => '300px',
        'height' => '220px',
        'attributes' => array(
          'class' => 'example-media',
        ),
      ));
    }
    elseif ($wrapper->type->value() == 'child') {
      // Pass in the title of the child node to use as the title/alt
      // text of the image (in case one wasn't set).
      // field_parent_node_ref is a required field on child content type.
      $block = example_block_media($wrapper->field_parent_node_ref, $wrapper->title->value());
    }
  }
  return $block;
}

 

¿Necesitará ayuda adicional para gestionar un proyecto complicado? Pruebe nuestros servicios de gestión de proyectos.

Escríbanos sobre su proyecto y nos pondremos en contacto con usted dentro de 48 horas.