Описание проблемы.
На сайте размещается информация о местах отдыха. У каждого места отдыха указывается регион и контактаная информация. Контактная инфорация скрыта для всех пользователей. Есть пользователи с ролью "Представитель", которые отвечают за тот или иной регион. Необходимо, чтобы эти представители видели контактную информацию тех мест отдыха, которые относятся к их регионам.
Решение.
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) {}
для того, чтобы одному "Представителю" можно было поставить в соответствие несколько регионов и при совпадении региона текущего места отдыха с любым из регионов "Представителя", контактная информация не скрывалась.
Отправить комментарий