farmOS/modules/farm/farm_import/farm_import.feeds_importer_...

341 lines
9.2 KiB
PHP

<?php
/**
* @file
* Feeds importers provided by the farm import module.
*/
/**
* Implements hook_feeds_importer_default().
*/
function farm_import_feeds_importer_default() {
$export = array();
// Generate an importer for each asset type.
$asset_types = farm_asset_types();
foreach ($asset_types as $bundle => $type) {
// Generate importer.
$importer = farm_import_asset_importer($type);
// Add common field mappings.
farm_import_add_importer_fields('farm_asset', $bundle, $importer);
// Add it to the list.
$export['farm_asset_' . $bundle] = $importer;
}
// Generate an importer for each log type.
$log_types = log_types();
foreach ($log_types as $bundle => $type) {
// Generate importer.
$importer = farm_import_log_importer($type);
// Add common field mappings.
farm_import_add_importer_fields('log', $bundle, $importer);
// Add it to the list.
$export['log_' . $bundle] = $importer;
}
return $export;
}
/**
* Helper function for generating an asset importer.
*
* @param $asset_type
* The asset type entity.
*
* @return object
* Returns a feeds importer configuration object.
*
* @see farm_import_feeds_importer_default()
*/
function farm_import_asset_importer($asset_type) {
// Start with our common base importer.
$importer = farm_import_base_importer();
// Add the necessary information.
$importer->id = 'farm_asset_' . $asset_type->type;
$importer->config['name'] = 'Asset: ' . $asset_type->label;
$importer->config['description'] = 'Import ' . $asset_type->label . ' assets from CSV files.';
$importer->config['processor']['plugin_key'] = 'FarmAssetProcessor';
$importer->config['processor']['config']['bundle'] = $asset_type->type;
$importer->config['processor']['config']['mappings'] = array(
array(
'source' => 'Name',
'target' => 'name',
'unique' => FALSE,
'language' => 'und',
),
array(
'source' => 'Archived',
'target' => 'archived',
'unique' => FALSE,
'language' => 'und',
),
);
// Return the importer.
return $importer;
}
/**
* Helper function for generating a log importer.
*
* @param $log_type
* The log type entity.
*
* @return object
* Returns a feeds importer configuration object.
*
* @see farm_import_feeds_importer_default()
*/
function farm_import_log_importer($log_type) {
// Start with our common base importer.
$importer = farm_import_base_importer();
// Add the necessary information.
$importer->id = 'log_' . $log_type->type;
$importer->config['name'] = 'Log: ' . $log_type->label;
$importer->config['description'] = 'Import ' . $log_type->label . ' logs from CSV files.';
$importer->config['processor']['plugin_key'] = 'LogProcessor';
$importer->config['processor']['config']['bundle'] = $log_type->type;
$importer->config['processor']['config']['mappings'] = array(
array(
'source' => 'Done',
'target' => 'done',
'unique' => FALSE,
'language' => 'und',
),
array(
'source' => 'Date',
'target' => 'timestamp',
'unique' => FALSE,
'language' => 'und',
),
array(
'source' => 'Log name',
'target' => 'name',
'unique' => FALSE,
'language' => 'und',
),
);
// Return the importer.
return $importer;
}
/**
* Helper function for building a Feeds importer.
*
* @return object
* Returns a feeds importer object skeleton.
*/
function farm_import_base_importer() {
$feeds_importer = new stdClass();
$feeds_importer->disabled = FALSE; /* Edit this to true to make a default feeds_importer disabled initially */
$feeds_importer->api_version = 1;
$feeds_importer->config = array(
'fetcher' => array(
'plugin_key' => 'FeedsFileFetcher',
'config' => array(
'allowed_extensions' => 'txt csv tsv',
'delete_uploaded_file' => 0,
'direct' => 0,
'directory' => 'private://feeds',
'allowed_schemes' => array(
'public' => 'public',
'private' => 'private',
),
),
),
'parser' => array(
'plugin_key' => 'FeedsCSVParser',
'config' => array(
'delimiter' => ',',
'encoding' => 'UTF-8',
'no_headers' => 0,
),
),
'processor' => array(
'config' => array(
'author' => 0,
'authorize' => 1,
'insert_new' => '1',
'update_existing' => '0',
'update_non_existent' => 'skip',
'input_format' => 'plain_text',
'skip_hash_check' => 0,
'language' => 'und',
),
),
'content_type' => '',
'update' => 0,
'import_period' => '-1',
'expire_period' => 3600,
'import_on_create' => 1,
'process_in_background' => 0,
);
return $feeds_importer;
}
/**
* Add common field mappings to importers.
*
* @param $type
* The entity type.
* @param $bundle
* The asset bundle.
* @param $importer
* The importer configuration object that will be altered.
*/
function farm_import_add_importer_fields($type, $bundle, $importer) {
// If the importer doesn't have a mapping array for some reason, bail.
if (empty($importer->config['processor']['config']['mappings'])) {
return;
}
// Get field mappings, depending on the type.
switch ($type) {
case 'farm_asset':
$mappings = farm_import_asset_field_mappings();
break;
case 'log':
$mappings = farm_import_log_field_mappings();
break;
default:
$mappings = array();
}
// Add fields, if they exist on the bundle, or if they are "custom".
foreach ($mappings as $field => $mapping) {
if (!empty($mapping['real_field'])) {
$field = $mapping['real_field'];
}
if (!empty($mapping['custom']) || !empty(field_info_instance($type, $field, $bundle))) {
$importer->config['processor']['config']['mappings'][] = $mapping;
}
}
// Add Quantity field, if it exists. This is a bit more complicated because
// it is a field collection, so there are multiple targets.
if (!empty(field_info_instance($type, 'field_farm_quantity', $bundle))) {
$importer->config['processor']['config']['mappings'][] = array(
'source' => 'Quantity measure',
'target' => 'field_farm_quantity:field_farm_quantity_measure',
'unique' => FALSE,
'language' => 'und',
);
$importer->config['processor']['config']['mappings'][] = array(
'source' => 'Quantity value',
'target' => 'field_farm_quantity:field_farm_quantity_value',
'unique' => FALSE,
'language' => 'und',
);
$importer->config['processor']['config']['mappings'][] = array(
'source' => 'Quantity unit',
'target' => 'field_farm_quantity:field_farm_quantity_units',
'term_search' => '0',
'autocreate' => 1,
);
$importer->config['processor']['config']['mappings'][] = array(
'source' => 'Quantity label',
'target' => 'field_farm_quantity:field_farm_quantity_label',
'unique' => FALSE,
'language' => 'und',
);
}
}
/**
* Define field mapping that will be added to assets.
*
* @return array
* Returns an array of feeds importer mapping information, keyed by field
* machine names.
*/
function farm_import_asset_field_mappings() {
return array(
'field_farm_description' => array(
'source' => 'Description',
'target' => 'field_farm_description',
'format' => 'farm_format',
'unique' => FALSE,
'language' => 'und',
),
'field_farm_parent' => array(
'source' => 'Parent IDs',
'target' => 'field_farm_parent:etid',
'unique' => FALSE,
'language' => 'und',
),
'field_farm_parent_name' => array(
'source' => 'Parent names',
'target' => 'field_farm_parent:label',
'unique' => FALSE,
'language' => 'und',
'real_field' => 'field_farm_parent',
),
);
}
/**
* Define field mapping that will be added to logs.
*
* @return array
* Returns an array of feeds importer mapping information, keyed by field
* machine names.
*/
function farm_import_log_field_mappings() {
return array(
'field_farm_asset' => array(
'source' => 'Asset IDs',
'target' => 'field_farm_asset:etid',
'unique' => FALSE,
'language' => 'und',
),
'field_farm_asset_name' => array(
'source' => 'Asset names',
'target' => 'field_farm_asset:label',
'unique' => FALSE,
'language' => 'und',
'real_field' => 'field_farm_asset',
),
'farm_import_log_archive_assets' => array(
'source' => 'Archive assets',
'target' => 'farm_import_log_archive_assets',
'unique' => FALSE,
'language' => 'und',
'custom' => TRUE,
),
'field_farm_area' => array(
'source' => 'Areas',
'target' => 'field_farm_area',
'term_search' => '0',
'autocreate' => 1,
'unique' => FALSE,
'language' => 'und',
),
'field_farm_notes' => array(
'source' => 'Notes',
'target' => 'field_farm_notes',
'format' => 'farm_format',
'unique' => FALSE,
'language' => 'und',
),
'field_farm_log_category' => array(
'source' => 'Categories',
'target' => 'field_farm_log_category',
'term_search' => '0',
'autocreate' => 0,
'unique' => FALSE,
'language' => 'und',
),
);
}