如何以编程方式创建层次分类法drupal 7

时间:2014-09-18 11:18:48

标签: drupal drupal-7 drupal-taxonomy

我想使用自定义模块创建分层分类。 我使用taxonomy_get_vocabularyies()获得所有词汇表。

我的问题是当我选择任何词汇表或父母相关的孩子应该列在另一个选择列表/下拉列表中。

我的代码: -

enter code here

<?php
function student_addform($form, &$form_state) {

  $vocabulary = taxonomy_get_vocabularies();
  $checklist_vocab_array = array();
  foreach ($vocabulary as $item) {
    $vocab_vid = $item->vid;
    $vocab_name = $item->name;
    $checklist_vocab_array[$vocab_vid] = $vocab_name;
  }

  $form['vocabulary_list'] = array(
    '#type'             => 'select',
    '#title'            => t('List of current Classes.'),
    '#position'         => 'left' ,
    '#options'          => $checklist_vocab_array ,
    '#required' => TRUE,
    '#description'      => t('List of classes displayed as dropdown'),
    '#ajax' => array(
      'callback' => '_student_records_callback_fields',
      'wrapper' => 'check-box-replace',
      'effect' => 'fade',
      'event' => 'change' ,
    ),
  );

  $form['child-list'] = array(
    '#type' => 'select',
    '#title' => t('Select fields of'),
    'options' => $term_list,
    '#prefix' => '<div id="check-box-replace">',
    '#suffix' => '</div>',
  );

  return $form;
}

function _student_records_callback_fields($form, $form_state) {
  $term_list = array();
  $vocabulary_id = $form['vocabulary_list']['#value'];
  $terms = taxonomy_get_tree($vocabulary_id); // Use the correct vocabulary id.
  $count = count($terms);
  for ($term = 0 ; $term < $count ; $term++) {
    $term_list[$terms[$term]->vid] = $terms[$term]->name;
  }

  return $term_list;
}
?>

谢谢,

1 个答案:

答案 0 :(得分:0)

您应该始终在表单函数中创建表单元素,而不是在回调中 触发回调时,再次调用表单函数,允许您更改它。回调通常只返回表单元素 所以......

enter code here

<?php
function student_addform($form, &$form_state) {

  $vocabulary = taxonomy_get_vocabularies();
  $checklist_vocab_array = array();
  foreach ($vocabulary as $item) {
    $vocab_vid = $item->vid;
    $vocab_name = $item->name;
    $checklist_vocab_array[$vocab_vid] = $vocab_name;
  }

  $form['vocabulary_list'] = array(
    '#type'             => 'select',
    '#title'            => t('List of current Classes.'),
    '#position'         => 'left' ,
    '#options'          => $checklist_vocab_array ,
    '#required' => TRUE,
    '#description'      => t('List of classes displayed as dropdown'),
    '#ajax' => array(
      'callback' => '_student_records_callback_fields',
      'wrapper' => 'check-box-replace',
      'effect' => 'fade',
      'event' => 'change' ,
    ),
  );

  // Check if a vocabulary is selected, if it is get the children and populate the second  dropdown.

  //something like this.

  // $term_list = array();
  // if(vocabulary is selected){
  //   $term_list = term children
  // }

  // you should be able to check if a vocabulary is selected by checking the
  // $form_state['values'] or $form_state['input'] (I forget which)

  $form['child-list'] = array(
    '#type' => 'select',
    '#title' => t('Select fields of'),
    'options' => $term_list,
    '#prefix' => '<div id="check-box-replace">',
    '#suffix' => '</div>',
  );

  return $form;
}

function _student_records_callback_fields($form, $form_state) {
  return $form['child-list'];
}