Drupal 7 - вставка таксономии в объекте узла - PullRequest
5 голосов
/ 13 февраля 2011

У меня есть скрипт, который успешно создает новые узлы.Но у меня возникают проблемы с настройкой таксономии перед сохранением.

Я верю в Drupal 6, я бы использовал этот метод.

$cat1_tid = taxonomy_get_term_by_name($data[$i]['cat1']);
$cat2_tid = taxonomy_get_term_by_name($data[$i]['cat2']);
$cat3_tid = taxonomy_get_term_by_name($data[$i]['cat3']);
$node->taxonomy = array($cat1_tid, $cat2_tid, $cat3_tid);

Я думаю, что в Drupal 7 я бы сделал это (мое полеимя - это каталог)

$node->taxonomy_catalog['und'][0] = array($term1Obj, $term2Obj);

таксономия_таконом_исследования_не видимо не возвращает правильный объект для вставки в объект узла.

Если кто-то может пролить немного света, приветствуется.

Спасибо

РЕДАКТИРОВАТЬ

Решение:

// Taxonomy
$categories = array($data[$i]['cat1'], $data[$i]['cat2'], $data[$i]['cat3']);
foreach ($categories as $key => $category) {
  if ($term = taxonomy_get_term_by_name($category)) {
    $terms_array = array_keys($term);
    $node->taxonomy_catalog[LANGUAGE_NONE][$key]['tid'] = $terms_array['0'];
  }   
} 

Ответы [ 4 ]

4 голосов
/ 13 февраля 2011

Ниже приведен быстрый и грязный код, который я недавно использовал для импорта «командных» узлов на сайт.На полпути цикл foreach заботится о создании и назначении терминов по мере необходимости.

      $command = new stdClass;
      $command->language = LANGUAGE_NONE;
      $command->uid = 1;
      $command->type = 'drubnub';
      $command->title = $line['0'];
      $command->body[LANGUAGE_NONE]['0']['value'] = $line['1'];
      $command->url[LANGUAGE_NONE]['0']['value'] = trim($line['2']);
      $command->uses[LANGUAGE_NONE]['0']['value'] = $line['3'];
      $tags = explode(',', $line['4']);
      foreach ($tags as $key => $tag) {
        if ($term = taxonomy_get_term_by_name($tag)) {
          $terms_array = array_keys($term);
          $command->field_tags[LANGUAGE_NONE][$key]['tid'] = $terms_array['0'];
        } else {
          $term = new STDClass();
          $term->name = $tag;
          $term->vid = 1;
          if (!empty($term->name)) {
            $test = taxonomy_term_save($term);
            $term = taxonomy_get_term_by_name($tag);
            foreach($term as $term_id){
              $command->product_tags[LANGUAGE_NONE][$key]['tid'] = $term_id->tid;
          }
            $command->field_tags[LANGUAGE_NONE][$key]['tid'] = $tid;
          }
        }
      }
      node_save($command);
1 голос
/ 18 августа 2011

Вот этот код успешно добавляет новый термин в узел перед созданием узла.

$my_term_name = 'micky';
    $term_array = taxonomy_get_term_by_name($my_term_name);
    if($term_array == array()){
        //empty term ..
        $term->name = $my_term_name;
        $term->vid = 1;
    taxonomy_term_save($term);
    $term_array = taxonomy_get_term_by_name($my_term_name); 
    }
    //get the first index of the array .
    foreach ($term_array as $tid => $term_object)break;
    $node->field_tag['und'][$tid] = (array)$term_object;
0 голосов
/ 10 мая 2017

Любой ответ, использующий LANGUAGE_NONE или 'und' для изменения поля, не является правильным способом сделать это, поскольку он предполагает, что сайт drupal является одним языком.Правильный способ редактирования поля - использовать entity_metadata_wrapper.

$node_wrapper = entity_metadata_wrapper('node', $node);

// If you have Entity API [entity] module installed you can simply.
$node_wrapper = $node->wrapper();

// It is good practice to check the terms in the field before adding
// a new one to make sure that the term is not already set.
$term_ids_current = $node_wrapper->taxonomy_catalog->raw();
if (!in_array($term_new_id, $term_ids_current)) {
  $node_wrapper->taxonomy_catalog[] = $term_new_id;
}

// To add multiple terms iterate an array or terms ids.
$term_ids_current = $node_wrapper->taxonomy_catalog->raw();
$tern_new_ids = array(1, 2, 3);
foreach ($term_new_ids as $term_new_id) {
  if (!in_array($term_new_id, $term_ids_current)) {
    $node_wrapper->taxonomy_catalog[] = $term_new_id;
  }
}

// To remove a term.
$term_ids_current = $node_wrapper->taxonomy_catalog->raw();
$delta = array_search($term_remove_id, $term_ids_current);
if (is_int($delta)) {
  $node_wrapper->taxonomy_catalog->offsetUnset($delta);
}

// To replace all terms.
$term_new_ids = array(1, 2, 3);
$node_wrapper->taxonomy_catalog->set($term_new_ids);

// To get all the fully loaded terms in a field.
$terms = $node_wrapper->taxonomy_catalog->value();

// At the end make sure to save it.
$node_wrapper->save();
0 голосов
/ 15 июля 2012

Возможно, мой опыт уникален, но я обнаружил, что при использовании

$term = taxonomy_get_term_by_name($tag)
$tid = $term->tid;

вызвало ошибку.

Я обнаружил, что после сохранения $ term нет необходимости извлекать вновь созданный термин.

Объект $ term обновлен, чтобы включить новый tid.

...