You are here

function PMPAPIDrupalPush::createHypermediaDoc in Public Media Platform API Integration 7

Creates a hypermedia doc to be sent to the PMP.

Parameters

object $entity: Any drupal entity object

string $type: The type of entity (node, file, etc.)

$profile string: The type of PMP profile that will be created

array $mapping: A mapping of entity fields to PMP profile attributes (etc.)

Return value

object A PMP doc (though NOT a CollectionDocJson object).

1 call to PMPAPIDrupalPush::createHypermediaDoc()
PMPAPIDrupalPush::pushEntity in pmpapi_push/classes/PMPAPIDrupalPush.php
Pushes entity to PMP

File

pmpapi_push/classes/PMPAPIDrupalPush.php, line 54
Contains PMPAPIDrupalPush.

Class

PMPAPIDrupalPush
Creates hypermedia docs and pushes entities.

Code

function createHypermediaDoc($entity, $type, $profile, $mapping) {
  global $base_url;
  $lang = !empty($entity->language) ? $entity->language : LANGUAGE_NONE;
  $wrapper = entity_metadata_wrapper($type, $entity);
  $bundle_name = $wrapper
    ->getBundle();
  $doc = new stdClass();
  $doc->attributes = new stdClass();
  $doc->version = '1.0';
  $doc->attributes->hreflang = 'en';
  $profile_obj = new stdClass();
  $profile_obj->href = $this->base . '/profiles/' . $profile;
  $doc->links->profile[] = $profile_obj;
  $alt_url = new stdClass();
  $entity_uri = entity_uri($type, $entity);
  $entity_uri['options']['absolute'] = TRUE;
  $alt_url->href = url($entity_uri['path'], $entity_uri['options']);
  $doc->links->alternate[] = $alt_url;
  $media_profiles = array(
    'audio',
    'image',
    'video',
  );
  if (in_array($profile, $media_profiles)) {

    // crops?
    $enclosure = new stdClass();
    $enclosure->href = file_create_url($entity->uri);
    if ($profile == 'image') {
      $meta = new stdClass();
      $meta->crop = 'primary';
      if (!empty($entity->metadata)) {
        $meta->height = $entity->metadata['height'];
        $meta->width = $entity->metadata['width'];
      }
      elseif (!empty($entity->image_dimensions)) {
        $meta->height = $entity->image_dimensions['height'];
        $meta->width = $entity->image_dimensions['width'];
      }
      $enclosure->meta = $meta;
      $enclosure->type = $entity->filemime;
    }
    drupal_alter('pmpapi_push_enclosure', $enclosure, $entity, $type);
    $doc->links->enclosure = array(
      $enclosure,
    );
  }
  $doc->attributes->guid = $entity->pmpapi_guid;

  // get local field that's mapped to title
  $title_field = array_search('title', $mapping);
  $doc->attributes->title = !empty($entity->{$title_field}) ? $entity->{$title_field} : $entity->pmpapi_guid;

  // Set published = created OR timestamp OR REQUEST_TIME, but can still be
  // overridden by mapping. This doesn't make sense if, say, a node has
  // status = 0. But if status = 0, it should never get here; instead, it
  // should be deleted from API
  if (!empty($entity->created)) {
    $published = $entity->created;
  }
  elseif (!empty($entity->timestamp)) {
    $published = $entity->timestamp;
  }
  else {
    $published = '';
  }
  $doc->attributes->published = $this
    ->date($published);

  // Set byline to the public-facing name of the (Drupal) user who created the
  // entity. This attribute can always be overridden through push mapping.
  $account = user_load($entity->uid);
  $doc->attributes->byline = format_username($account);

  // Add permissions
  if (!empty($entity->pmpapi_permissions)) {
    $doc->links->permission = $entity->pmpapi_permissions;
  }
  $pmp_info = pmpapi_get_profile_info($profile);
  foreach ($mapping as $local_field => $pmp_field) {
    if ($pmp_field && isset($entity->{$local_field}[$lang][0]) && $local_field != $title_field) {
      $info = field_info_field($local_field);
      $field_type = $info['type'];

      // item
      if (stripos($pmp_field, 'item-') === 0) {
        if ($field_type == 'entityreference') {

          // Get target entity type (e.g., node)
          $item_entity_type = $info['settings']['target_type'];
          $item_key = 'target_id';
        }

        // Assume a file
        if ($field_type == 'image' || $field_type == 'file') {
          $item_entity_type = 'file';
          $item_key = 'fid';
        }
        $item_ids = array();
        foreach ($entity->{$local_field}[$lang] as $ref) {
          $item_ids[] = $ref[$item_key];
        }
        foreach (entity_load($item_entity_type, $item_ids) as $item_entity) {
          if (!empty($item_entity->pmpapi_guid)) {
            $item = new stdClass();
            $item->href = variable_get('pmpapi_base_url') . '/docs/' . $item_entity->pmpapi_guid;
            $doc->links->item[] = $item;
          }
          else {
            $item_wrapper = entity_metadata_wrapper($item_entity_type, $item_entity);
            $label = $item_wrapper
              ->label();
            $uri = entity_uri($item_entity_type, $item_entity);
            $link = l($label, $uri['path'], $uri['options']);
            $message = t('The @item_entity_type !link was attached to this @type, but has not been pushed to the PMP API. If you would like this association to appear in the API, you must first re-save !link, and then re-save this @type.', array(
              '@item_entity_type' => $item_entity_type,
              '@type' => $type,
              '!link' => $link,
            ));
            drupal_set_message($message, 'warning');
          }
        }
      }
      else {
        if ($pmp_field == 'tags') {
          if ($field_type == 'taxonomy_term_reference') {
            foreach ($entity->{$local_field}[$lang] as $tag_array) {
              $tid = $tag_array['tid'];
              $term = taxonomy_term_load($tid);
              $doc->attributes->{$pmp_field}[] = $term->name;
            }
          }
          else {

            // A tag, but not taxo reference
            $doc->attributes->{$pmp_field}[] = $entity->{$local_field}[$lang][0]['value'];
          }
        }
        else {

          // Not a doc's item, nor a tag
          $text = $entity->{$local_field}[$lang][0]['value'];

          // dates need to be converted to ISO-8601
          if ($pmp_info[$pmp_field]['type'] == 'datetime') {
            if ($field_type !== 'datestamp') {

              // 'Regular' date field gives you a UTC time (with no internal
              // offset). So we have to add that.
              $dt = new DateTime($text, new DateTimeZone('UTC'));

              // This looks redundant, but it isn't. We convert to ISO_8601
              // not because it's what PMP uses, but because it's a nice
              // format with internal offsets.
              $text = $dt
                ->format(DATE_ISO8601);

              // Convert value to timestamp (unless it already is one)
              $text = strtotime($text);
            }
            $text = $this
              ->date($text);
          }
          if (!empty($entity->{$local_field}[$lang][0]['format'])) {

            // Run through format, if field provides one
            $format_id = $entity->{$local_field}[$lang][0]['format'];
            $doc->attributes->{$pmp_field} = check_markup($text, $format_id, $lang);
          }
          else {
            $doc->attributes->{$pmp_field} = $text;
          }
        }
      }
    }
  }
  return $doc;
}