You are here

function _gathercontent_fetcher in GatherContent 7.3

Helper function for fetching data from GatherContent.

Parameters

int $gathercontent_id: ID of GatherContent piece of content.

string $uuid: UUID of \Drupal\gathercontent\Entity\Operation.

bool $drupal_status: Drupal status - published/unpublished.

null $status:

null|object $entity: Object of entity, if we are updating exiting content.

string|null $parent_menu_item: Parent menu item ID if we want to create menu item.

string $node_update_method: Name of the node update method.

Return value

int|FALSE Return nid if operation was successful.

2 calls to _gathercontent_fetcher()
gathercontent_import_process in ./gathercontent.import.inc
Batch operation callback.
gathercontent_update_process in ./gathercontent.module
Batch operation callback.

File

./gathercontent.module, line 438

Code

function _gathercontent_fetcher($gathercontent_id, $uuid, $drupal_status, $status = NULL, $entity = NULL, $parent_menu_item = NULL, $node_update_method) {
  global $user;
  $content_obj = new Content();
  $content = $content_obj
    ->getContent($gathercontent_id);
  if (!empty($status)) {
    $status_obj = new Project();
    $status = $status_obj
      ->getStatus($content->project_id, $status);
  }
  $temp_obj = new Template();
  $template = $temp_obj
    ->getTemplate($content->template_id);
  $operation_item = entity_create('gathercontent_operation_item', array(
    'operation_uuid' => $uuid,
    'item_status' => !empty($status) ? $status->name : $content->status->data->name,
    'item_status_color' => !empty($status) ? $status->color : $content->status->data->color,
    'template_name' => $template->name,
    'item_name' => $content->name,
    'gathercontent_id' => $gathercontent_id,
  ));

  // Check if mapping exists.
  $query = new EntityFieldQuery();
  if (is_null($entity)) {
    $result = $query
      ->entityCondition('entity_type', 'gathercontent_mapping')
      ->propertyCondition('gathercontent_project_id', $content->project_id)
      ->propertyCondition('gathercontent_template_id', $content->template_id)
      ->execute();
  }
  else {
    $result = $query
      ->entityCondition('entity_type', 'gathercontent_mapping')
      ->propertyCondition('id', $entity->gathercontent_mapping_id)
      ->execute();
  }
  if (isset($result['gathercontent_mapping'])) {

    // If mapping exists, start mapping remote fields to local ones.
    $mapping_ids = array_keys($result['gathercontent_mapping']);
    $entities = entity_load('gathercontent_mapping', $mapping_ids);
    $mapping = reset($entities);
    $mapping_data = unserialize($mapping->data);
    if (empty($mapping_data)) {
      return FALSE;
    }
    $mapping_data_copy = $mapping_data;
    $first = array_shift($mapping_data_copy);
    $langcode = isset($first['language']) ? $first['language'] : LANGUAGE_NONE;
    $node = gathercontent_get_destination_node($gathercontent_id, $node_update_method, $mapping->content_type);
    $node->gathercontent_mapping_id
      ->set($mapping->id);
    $node->gathercontent_id
      ->set($content->id);
    if ($node->is_new
      ->value()) {
      $node->author
        ->set($user->uid);
      $node->status
        ->set($drupal_status);
    }
    $node->language
      ->set($langcode);
    if ($node !== FALSE) {
      $metatags = array();
      $_title_is_mapped = FALSE;
      try {
        $content_obj = new Content();
        $files = $content_obj
          ->getFiles($gathercontent_id);
        foreach ($content->config as $pane) {
          $is_translatable = module_exists('entity_translation') && entity_translation_node_supported_type($mapping->content_type) && isset($mapping_data[$pane->name]['language']) && $mapping_data[$pane->name]['language'] != LANGUAGE_NONE;
          if ($is_translatable) {
            $language = $mapping_data[$pane->name]['language'];
          }
          else {
            $language = LANGUAGE_NONE;
          }
          foreach ($pane->elements as $field) {
            if (isset($mapping_data[$pane->name]['elements'][$field->name]) && !empty($mapping_data[$pane->name]['elements'][$field->name])) {
              $local_field_name = $mapping_data[$pane->name]['elements'][$field->name];
              if (isset($mapping_data[$pane->name]['type']) && $mapping_data[$pane->name]['type'] === 'content' || !isset($mapping_data[$pane->name]['type'])) {
                gathercontent_gathercontent_process_content_pane($node, $local_field_name, $field, $mapping->content_type, $is_translatable, $language, $files, $_title_is_mapped);
              }
              elseif (isset($mapping_data[$pane->name]['type']) && $mapping_data[$pane->name]['type'] === 'metatag') {
                gathercontent_gathercontent_process_metatag_pane($node, $metatags, $gathercontent_id, $local_field_name, $field, $mapping->content_type, $is_translatable, $language);
              }
            }
            else {
              $operation_item->status = "Operation failed: Template fields mismatch.";
              entity_save('gathercontent_operation_item', $operation_item);
            }
          }

          // We need to create new translation if is translatable.
          if ($is_translatable && (!isset($node->language) || empty($node->language))) {
            $node->language
              ->set($language);
            $node
              ->save();
          }
          elseif ($is_translatable && (isset($node->language) || !empty($node->language))) {
            $handler = entity_translation_get_handler('node', $node
              ->value());
            $translation = array(
              'translate' => 0,
              'status' => 1,
              'language' => $language,
              'source' => $language === $node->language
                ->value() ? '' : $node->language
                ->value(),
            );
            $handler
              ->setTranslation($translation, $node
              ->value());
          }
        }
        if (!$is_translatable && !$_title_is_mapped) {
          $node->title
            ->set($content->name);
        }
        drupal_alter('gathercontent_pre_node_save', $node, $content, $files);
        $node
          ->save();

        // Create menu link item.
        if (module_exists('menu')) {
          menu_node_prepare($node
            ->raw());
          if (!(bool) $node
            ->raw()->menu['mlid']) {
            if ($is_translatable) {
              if (module_exists('locale')) {
                $languages = locale_language_list();
                $tsid = NULL;
                foreach ($languages as $langcode => $language) {
                  if (module_exists('title') && title_field_replacement_enabled('node', $node
                    ->get('type')
                    ->value(), 'title')) {
                    if (language_default('language') === $langcode) {
                      gathercontent_create_menu_link($node->nid
                        ->value(), $node->title
                        ->value(), $parent_menu_item, $langcode, $tsid);
                    }
                    else {
                      $title_field = title_field_replacement_info('node', 'title')['field']['field_name'];
                      gathercontent_create_menu_link($node->nid
                        ->value(), $node
                        ->language($langcode)->{$title_field}
                        ->value(), $parent_menu_item, $langcode, $tsid);
                    }
                  }
                  else {
                    gathercontent_create_menu_link($node->nid
                      ->value(), $node
                      ->language($langcode)->title
                      ->value(), $parent_menu_item, $langcode, $tsid);
                  }
                }
              }
            }
            else {
              gathercontent_create_menu_link($node->nid
                ->value(), $node->title
                ->value(), $parent_menu_item);
            }
          }
        }

        // Save metatags.
        if (module_exists('metatag') && metatag_entity_supports_metatags('node', $mapping->content_type)) {
          module_load_include('module', 'metatag');
          metatag_metatags_save('node', $node->nid
            ->value(), $node->vid
            ->value(), $metatags);
        }
        module_invoke_all('gathercontent_post_node_save', $node, $content, $files);
        $operation_item->status = "Success";
        $operation_item->nid = $node->nid
          ->value();
        entity_save('gathercontent_operation_item', $operation_item);
        return $node->nid
          ->value();
      } catch (\Exception $e) {
        watchdog('gathercontent_import', print_r($e, TRUE), array(), WATCHDOG_ERROR);
        $operation_item->status = "Operation failed:" . $e
          ->getMessage();
        entity_save('gathercontent_operation_item', $operation_item);
        return FALSE;
      }
    }
    else {
      $operation_item->status = "System error, please contact you administrator.";
      entity_save('gathercontent_operation_item', $operation_item);
      return FALSE;
    }
  }
  else {
    $operation_item->status = "Operation failed: Template not mapped.";
    entity_save('gathercontent_operation_item', $operation_item);
    return FALSE;
  }
}