From 48b9f61e2a05a91548bf00ed61b83394bcb67cca Mon Sep 17 00:00:00 2001 From: Franz Glauber Vanderlinde <franz.glauber@gmail.com> Date: Fri, 11 May 2012 21:35:28 -0300 Subject: [PATCH] =?UTF-8?q?Issue=20#1152940=20by=20bblake,=20rickmanelius,?= =?UTF-8?q?=20g089h515r806,=20darrylri,=20iMiksu,=20sdrycroft,=20johnbarcl?= =?UTF-8?q?ay,=20batje,=20axel.rutz,=20Ga=C3=ABlG:=20Feeds=20term=20import?= =?UTF-8?q?=20with=20hierarchy=20and=20weight?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/FeedsTermProcessor.inc | 103 +++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/plugins/FeedsTermProcessor.inc b/plugins/FeedsTermProcessor.inc index 28577a87..83183b05 100644 --- a/plugins/FeedsTermProcessor.inc +++ b/plugins/FeedsTermProcessor.inc @@ -54,8 +54,19 @@ class FeedsTermProcessor extends FeedsProcessor { /** * Saves a term. + * + * We de-array parent fields with only one item. + * This stops leftandright module from freaking out. */ protected function entitySave($term) { + if (isset($term->parent)) { + if (is_array($term->parent) && count($term->parent) == 1) { + $term->parent = reset($term->parent); + } + if (isset($term->tid) && ($term->parent == $term->tid || (is_array($term->parent) && in_array($term->tid, $term->parent)))) { + throw new FeedsValidationException(t("A term can't be its own child. GUID:@guid", array('@guid' => $term->feeds_item->guid))); + } + } taxonomy_term_save($term); } @@ -74,6 +85,7 @@ class FeedsTermProcessor extends FeedsProcessor { public function configDefaults() { return array( 'vocabulary' => 0, + 'force_update' => TRUE, ) + parent::configDefaults(); } @@ -93,6 +105,12 @@ class FeedsTermProcessor extends FeedsProcessor { '#options' => $options, '#default_value' => $this->config['vocabulary'], ); + $form['force_update'] = array( + '#type' => 'checkbox', + '#title' => t('Force update'), + '#description' => t('Force update of imported terms even if no data change. For import of <strong>term parents</strong> you need to import twice and set this in the second pass.'), + '#default_value' => $this->config['force_update'], + ); return $form; } @@ -105,6 +123,57 @@ class FeedsTermProcessor extends FeedsProcessor { } } + + /** + * Override setTargetElement to operate on a target item that is a term. + */ + public function setTargetElement(FeedsSource $source, $target_node, $target_element, $value) { + + switch ($target_element) { + case 'parent': + if (!empty($value)) { + $terms = taxonomy_get_term_by_name($value); + $parent_tid = ''; + foreach ($terms as $term) { + if ($term->vid == $target_node->vid) { + $parent_tid = $term->tid; + } + } + if (!empty($parent_tid)) { + $target_node->parent[] = $parent_tid; + } + else { + $target_node->parent[] = 0; + } + } + else { + $target_node->parent[] = 0; + } + break; + case 'parentguid': + // value is parent_guid field value + $query = db_select('feeds_item') + ->fields('feeds_item', array('entity_id')) + ->condition('entity_type', $this->entityType()); + $parent_tid = $query->condition('guid', $value)->execute()->fetchField(); + $target_node->parent[] = ($parent_tid) ? $parent_tid : 0; + + break; + case 'weight': + if (!empty($value)) { + $weight = intval($value); + } + else { + $weight = 0; + } + $target_node->weight = $weight; + break; + default: + parent::setTargetElement($source, $target_node, $target_element, $value); + break; + } + } + /** * Return available mapping targets. */ @@ -116,6 +185,21 @@ class FeedsTermProcessor extends FeedsProcessor { 'description' => t('Name of the taxonomy term.'), 'optional_unique' => TRUE, ), + 'parent' => array( + 'name' => t('Parent Term Name'), + 'description' => t('Name of the Parent Term.'), + 'optional_unique' => TRUE, + ), + 'parentguid' => array( + 'name' => t('Parent GUID'), + 'description' => t('The globally unique identifier of the item\'s parent term.'), + 'optional_unique' => TRUE, + ), + 'weight' => array( + 'name' => t('Term Weight'), + 'description' => t('Weight of the Term.'), + 'optional_unique' => TRUE, + ), 'description' => array( 'name' => t('Term description'), 'description' => t('Description of the taxonomy term.'), @@ -147,6 +231,12 @@ class FeedsTermProcessor extends FeedsProcessor { if ($tid = db_query("SELECT tid FROM {taxonomy_term_data} WHERE name = :name AND vid = :vid", array(':name' => $value, ':vid' => $vocabulary->vid))->fetchField()) { return $tid; } + } else if($target == 'guid') { + $query = db_select('feeds_item') + ->fields('feeds_item', array('entity_id')) + ->condition('entity_type', 'taxonomy_term'); + $tid = $query->condition('guid', $value)->execute()->fetchField(); + return ($tid) ? $tid : 0; } } return 0; @@ -163,4 +253,17 @@ class FeedsTermProcessor extends FeedsProcessor { } throw new Exception(t('No vocabulary defined for Taxonomy Term processor.')); } + + /** + * Override getHash() + * + * @return string + */ + protected function getHash($entity_id) { + if($this->config['force_update']) { + return ''; // dummy to always update + } else { + return parent::getHash($entity_id); + } + } } -- GitLab