Jak dodać pole referencyjne terminu systematyki w niestandardowej formie drupala

9

Element menu jest definiowany drupal_get_formjako funkcja oddzwaniania i powrót formularza z funkcji oddzwaniania. Jak mogę dodać taxonomy_term_referencepole do tego formularza?

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

Nie jestem pewien, jak dodać pole dla taksonomii_term_referencji $form['mymodule_form']['tag']. Chcę, aby to pole było polem tekstowym z autouzupełnianiem z terminów słownictwa i dodawanym nowym terminem, gdy wprowadzony termin nie zostanie znaleziony

Srihitha Narra
źródło

Odpowiedzi:

5

W przypadku Drupala 7 kod jest mniej więcej taki, gdzie field_tagsjest pole taksonomii w węźle z autouzupełnianiem typu widżetu.

<?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
źródło
co pagerobi na końcu twojego kodu? szwy do mojego jak nieprawidłowy kod php?
FLY
To wydaje się tylko literówką. Wierzę, że możesz to bezpiecznie zignorować.
BrianV
Dzięki powyższej części kodu $ form otrzymuję pole taksonomii, które pojawia się w formularzu. Działa również funkcja autouzupełniania. Ale jak przechowywać przesłane wartości w polu taksonomii węzła? $submitted_tags = $form_state['values']['tags']; $node->field_tags[LANGUAGE_NONE][0]['value'] = $submitted_tags;nie działa dla mnie Daje mi tylko błędy.
deinqwertz
0

Musisz dołączyć identyfikator słownictwa - powinieneś być w stanie go też zakodować na stałe

$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 ...").')

);

lub dla 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 ...").')
);

Nie testowane, ale to powinno działać. W przeciwnym razie mamy tutaj podglądacza: http://drupal.org/node/854216

tecjam
źródło
Czy na pewno to działa również w przypadku D7? Nie mogłem tego uruchomić. Daje to wyjątek w
module
hmm, tak, to działa, ale nie dokładnie tak, jak powinno.
tecjam
1
To nie zadziała. Taksonomia_autocomplete Drupala 7 wymaga podania nazwy pola jako argumentu. W tym przykładzie użyto składni autouzupełniania taksonomii Drupala 6.
BrianV
0

Użyłem tego i dostałem oddzwaniające autouzupełnianie działające, jednak nie dla określonego słownika systematyki. Zamiast tego zwrócił wyniki ze wszystkich słowników

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

Nie jestem do końca pewien, dlaczego tak jest.

tecjam
źródło
Próbowałem podobnie i poniżej podano podany WYBÓR 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 PRZESUNIĘCIE 0; Tablica ([: db_condition_placeholder_0] = & gt;% imag%), a mysql daje wyjątek w pobliżu & # 039; \\ & # 039;) LIMIT OFFSET 0 & # 039;
Srihitha Narra
0

@ tecjam W przypadku Drupala 7 prawie go miałeś. Wszystko, co musisz zrobić, to użyć nazwy pola zamiast identyfikatora słownika.

Lubię to:

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

Zastąp nazwę_pola nazwą swojego pola.

Germán Villacreces
źródło