CMS Drupal

Описание проблемы.
На сайте размещается информация о местах отдыха. У каждого места отдыха указывается регион и контактаная информация. Контактная инфорация скрыта для всех пользователей. Есть пользователи с ролью "Представитель", которые отвечают за тот или иной регион. Необходимо, чтобы эти представители видели контактную информацию тех мест отдыха, которые относятся к их регионам.

Решение.
CCK, конечно, дает возможность назначать права на каждое поле каждой роли. Но в данном случае у нас поле одно: "field_profile_region". И нам необходимо скрыть поля с контактной информацией не просто для какой-то роли, но скорее для пользователя, по условию совпадения регионов. Может быть существуют у CCK хуки, с помощью которых можно менять отображение полей, но я что-то не нашел. (Может плохо искал.) Я пошел другим, уже проверенным путем, прибегнув к хуку nodeapi.
Предварительно, в разрешениях пользователей, я выставил доступность просмотра контактной информации (полей с контактной информацией) для роли "Представитель", а потом уже в функции alex_module_nodeapi() скрывал поля по вышеописанному условию. Замечу, что описание места отдыха я делал с использованием модуля content_profile.
Вот что получилось:

function alex_module_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  global $user;
  if ($node->type == 'profile') {
    switch ($op) {
      case 'view':
        $content_types = array_keys(content_types());
        if (content_types($node->type)) {
          if (in_array('Представитель',$user->roles)) {
            // Для представителя скроем контакты не относящихся к нему мест отдыха
            $is_predst = false;
            $reg_rest = $node->field_profile_region[0]['value'];
 
            if (!empty($reg_rest)) {
              if ($node_profile = content_profile_load('profile', $user->uid)) {
                $regs_predst = $node_profile->field_predst_region;
                foreach($regs_predst as $reg_predst) {
                  if ($reg_predst['value'] == $reg_rest) {
                    $is_predst = true;
                    break;
                  }
                }
              }
            }
            if (!$is_predst) {
              unset($node->field_firm_phone);
              unset($node->field_firm_site);
              unset($node->field_firm_fax);
              unset($node->field_address);
            }
          }
        }
        break;
    }
  }
}

Цикл:
foreach($regs_predst as $reg_predst) {}
для того, чтобы одному "Представителю" можно было поставить в соответствие несколько регионов и при совпадении региона текущего места отдыха с любым из регионов "Представителя", контактная информация не скрывалась.

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <1c7>, <drupal5>, <drupal6>, <javascript>, <php>. Beside the tag style "<foo>" it is also possible to use "[foo]".