From c1be7de96e88428089496fadd10efa00db3a9a09 Mon Sep 17 00:00:00 2001 From: Alex Barth <alex_b@53995.no-reply.drupal.org> Date: Sat, 19 Jun 2010 16:53:34 +0000 Subject: [PATCH] #623444 mongolito404, pvhee, pdrake, servantleader, alex_b et. al.: Mapper for link module. --- CHANGELOG.txt | 2 + mappers/link.inc | 84 +++++++++++++++++ tests/feeds_mapper_link.test | 177 +++++++++++++++++++++++++++++++++++ 3 files changed, 263 insertions(+) create mode 100644 mappers/link.inc create mode 100644 tests/feeds_mapper_link.test diff --git a/CHANGELOG.txt b/CHANGELOG.txt index a67b46e2..9f453cb7 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -3,6 +3,8 @@ Feeds 6.x 1.0 XXXXXXXXXXXXXXXXXXXX ---------------------------------- +- #623444 mongolito404, pvhee, pdrake, servantleader, alex_b et. al.: Mapper for + link module. - #652180 ronald_istos, rjbrown99, et. al.: Assign author of imported nodes. - #783098 elliotttf: Introduce hook_feeds_user_processor_targets_alter(), mapper for user profile fields. diff --git a/mappers/link.inc b/mappers/link.inc new file mode 100644 index 00000000..c1130949 --- /dev/null +++ b/mappers/link.inc @@ -0,0 +1,84 @@ +<?php +// $Id$ + +/** + * @file + * On behalf implementation of Feeds mapping API for link.module (CCK). + */ + +/** + * Implementation of hook_feeds_node_processor_targets_alter(). + */ +function link_feeds_node_processor_targets_alter($targets, $content_type) { + $info = content_types($content_type); + + $fields = array(); + if (isset($info['fields']) && count($info['fields'])) { + foreach ($info['fields'] as $field_name => $field) { + + if (in_array($field['type'], array('link'))) { + $name = isset($field['widget']['label']) ? $field['widget']['label'] : $field_name; + $targets[$field_name .':url'] = array( + 'name' => t('!field_name (URL)', array('!field_name' => $name)), + 'callback' => 'link_feeds_set_target', + 'description' => t('The URL for the CCK !name field of the node.', array('!name' => $name)), + ); + + //Provides a mapping target for the field title if used. + if (in_array($field['title'], array('optional', 'required'))) { + $targets[$field_name .':title'] = array( + 'name' => $name .' (' . t('title').')', + 'callback' => 'link_feeds_set_target', + 'description' => t('The title for the CCK !name field of the node.', array('!name' => $name)), + ); + } + } + } + } +} + +/** + * Callback for mapping to link field. + * + * @param $node + * Reference to the node object we are working on. + * @param $target + * The selected link CCK field. + * @param $value + * The value to assign to the CCK field. + */ +function link_feeds_set_target($node, $target, $value) { + if (!empty($value)) { + static $defaults = array(); + list($field_name, $sub_field) = split(':', $target); + + if (!isset($defaults[$node->type][$field_name])) { + $field = content_fields($field_name, $node->type); + $defaults[$node->type][$field_name]['attributes'] = $field['attributes']; + if (!in_array($field['title'], array('optional', 'required', 'none'))) { + $defaults[$node->type][$field_name]['title'] = $field['title_value']; + } + } + $field_data = isset($node->$field_name) ? $node->$field_name : array(); + + if (!is_array($value)) { + $value = array($value); + } + + $i = 0; + foreach ($value as $v) { + if ($v instanceof FeedsEnclosure) { + $v = $v->getValue(); + } + if (!isset($field_data[$i])) { + $field_data[$i] = $defaults[$node->type][$field_name]; + } + if ($sub_field != 'url' || (($v = link_cleanup_url($v)) && valid_url($v, true))) { + $field_data[$i][$sub_field] = $v; + } + $i++; + } + + $node->$field_name = $field_data; + } +} diff --git a/tests/feeds_mapper_link.test b/tests/feeds_mapper_link.test new file mode 100644 index 00000000..6155f393 --- /dev/null +++ b/tests/feeds_mapper_link.test @@ -0,0 +1,177 @@ +<?php +// $Id$ + +require_once(drupal_get_path('module', 'feeds') . '/tests/feeds_mapper_test.inc'); + +/** + * Class for testing Feeds <em>link</em> mapper. + */ +class FeedsMapperLinkTestCase extends FeedsMapperTestCase { + + public static function getInfo() { + return array( + 'name' => t('Mapper: Link'), + 'description' => t('Test Feeds Mapper support for Link CCK fields'), + 'group' => t('Feeds'), + ); + } + + /** + * Set up the test. + */ + public function setUp() { + // Call parent setup with the required module + parent::setUp( + 'devel', 'feeds', 'feeds_ui', 'ctools', 'content', 'link' + ); + + // Create user and login + $this->drupalLogin($this->drupalCreateUser( + array( + 'administer content types', + 'administer feeds', + 'administer nodes', + 'administer site configuration', + 'access devel information' + ) + )); + } + + /** + * Basic test loading a single entry CSV file. + */ + public function test() { + $static_title = $this->randomName(); + + // Create content type. + $typename = $this->createContentType(NULL, array( + 'alpha' => array( + 'type' => 'link', + 'settings' => array( + 'title' => 'required', + 'multiple' => '0', + ), + ), + 'beta' => array( + 'type' => 'link', + 'settings' => array( + 'title' => 'none', + 'multiple' => '0', + ), + ), + 'gamma' => array( + 'type' => 'link', + 'settings' => array( + 'title' => 'optional', + 'multiple' => '0', + ), + ), + 'omega' => array( + 'type' => 'link', + 'settings' => array( + 'title' => 'value', + 'title_value' => $static_title, + 'multiple' => '0', + ), + ), + )); + + //Create importer configuration + $this->createFeedConfiguration(); //Create a default importer configuration + $this->setSettings('syndication', 'FeedsNodeProcessor', array('content_type' => $typename)); //Processor settings + $this->addMappings('syndication', array( + array( + 'source' => 'title', + 'target' => 'title' + ), + array( + 'source' => 'timestamp', + 'target' => 'created' + ), + array( + 'source' => 'description', + 'target' => 'body' + ), + array( + 'source' => 'url', + 'target' => 'field_alpha:url' + ), + array( + 'source' => 'title', + 'target' => 'field_alpha:title' + ), + array( + 'source' => 'url', + 'target' => 'field_beta:url' + ), + array( + 'source' => 'url', + 'target' => 'field_gamma:url' + ), + array( + 'source' => 'title', + 'target' => 'field_gamma:title' + ), + array( + 'source' => 'url', + 'target' => 'field_omega:url' + ), + )); + + // Import RSS file. + $nid = $this->createFeedNode(); + // Assert 10 items aggregated after creation of the node. + $this->assertText('Created 10 '. $typename .' nodes.'); + + // Edit the imported node. + $this->drupalGet('node/2/edit'); + + $url = 'http://developmentseed.org/blog/2009/oct/06/open-atrium-translation-workflow-two-way-updating'; + $title = 'Open Atrium Translation Workflow: Two Way Translation Updates'; + $this->assertCCKFieldValue('alpha', array('url' => $url, 'static' => $title)); + $this->assertCCKFieldValue('beta', array('url' => $url)); + $this->assertCCKFieldValue('gamma', array('url' => $url, 'static' => $title)); + $this->assertCCKFieldValue('omega', array('url' => $url, 'static' => $static_title)); + + // Test the static title. + $this->drupalGet('node/2'); + $this->assertText($static_title, 'Static title link found.'); + + } + + /** + * Override parent::getFormFieldsNames(). + */ + protected function getFormFieldsNames($field_name, $index) { + if(in_array($field_name, array('alpha', 'beta', 'gamma', 'omega'))) { + $fields = array("field_{$field_name}[{$index}][url]"); + if (in_array($field_name, array('alpha', 'gamma'))) { + $fields[] = "field_{$field_name}[{$index}][title]"; + } + return $fields; + } + else { + return parent::getFormFieldsNames($field_name, $index); + } + } + + /** + * Override parent::getFormFieldsValues(). + */ + protected function getFormFieldsValues($field_name, $value) { + $field = content_fields($field_name); + if (in_array($field_name, array('alpha', 'beta', 'gamma', 'omega'))) { + if (!is_array($value)) { + $value = array('url' => $value); + } + $values = array($value['url']); + if (in_array($field_name, array('alpha', 'gamma'))) { + $values[] = isset($value['title']) ? $value['title'] : ''; + } + return $values; + } + else { + return parent::getFormFieldsValues($field_name, $index); + } + } +} -- GitLab