0

I have a term reference field which has the widget Autocomplete term widget (tagging). I want the functionality like, when a user type a child term in that autocomplete field, the system should return a suggestion of the parent term that did you mean [parent term].

Suppose A is a parent term and its child term is B. So when a user type B in the field, it should show a suggestion of did you mean A?

0

I think you'll need to override the taxonomy autocomplete path. Here's what you will need:

  1. hook_menu_alter() implementation, so your custom module takes over the taxonomy autocomplete suggestions. See hook_menu() implementation, specifically $item['taxonomy/autocomplete'] item in /modules/taxonomy/taxonomy.module for more information.
  2. You'll need to re-create the core taxonomy_autocomplete() function, which is in /modules/taxonomy/taxonomy.pages.inc.
  3. You'll have to perform a check and see for which vocabulary you need to show suggestions:
    • If it's the vocabulary where you want to have child -> parent functionality, add the code for fetching the parent term and provide additional suggestions.
    • If it's some other vocabulary, make sure you return the same output as the core function would.

You'll need to add this in a custom module.

function YOUR_MODULE_menu_alter(&$items) {
  // This will re-route this path to your custom module, so you can have any
  // additional logic.
  $items['taxonomy/autocomplete']['page callback'] = 'YOUR_MODULE_taxonomy_autocomplete';
}

function YOUR_MODULE_taxonomy_autocomplete($field_name = '', $tags_typed = '') {
  // Copy the content of taxonomy_autocomplete() function here, and add necessary
  // modifications at the end of it.
}

Hope this helps.

1
  • I'm already here :-). But doesn't know what to do hear :-(
    – Ahmad
    Mar 3 '16 at 7:54
0

You can use below code for computing the parent.

function demo_pane_taxonomy_autocomplete($field_name = '', $tags_typed = '') {
  // Copy the content of taxonomy_autocomplete() function here, and add necessary
  // modifications at the end of it.

  // If the request has a '/' in the search text, then the menu system will have
  // split it into multiple arguments, recover the intended $tags_typed.
  $args = func_get_args();
  // Shift off the $field_name argument.
  array_shift($args);
  $tags_typed = implode('/', $args);

  // Make sure the field exists and is a taxonomy field.
  if (!($field = field_info_field($field_name)) || $field['type'] !== 'taxonomy_term_reference') {
    // Error string. The JavaScript handler will realize this is not JSON and
    // will display it as debugging information.
    print t('Taxonomy field @field_name not found.', array('@field_name' => $field_name));
    exit;
  }

  // The user enters a comma-separated list of tags. We only autocomplete the last tag.
  $tags_typed = drupal_explode_tags($tags_typed);
  $tag_last = drupal_strtolower(array_pop($tags_typed));

  $term_matches = array();
  if ($tag_last != '') {

    // Part of the criteria for the query come from the field's own settings.
    $vids = array();
    $vocabularies = taxonomy_vocabulary_get_names();
    foreach ($field['settings']['allowed_values'] as $tree) {
      $vids[] = $vocabularies[$tree['vocabulary']]->vid;
    }

    $query = db_select('taxonomy_term_data', 't');
    $query->join('taxonomy_term_hierarchy', 'h', 't.tid=h.tid');
    $query->addTag('translatable');
    $query->addTag('term_access');

    // Do not select already entered terms.
    if (!empty($tags_typed)) {
      $query->condition('t.name', $tags_typed, 'NOT IN');
    }
    // Select rows that match by term name.
    $tags_return = $query
      ->fields('t', array('tid', 'name'))
      ->fields('h', array('parent'))
      ->condition('t.vid', $vids)
      ->condition('t.name', '%' . db_like($tag_last) . '%', 'LIKE')
      ->range(0, 10)
      ->execute()
      ->fetchAll();

      $tags_new_return = array();
      $parent_array = array();

      foreach($tags_return as $tag_key=>$tag_val) {
        if($tag_val->parent != 0) {
          $parent_array[] = $tag_val->parent;
        }
      }

      unset($tags_return);
    $query_1 = db_select('taxonomy_term_data', 't1');
    $query_1->addTag('translatable');
    $query_1->addTag('term_access');

    // Do not select already entered terms.
    if (!empty($tags_typed)) {
      $query->condition('t.name', $tags_typed, 'NOT IN');
    }
    // Select rows that match by term name.
    $tags_return = $query_1
      ->fields('t1', array('tid', 'name'))
      ->condition('t1.tid', $parent_array, 'IN')
      ->range(0, 10)
      ->execute()
      ->fetchAllKeyed();

    $prefix = count($tags_typed) ? drupal_implode_tags($tags_typed) . ', ' : '';

    foreach ($tags_return as $tid => $name) {
      $n = $name;
      // Term names containing commas or quotes must be wrapped in quotes.
      if (strpos($name, ',') !== FALSE || strpos($name, '"') !== FALSE) {
        $n = '"' . str_replace('"', '""', $name) . '"';
      }
      $term_matches[$prefix . $n] = check_plain($name);
    }
  }

  drupal_json_output($term_matches);
}

Be sure to apply the check of field_name in it, I have not applied that check.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.