Доступ к полю по дате создания узла в Drupal с помощью CCK

Я ищу конкретное поведение, которое дает разрешение на просмотр одного или нескольких полей cck на основе даты и времени создания узла.

В частности мне нужно:

Предоставление роли A: Полный доступ ко всем CCK (старым и новым) Предоставление роли B: Доступ ко всем CCK, но ТОЛЬКО к тем, которые присутствуют в узле, старше 1 года. Анонимный пользователь: Нет доступа к полю CCK.

Как я могу получить этот результат?

4 ответа

Вы хотите контролировать разрешения на уровне поля, чтобы я не использовал hook_nodeapi() Вместо этого я бы предложил вам использовать hook_field_access (или используйте комбинацию hook_nodeapi а также hook_field_access()

пример в псевдокоде:

mymodule_hook_field_access($op, $field, $account = NULL, $node = NULL){

    if($field['field_name'] == 'field_xyz'){
        switch($op){
            case 'view':
                if($node->created was less than a year ago && $account role is A){
                   return FALSE;
                }

                if($node->created was less than a year ago && $account role is B){
                 return TRUE;
                }

                return FALSE;
                break;
            case 'edit':
                ...
                ...
        }    
    }

    return TRUE;
}

Смотрите, чтобы увидеть, как ловушка http://api.lullabot.com/content_access

hook_field_access() доступно в Drupal 6 из модуля CCK. В Drupal 7 это в ядре.

Я бы реализовал hook_nodeapi() в пользовательском модуле, и на $op == 'view' проверьте правильность типа узла и роли пользователя. В зависимости от роли я бы удалил соответствующую запись поля из массива `$node->content'.

Обратите внимание, что пользовательский модуль должен быть вызван после CCK, чтобы это работало, так как в противном случае поля CCK еще не доступны в массиве `$node->content'. Поэтому, в зависимости от его имени, может потребоваться изменить вес пользовательских модулей на значение, превышающее значение CCK.

Если ту же логику нужно применять и к формам редактирования узла, то можно сделать то же самое на $op == 'prepare',

Спасибо всем за предложения!

Hook_field_access() - это решение, которое я ищу.

Ранее я использовал $node->field_FIELDNAME[0]['#value'], но я не люблю вставлять в свою тему (или в template.php) функции для доступа пользователей. Была также проблема с тематикой, это решение не давало мне возможности для простого и чистого вывода HTML с использованием модуля Semantic CCK!

Еще раз спасибо! До свидания!

Ps. почему мой пост не после последнего??!!

Это просто, создайте node-{YOURTYPE}.tpl.php, создайте его тему и добавьте условия для отображения зависимости полей от дат...

Другие вопросы по тегам