ВопросСвязать словарь терминов с профилем пользователя.

Доброго дня. Суть такова : есть несколько профилей пользователей, один из них - компания. Есть словарь терминов Услуги. Термины добавляются вручную. В профиле компании есть поле типа Term reference, при создании компании юзер выбирает из списка какие услуги предоставляет его компания. В блоке выводятся все термины из словаря, дак вот мне надо, чтобы при выборе услуги из этого блока на странице выводились все компании предоставляющие эти услуги, то есть все профили. А как я понял, таксономия работает только с материалами. Для D6 есть модуль User Terms, а для D7 я похожего не нашел.(Сайт на D7) Возможно ли связать термины с профилем?
Надеюсь объяснил понятно.

Комментарии

Аватар пользователя Spleshka
Spleshka написал:

Интересная задача. Я не нашёл модуля который действительно с этим справляется, поэтому предлагаю кастомное решение: Написать свой модуль, который вклинивается в загрузку материалов на старнице /taxonomy/term/% и дописать вывод пользователей. Вот как это примерно будет выглядеть:

Сначала перекрываете вывод страницы своей функцией:

/**
 * Implements hook_menu_alter().
 */
function ИМЯМОДУЛЯ_menu_alter(&$items) {
  $items['taxonomy/term/%taxonomy_term']['page callback'] = 'ИМЯМОДУЛЯ_taxonomy_term_page';
}

Потом описываете стандартную функцию страницы для термина, но добавив кусочек своего кода:

/**
 * Menu callback; displays all nodes and users associated with a term.
 */
function ИМЯМОДУЛЯ_taxonomy_term_page($term) {
  // Build breadcrumb based on the hierarchy of the term.
  $current = (object) array(
    'tid' => $term->tid,
  );
 
  $breadcrumb = array();
  while ($parents = taxonomy_get_parents($current->tid)) {
    $current = array_shift($parents);
    $breadcrumb[] = l($current->name, 'taxonomy/term/' . $current->tid);
  }
  $breadcrumb[] = l(t('Home'), NULL);
  $breadcrumb = array_reverse($breadcrumb);
  drupal_set_breadcrumb($breadcrumb);
  drupal_add_feed('taxonomy/term/' . $term->tid . '/feed', 'RSS - ' . $term->name);
 
  $build = array();
  // Add term heading if the term has a description
  if (!empty($term->description)) {
    $build['term_heading'] = array(
      '#prefix' => '<div class="term-listing-heading">',
      '#suffix' => '</div>',
      'term' => taxonomy_term_view($term, 'full'),
    );
  }
 
  if ($nids = taxonomy_select_nodes($term->tid, TRUE, variable_get('default_nodes_main', 10))) {
    $nodes = node_load_multiple($nids);
    $build += node_view_multiple($nodes);
    $build['pager'] = array(
      '#theme' => 'pager',
      '#weight' => 5,
     );
  }
  elseif ($users = term_user_select_users($term->tid) {
    $build += $users;
  }
  else {
    $build['no_content'] = array(
      '#prefix' => '<p>',
      '#markup' => t('There is currently no content classified with this term.'),
      '#suffix' => '</p>',
    );
  }
  return $build;
}

Здесь был добавлен вот этот код:

  elseif ($users = term_user_select_users($term->tid) {
    $build += $users;
  }

Теперь вам осталось лишь реализовать функцию term_user_select_users() , которая должна вернуть массив со списком пользователей.

20.10.2011 19:25
Аватар пользователя Мусихерман
Мусихерман написал:

Я тоже склонялся к кастомному решению, но пока не добрался до программирования в друпале (изучаю меньше недели). Я так понимаю массив пользователей можно получить через db_query или есть стандартные функции?

20.10.2011 21:49
Аватар пользователя Spleshka
Spleshka написал:

Для вывода пользователей можно использовать функцию user_view(). А получить пользователя по термину таксономии - думаю да, db_query

20.10.2011 23:42
Аватар пользователя Мусихерман
Мусихерман написал:

Не сочтите за наглость, но не могли бы вы помочь с функцией term_user_select_users(). Всё-таки для первого раза сложновато, и посмотреть то некуда.

21.10.2011 15:10
Аватар пользователя Spleshka
Spleshka написал:

Как называется поле с терминами у юзера? Я напишу вам sql запрос.

21.10.2011 17:33
Аватар пользователя Мусихерман
Мусихерман написал:

field_profile_services

21.10.2011 17:40
Аватар пользователя Spleshka
Spleshka написал:
function term_user_select_users($tid) {
  $result = db_query('SELECT entity_id FROM {field_data_field_profile_services} WHERE field_profile_services_tid = :tid AND entity_type = "user"', array(':tid' => $tid));
  foreach ($result as $row) {
    $user = user_load($row->entity_id);
    $users[$user->name] = user_view($user);
  }
  return $users;
}

Вроде так. Я не тестировал, но по идее должно работать)

21.10.2011 19:19
Аватар пользователя Мусихерман
Мусихерман написал:

Я запрос такой же составил, но он ошибку выдавал, весь день искал причину.
И сомневался на счет user_load() и user_view(), но ход мыслей был правильный) Спасибо! Сейчас буду пробовать.

21.10.2011 19:48
Аватар пользователя Мусихерман
Мусихерман написал:

Еще такой вопрос. Как выводить только нужные поля профиля?
Сейчас при выборе термина выводится полный профиль пользователя со всеми полями, что не есть хорошо.
Кстати, из запроса пришлось убрать AND entity_type = "user", с ним выдавал ошибку что поля entity_type нет в таблице, хотя оно там есть.

25.10.2011 13:01
Аватар пользователя Spleshka
Spleshka написал:

Надо тогда в цикле заменить user_view на вывод действительно необходимых полей. Например, вот так выведется только имя пользователя со ссылкой на него:

foreach ($result as $row) {
  $user = user_load($row->entity_id);
  $users[$user->name] = l($user->name, 'user/' . $user->uid);
}

чтобы посмотреть все поля, доступные у пользователя, надо написать print_r($user); после user_load'a.

25.10.2011 14:15

Комментировать