2011-02-13 17 views
5

Tengo un script que crea con éxito nuevos nodos. Pero tengo problemas para configurar la taxonomía antes de guardar.Drupal 7 - Insertar taxonomía en el objeto nodo

Creo en Drupal 6 Usaría este método.

$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); 

Creo que en Drupal 7 Me gustaría hacer esto (mi nombre de campo es Catálogo)

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

taxonomy_get_term_by_name no parece devolver el objeto correcto para insertar en el objeto nodo.

Si alguien puede arrojar algo de luz, apreciado.

Gracias

EDIT

Solución:

// 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']; 
    } 
} 

Respuesta

4

A continuación se muestra un código rápido y sucio-Recientemente he usado para importar nodos "comando" en un sitio. A mitad de camino, el ciclo foreach se encarga de crear y asignar términos, según sea necesario.

 $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); 
+0

¡Gracias! Actualicé la publicación que muestra la solución que utilicé gracias a tu ejemplo, ¡salud! –

1

Aquí está, este código agrega correctamente un nuevo término al nodo antes de que se cree el nodo.

$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

Tal vez mi experiencia es única, pero he encontrado que el uso de

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

provocó un error.

Descubrí que después de guardar $ term, no hay necesidad de recuperar el término recién creado.

El objeto $ term se actualiza para incluir el nuevo tid.

0

Cualquier respuesta que use LANGUAGE_NONE o 'und' para alterar un campo no es la forma correcta de hacerlo, ya que supone que el sitio drupal es un idioma. La forma correcta de editar un campo es usar 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(); 
Cuestiones relacionadas