123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- <?php
- /**
- * @file
- * On behalf implementation of Feeds mapping API for file.module and
- * image.module.
- */
- /**
- * Implements hook_feeds_processor_targets().
- */
- function file_feeds_processor_targets($entity_type, $bundle_name) {
- $targets = array();
- foreach (field_info_instances($entity_type, $bundle_name) as $name => $instance) {
- $info = field_info_field($name);
- if (in_array($info['type'], array('file', 'image'))) {
- $targets[$name . ':uri'] = array(
- 'name' => t('@label: URI', array('@label' => $instance['label'])),
- 'callback' => 'file_feeds_set_target',
- 'description' => t('The URI of the @label field.', array('@label' => $instance['label'])),
- 'real_target' => $name,
- );
- // Keep the old target name for backwards compatibility, but hide it from
- // the UI.
- $targets[$name] = $targets[$name . ':uri'];
- $targets[$name]['deprecated'] = TRUE;
- if ($info['type'] == 'image') {
- $targets[$name . ':alt'] = array(
- 'name' => t('@label: Alt', array('@label' => $instance['label'])),
- 'callback' => 'file_feeds_set_target',
- 'description' => t('The alt tag of the @label field.', array('@label' => $instance['label'])),
- 'real_target' => $name,
- );
- $targets[$name . ':title'] = array(
- 'name' => t('@label: Title', array('@label' => $instance['label'])),
- 'callback' => 'file_feeds_set_target',
- 'description' => t('The title of the @label field.', array('@label' => $instance['label'])),
- 'real_target' => $name,
- );
- }
- elseif ($info['type'] === 'file') {
- $targets[$name . ':description'] = array(
- 'name' => t('@label: Description', array('@label' => $instance['label'])),
- 'callback' => 'file_feeds_set_target',
- 'description' => t('The description of the @label field.', array('@label' => $instance['label'])),
- 'real_target' => $name,
- );
- }
- }
- }
- return $targets;
- }
- /**
- * Callback for mapping file fields.
- */
- function file_feeds_set_target(FeedsSource $source, $entity, $target, array $values, array $mapping) {
- $language = $mapping['language'];
- // Add default of uri for backwards compatibility.
- list($field_name, $sub_field) = explode(':', $target . ':uri');
- $info = field_info_field($field_name);
- if ($sub_field == 'uri') {
- foreach ($values as $k => $v) {
- if (!($v instanceof FeedsEnclosure)) {
- if (is_string($v)) {
- $values[$k] = new FeedsEnclosure($v, file_get_mimetype($v));
- }
- else {
- // Set the value for FALSE rather than remove it to keep our deltas
- // correct.
- $values[$k] = FALSE;
- }
- }
- }
- if ($entity instanceof Entity) {
- $entity_type = $entity->entityType();
- $bundle = $entity->bundle();
- }
- else {
- $entity_type = $source->importer->processor->entityType();
- $bundle = $source->importer->processor->bundle();
- }
- $instance_info = field_info_instance($entity_type, $field_name, $bundle);
- // Determine file destination.
- // @todo This needs review and debugging.
- $data = array();
- if (!empty($entity->uid)) {
- $data[$entity_type] = $entity;
- }
- $destination = file_field_widget_uri($info, $instance_info, $data);
- }
- // Populate entity.
- $field = isset($entity->$field_name) ? $entity->$field_name : array($language => array());
- $delta = 0;
- foreach ($values as $v) {
- if ($info['cardinality'] == $delta) {
- break;
- }
- if (!isset($field[$language][$delta])) {
- $field[$language][$delta] = array();
- }
- switch ($sub_field) {
- case 'alt':
- case 'title':
- case 'description':
- $field[$language][$delta][$sub_field] = $v;
- break;
- case 'uri':
- if ($v) {
- try {
- $v->setAllowedExtensions($instance_info['settings']['file_extensions']);
- $field[$language][$delta] += (array) $v->getFile($destination);
- // @todo: Figure out how to properly populate this field.
- $field[$language][$delta]['display'] = 1;
- }
- catch (Exception $e) {
- watchdog('feeds', check_plain($e->getMessage()));
- }
- }
- break;
- }
- $delta++;
- }
- $entity->$field_name = $field;
- }
|