Блог пользователя - vermix1

Доступ к узлам через profile_taxonomy

8 апреля 2010 в 10:10

[#42674]Проблему[/#] с доступом к нодам без использования ролей решил. Хотя, возможно, не лучшем образом - с использованием [module=hook_node_grants] и [module=hook_node_access_records]. Минус - таблица node_access может очень сильно разрастись. Плюс - как оказалось, очень простая реализация). Полноценный модуль пока не дописан, поэтому выложу только реализацию упомянутых хуков.

function profile_taxonomy_access_node_grants($account, $op) {
  $grants = array();
  //Через api profile_taxonomy получаем словарь,
  //термины которого ассоциированы с профилем
  //и поле профиля к которому привязан словарь
  $pt_assignments = profile_taxonomy_get_assignments();
  //profile_taxonomy может работать с несколькими полями профиля,
  //к которым привязаны разные словари, но мне пока нужно только одно такое поле.
  //Поле назвал "profile_location", словарь "Регионы"(vid=1).
  //Как освобожусь сделаю по-нормальному.
  $field = $pt_assignments[0]->field;
  $vid = $pt_assignments[0]->vid;
  //Подгружаем в объект $account данные из профиля
  profile_load_profile(&$account);
  //Если в профиле есть данные о регионе пользователя
  //пытаемся получить tid термина по vid и name. Если
  //эти данные отсутствуют, этот модуль не предоставляет
  //никакого доступа
  if ($account->$field && $vid) {
    $tid = db_result(db_query("SELECT tid FROM {term_data} WHERE (name='%s' AND vid=%d)", $account->$field, $vid));
  } else {
    return $grants;
  }
  //Идентификатор сеанса управления ресурсами узла (gid) для рег.представителей

Доступ к узлам через profile_taxonomy

8 апреля 2010 в 10:08

[#42674]Проблему[/#] с доступом к нодам без использования ролей решил. Хотя, возможно, не лучшем образом - с использованием [module=hook_node_grants] и [module=hook_node_access_records]. Минус - таблица node_access может очень сильно разрастись. Плюс - как оказалось, очень простая реализация). Полноценный модуль пока не дописан, поэтому выложу только реализацию упомянутых хуков.

function profile_taxonomy_access_node_grants($account, $op) {
  $grants = array();
  //Через api profile_taxonomy получаем словарь,
  //термины которого ассоциированы с профилем
  //и поле профиля к которому привязан словарь
  $pt_assignments = profile_taxonomy_get_assignments();
  //profile_taxonomy может работать с несколькими полями профиля,
  //к которым привязаны разные словари, но мне пока нужно только одно такое поле.
  //Поле назвал "profile_location", словарь "Регионы"(vid=1).
  //Как освобожусь сделаю по-нормальному.
  $field = $pt_assignments[0]->field;
  $vid = $pt_assignments[0]->vid;
  //Подгружаем в объект $account данные из профиля
  profile_load_profile(&$account);
  //Если в профиле есть данные о регионе пользователя
  //пытаемся получить tid термина по vid и name. Если
  //эти данные отсутствуют, этот модуль не предоставляет
  //никакого доступа
  if ($account->$field && $vid) {
    $tid = db_result(db_query("SELECT tid FROM {term_data} WHERE (name='%s' AND vid=%d)", $account->$field, $vid));
  } else {
    return $grants;
  }
  //Пдентификатор сеанса управления ресурсами узла (gid) для рег.представителей

[РЕШЕНО] Нестандартный доступ к нодам по таксономии

7 апреля 2010 в 3:20

Здравствуйте. Имеется следующая задача - необходимо сделать разграничение доступа к материалам сайта не совсем стандартным образом.

У организации имеются представительства в 64 регионах. Нужно сделать так, чтобы региональные представители имели доступ(на просмотр) только к материалам своего региона (редко еще нескольких). Может быть и ситуация когда одна нода доступна сразу для представителей нескольких регионов. Кроме этих материалов имеются и общедоступные. Для каждого региона нужно назначить регионального модератора, который будет добавлять, редактировать и удалять региональные материалы. Все это нужно сделать без привязки к типу материала.

Думал в следующем направлении: заводится словарь со списком регионов("Регионы"), к нодам добавляются термины из этого словаря(названия регионов). Потом с помощью модуля [module=profile_taxonomy] эти же термины приписываются к профилям пользователей. Указать что пользователь является региональным модератором можно и через роли.

Собственно проблема:
Как сделать так, чтобы ноды с терминами из словаря "Регионы" были доступны только пользователям, в профилях которых был указан соответствующий регион. Можно конечно в ядро залезть, но не хочется. Может кто-нибудь знает как для этого [ru-api=hook_nodeapi] приспособить?

Были и другие мысли, но: