Разработка

Как запретить пользователям редактирование собственных материалов?

О чём здесь?

Однажды понадобилось ограничить для некоторых пользователей редактирование собственных нод.
Для чего? Всё просто, появились «провинившиеся» пользователи и как меру наказания решили ввести запрет на редактирование собственных материалов.

Сразу зарегистрированные пользователи могу редактировать свои ноды, логично ввести роль, назовём её «наказанные» и по мере необходимости будем добавлять пользователям эту роль.

Кажется всё просто, но не тут то было.
Для того чтобы ввести ограничение на редактирование, нужно прибегнуть к дополнительным модулям. Например вот такой. Однако в моём случае нужен был лёгкий, не сильно функциональный, а главное простой модуль.

Посему родился сей костыль :)

function mymodule_menu_alter(&$items) {
  $items['node/%node/edit']['access callback'] = 'mymodule_access';
}
 
function mymodule_perm() {
  return array('denied edit own content');
}
 
function mymodule_access($op, $node, $account = FALSE) {
  if (!$account) {
    global $user;
    $account = $user;
  }
  $node_access = node_access($op, $node, $account);
 
  if ($op == 'update' && $node_access && $account->uid != 1) {
    return (user_access('denied edit own content', $account) && ($node->uid == $account->uid)) ? NULL : TRUE;
  }
  else {
    return $node_access;
  }
}

Код выше, запрещает редактирование собственных нод для роли с галочкой «denied edit own content»

Сильно не ругайте, очень уставший, если появились вопросы лучше спросите.
Всем спасибо.

 
 
02.06.2011 — 00:40

Комментарии (19)

Аватар пользователя Tester
02.06.2011 — 00:50
1
 
 

Отличное начало, под такой запрет что угодно можно подогнать -)

Аватар пользователя brainstorm
02.06.2011 — 00:53
1
 
 

предлагаю в hook_perm цикл по типам материалов. гибче будет.

Аватар пользователя chilic
02.06.2011 — 01:00
0
 
 

Возможно Вы правы, однако у меня была задача ограничить по роли.
Думаю многие смогут допилить под свои нужды, если нет постараюсь помочь.

Аватар пользователя Dan
02.06.2011 — 01:08
1
 
 

Ща мы тут по-быстрому модуль сварганим :)

Аватар пользователя Dan
02.06.2011 — 01:12
1
 
 

А вообще мне в друпале иногда ну очень не хватает что-то типа hook_user_access_alter, дабы изменить текущие разрешения, т.к. в друпале система контроля доступа не совсем гибкая — сложение разрешений есть, а «вычитаний», если можно так выразиться — нет (

Аватар пользователя Dan
02.06.2011 — 01:05
3
 
 

А если такой вариант:

<?php
 
function mymodule_perm() {
  return array('denied edit own content');
}
 
function mymodule_access($op, $node, $account) {
  global $user;
  if($node->uid == $user->uid && !user_access('administer nodes')){
    return !user_access('denied edit own content');
  }else{
    return node_access($op, $node, $account);
  }
}
?>

Аватар пользователя chilic
02.06.2011 — 01:07
0
 
 

Логично, спасибо за поправку.

Аватар пользователя ammbass
02.06.2011 — 04:02
0
 
 

Спасибо, очень полезно.

Аватар пользователя Ch
02.06.2011 — 05:48
1
 
 

Хм, а почему нельзя просто менять роль у «наказанных» пользователей?
«Редактировать свои материалы» для каждого типа нод уже есть в разрешениях.

Аватар пользователя annya
02.06.2011 — 07:58
1
 
 

Проблема в том, о чем говорит Dan здесь http://drupalsn.ru/blogs/development/247#comment-365
Если у пользователя есть 5-ролей, и хотя бы в одной есть разрешение на редактрирование своих нод, то пользователь сможет редактировать ноду в независимости от других пермишенов.

Просто поменять роль тоже не вариант, так как в других ролях могут быть настройки по другим пермишенам.

Аватар пользователя NaZg
02.06.2011 — 09:39
0
 
 

я не хочу вас огорчать, но всё придумано

Аватар пользователя annya
02.06.2011 — 09:46
0
 
 

В статье топикастера

Для того чтобы ввести ограничение на редактирование, нужно прибегнуть к дополнительным модулям. Например вот такой. Однако в моём случае нужен был лёгкий, не сильно функциональный, а главное простой модуль.

Аватар пользователя chilic
02.06.2011 — 16:35
-1
 
 

Не огорчили, просто почитайте что в посте написано.

Аватар пользователя iNFerNo
07.06.2011 — 07:50
-3
 
 

я не хочу вас огорчать, но всё придумано

так это лишь добавляет пользователей в конкретный материал для редактирования/удаление/обновления при условии, что роль не имеет этих возможностей.

А вопрос темы в другой, вася пупкин имеет роль там можно все, но он провинился и ему нужно запретить редактирование своего, при этом не трогая настройки роли которую он имеет…

Аватар пользователя iNFerNo
07.06.2011 — 08:05
-2
 
 

А вариант Den'а что именно делает? Ограничивает ко всему? В коде над его более понятнее, что
$op == 'update' — нельзя будет делать.

Аватар пользователя iNFerNo
07.06.2011 — 08:13
-2
 
 

А как можно запретить редактирование если установлен модуль node_access который дает добро. это надо ковырять модуль и прописывать условия своего модуля на запрет? Ааа?

Аватар пользователя iNFerNo
07.06.2011 — 10:03
-2
 
 

а еще есть же модуль Lock permissions

назначаешь роли (Наказанный) запреты ? Или это для другого?

Аватар пользователя annya
29.08.2011 — 16:03
0
 
 

Кстати, меня смущает использование hook_access(). В доке http://api.drupal.org/api/drupal/developer--hooks--node.php/function/hoo...
указано «This hook allows node modules to limit access to the node types they define.» — т.е. его можно использовать только для тех типов нод, которые созданы Вашим модулем. В Drupal 7 аналог этой функции hook_node_access() — его можно использовать для всех типов нод, в том числе тех которые модуль не создавал.

Аватар пользователя annya
29.08.2011 — 16:05
1
 
 

Для того случая что описал chilic возможно лучше подойдет hook_node_grants