Свой модуль user_referenced_taxonomy_terms Отображает при добавлении материала термины, к которым пользователь имеет доступ (доступ задаётся в поле термина таксономии)

Drupal: 

Такая задача возникла на многопользовательском Интернет-магазине. Продавцы (пользователи сайта) продают товары разных фирм. И каждый продавец может выставлять только товары разрешённых для него фирм (что задаёт админ). Для админа и редактора этот модуль не должен ничего ограничивать.

Задача: отображать на странице добавления товара для пользователя только те фирмы, к которым у него есть доступ. В поле Фирма материала типа товар будут выводиться не все термины словаря Марки, а только разрешённые.

Реализация: добавить к терминам таксономии поле типа EntityReference - ссылки на профили пользователей, которые могут добавлять товары фирмы. Написать хук hook_node_form_alter() в котором сделать недоступными и скрыть пункты поля Фирма.

user_referenced_taxonomy_terms.module
  1. /* BASE_FORM_ID : node_form */
  2. /* Displays only terms that have Entity Reference field with current user reference */
  3. //$form['field_firm']['und'][1551]= array('#access' => FALSE); //hides taxonomy term 1551
  4.  
  5. function user_referenced_taxonomy_terms_form_node_form_alter(&$form, &$form_state, $form_id) {
  6.  
  7. global $user;
  8. //if current user has roles administrator or editor return
  9. foreach ($user->roles as $role) {
  10. if (($role == 'administrator') || ($role == 'editor')) return;
  11. }
  12. if (isset($form['field_firm'])) {
  13. $query = new EntityFieldQuery();
  14. $term_entities = $query
  15. ->entityCondition('bundle', 'firms')
  16. ->entityCondition('entity_type', 'taxonomy_term', '=')
  17. ->fieldCondition('field_seller','target_id',$user->uid) // if user has access
  18. ->execute();
  19. if ($term_entities) {
  20. //forming array of firms using $term_entities array
  21. $items = array_keys($term_entities['taxonomy_term']);
  22. foreach ($form['field_firm']['und']['#options'] as $key=>$value) {
  23. if ($key == '_none') continue;
  24. $delete=true;
  25. for ($i=0;$i < count($items);$i++) {
  26. if ($key == $items[$i]) $delete = FALSE;
  27. }
  28. if ($delete) $form['field_firm']['und'][$key]= array('#access' => FALSE);
  29. }
  30. }else {
  31. //hide field firm if user has no access to any term
  32. $form['field_firm']['#access'] = FALSE;
  33. }
  34. }
  35. }

Анализ кода модуля

Использована функция EntityFieldQuery() из модуля Entity Reference. Эта функция позволяет обратиться к полю Продавцы в словаре Марки и выбрать тех продавцов (uid), которые присутствуют для каждого термина в этом поле.

Далее для каждого пункта в поле Фирма выясняется имеет ли текущий пользвоатель доступ к этому пунку. Если нет, то пункт скрывается. Если пользователь совсем не имеет доступа ни к одному элементу, то поле Фирма скрывается полностью.

Модули: