Cómo agregar un campo de referencia de término de taxonomía en un formulario drupal personalizado

9

Un elemento de menú se define con la drupal_get_formfunción de devolución de llamada y devuelve el formulario desde la función de devolución de llamada. ¿Cómo puedo agregar un taxonomy_term_referencecampo a este formulario?

$items['files/add'] = array(
      'title' => 'Add file',
      'description' => 'Allows users to add files',
      'type' => MENU_CALLBACK,
      'page callback' => 'drupal_get_form',
      'page arguments' => array('mymodule_add_file'),
      'access callback' => TRUE,
    );
function mymodule_add_file($form, &$form_state) {
    drupal_set_title("Add file");
    $form['mymodule_form'] = array(
      '#type' => 'fieldset',
      '#tree' => TRUE,
      '#collapsable' => FALSE,
      '#title' => 'Adding file to locker room',
    );

    $form['mymodule_form']['file'] = array(
      '#type' => 'managed_file',
      '#title' => 'Upload file',      
    );

    $form['mymodule_form']['tag'] = array(
      '#type' => 'taxonomy_term_reference',
      '#title' => 'Tags',
    );  

    return $form;
}

No estoy seguro de cómo agregar el campo taxonomy_term_reference para $form['mymodule_form']['tag']. Quiero que este campo sea un campo de texto con autocompletar a partir de términos de vocabulario y que se agregue un nuevo término cuando no se encuentre el término ingresado

Srihitha Narra
fuente

Respuestas:

5

Para Drupal 7, el código es algo como esto, donde field_tagshay un campo de taxonomía en el nodo con tipo de widget autocompletado.

<?php
   $node=node_load($nid);
    $tags = array();
    foreach ($node->field_tags['und'] as $item) {
      $tags[$item['tid']] = isset($item['taxonomy_term']) ?  $item['taxonomy_term'] : taxonomy_term_load($item['tid']);
    }
    $form['tags'] = array(
      '#type' => 'textfield',
      '#default_value' => taxonomy_implode_tags($tags),
      '#title' => 'Add Tags',
      '#autocomplete_path' => 'taxonomy/autocomplete/field_tags',
      '#maxlength' => 1024,
      '#element_validate' => array('taxonomy_autocomplete_validate')
    );
?>
jibran
fuente
¿Qué está pagehaciendo al final de su código? parece a mi código php no válido?
VUELO
Eso parece ser solo un error tipográfico. Puedes ignorarlo con seguridad, creo.
BrianV
Con la parte $ del código anterior, obtengo el campo de taxonomía para que aparezca en el formulario. El autocompletado también funciona. Pero, ¿cómo almaceno los valores enviados en el campo de taxonomía de un nodo? $submitted_tags = $form_state['values']['tags']; $node->field_tags[LANGUAGE_NONE][0]['value'] = $submitted_tags;no funciona para mi Solo me da errores.
deinqwertz
0

Debes incluir el id. De vocabulario; deberías poder codificarlo para que

$form['mymodule_form']['tag'][$vocabulary->vid] = array(
  '#type' => 'textfield',
  '#default_value' => $typed_string,
  '#maxlength' => 100,
  '#autocomplete_path' => 'taxonomy/autocomplete/'. $vocabulary->vid,
  '#required' => $vocabulary->required,
  '#title' => $vocabulary->name,
  '#description' => t('Some description ...").')

);

o para vocab id 5

$form['mymodule_form']['tag']['5'] = array(
  '#type' => 'textfield',
  '#default_value' => $typed_string,
  '#maxlength' => 100,
  '#autocomplete_path' => 'taxonomy/autocomplete/5',
  '#required' => $vocabulary->required,
  '#title' => $vocabulary->name,
  '#description' => t('Some description ...").')
);

No probado, pero eso debería funcionar. De lo contrario, eche un vistazo aquí: http://drupal.org/node/854216

tecjam
fuente
¿Estás seguro de que esto también funciona para D7? No pude hacerlo funcionar. Da excepción en taxonomy.module
Srihitha Narra
hmm, sí, funciona, pero no exactamente como debería.
tecjam
1
Esto no funcionara. Taxonomy_autocomplete de Drupal 7 requiere que se pase un nombre de campo como argumento. Este ejemplo utiliza la sintaxis autocompletada de taxonomía de Drupal 6.
BrianV
0

Utilicé esto y obtuve devoluciones de llamada de autocompletar, sin embargo, no para el vocabulario de taxonomía especificado. En cambio, arrojó resultados de todos los vocabulario

  $element['test'] = array(
      '#type' => 'textfield',
      '#default_value' => isset($items[$delta]['test']) ? $items[$delta]['test'] : NULL,
      '#maxlength' => 100,
      '#autocomplete_path' => 'taxonomy/autocomplete/37',
   );

No estoy muy seguro de por qué eso es ser honesto.

tecjam
fuente
Lo intenté de manera similar y a continuación se da la excepción SELECT t.tid AS tid, t.name AS name FROM {taxonomy_term_data} t WHERE (t.vid IN ()) AND t.name LIKE: db_condition_placeholder_0 ESCAPE & # 039; \\ & # 039;) LIMIT 10 OFFSET 0; Array ([: db_condition_placeholder_0] = & gt;% imag%) y mysql está dando una excepción cerca de & # 039; \\ & # 039;) LIMIT OFFSET 0 & # 039;
Srihitha Narra
0

@tecjam Para Drupal 7, casi lo tienes. Todo lo que tiene que hacer es usar el nombre del campo en lugar de la identificación del vocabulario.

Me gusta esto:

 $element['test'] = array(
 '#type' => 'textfield',
  '#default_value' => isset($items[$delta]['test']) ? $items[$delta]['test'] : NULL,
  '#maxlength' => 100,
  '#autocomplete_path' => 'taxonomy/autocomplete/field_name',
);

Reemplace field_name con el nombre de su campo.

Germán Villacreces
fuente