Снятие с публикации после редактирования новости

Главные вкладки

Аватар пользователя sozdatel sozdatel 2 мая 2010 в 12:09

Доброго времени суток!
Подскажите какой есть модуль для снятия новости с публикации после ее редактирования? Если такой вопрос уже обсуждался буду очень рад увидеть ссылку на это обсуждение самому найти не удалось Sad
Пробовал через Workflow и Rules но что-то не получилось, может уже готовый модуль есть для таких целей?

Комментарии

Аватар пользователя NurOff NurOff 2 мая 2010 в 12:54

При редектировании прежде чем сохранить, посмотрите чуть выше кнопки submit.
Что - нибудь похожее на "Публикация" убирайте(ставьте) галочки...(там около трех полей)
Елси этих полей нет, значит администратор сайта в доступах вам не разрешает этих действий.

Аватар пользователя sozdatel sozdatel 2 мая 2010 в 15:23

Не совсем то, нужно чтоб автоматичеки новость снималась с публикации после ее редактирования. Но всеравно спасибо за активную помощь. Какие еще есть варианты?

Аватар пользователя sozdatel sozdatel 2 мая 2010 в 21:23

Чтоб в rules сделать подобное, рецептик есть, мучаюсь целый день ничего толкового не выходит Sad
И еще не по теме где можно почитать как работать с rules?

Аватар пользователя Sinkora Sinkora 2 мая 2010 в 21:45

"sozdatel" wrote:
Чтоб в rules сделать подобное, рецептик есть, мучаюсь целый день ничего толкового не выходит :(

через hook_nodeapi это делается за несколько минут.

Аватар пользователя sozdatel sozdatel 2 мая 2010 в 22:24

Sinkora wrote:
через hook_nodeapi это делается за несколько минут.

А примерчик можно как это реализовать думаю многим будет интерестно...

Аватар пользователя Sinkora Sinkora 2 мая 2010 в 22:39

"sozdatel" wrote:
А примерчик можно как это реализовать думаю многим будет интерестно...

Ок. Только через несколько часиков, сейчас занят.

Аватар пользователя sozdatel sozdatel 2 мая 2010 в 23:22

Sinkora wrote:
"sozdatel" wrote:
А примерчик можно как это реализовать думаю многим будет интерестно...

Ок. Только через несколько часиков, сейчас занят.

Спасибо бедем ждать. Радует что есть такие люди, которые готовы оказать помощь Smile

Аватар пользователя Sinkora Sinkora 3 мая 2010 в 5:55

В файл mymodule.module своего модуля mymodule вставьте эту функцию:

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  if ($op == 'update') {
    if (!user_access('administer nodes') && $node->status) {
      db_query('UPDATE {node} SET status = 0 WHERE nid = %d', $node->nid);
    }
  }    
}

Обновите кеш меню. Если пользователь не имеет права 'administer nodes', то после редактирования материал будет сниматься с публикации.

Этот пример работает со всеми типами нод. Если нужно для конкретных типов (например, news, blog), тогда это нужно указать в условии:

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  if ($op == 'update') {
    //Массив типов узлов, для которых делаем хук
    $node_types = array('news', 'blog');
    if (in_array($node->type, $node_types) && !user_access('administer nodes') && $node->status) {
      db_query('UPDATE {node} SET status = 0 WHERE nid = %d', $node->nid);
    }
  }    
}

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

Аватар пользователя Sinkora Sinkora 3 мая 2010 в 14:32

"sozdatel" wrote:
Попробовал работает спасибо бльшое Smile Сам бы я долго с этим мучался...

А, кстати, вам нужно было это для какой-то роли пользователей, или для всех, кроме админа?
Я подобную функцию тоже сделал на сайте.

Аватар пользователя sozdatel sozdatel 3 мая 2010 в 15:05

Sinkora wrote:
А, кстати, вам нужно было это для какой-то роли пользователей, или для всех, кроме админа?
Я подобную функцию тоже сделал на сайте.

Для определенной роли.

Аватар пользователя sozdatel sozdatel 3 мая 2010 в 15:40

Sinkora wrote:
А, кстати, вам нужно было это для какой-то роли пользователей, или для всех, кроме админа?
Я подобную функцию тоже сделал на сайте.

Если не сложно можешь поделится как по ролям сделать такой функционал...

Аватар пользователя olk olk 3 мая 2010 в 16:07

"Dan" wrote:
А почему не presave? Тогда и запрос не надо будет делать.

Не скажу про автора решения, но наверное потому что в топике был вопрос про редактирование ноды, presave-же выполниться и при insert-e, хотя вопрос конечно филосовский, можно ли считать создание новой ноды ее редактированием Smile

Аватар пользователя Sinkora Sinkora 3 мая 2010 в 16:29

"Dan" wrote:
А почему не presave? Тогда и запрос не надо будет делать.

Что-то не понял вопроса. Какой запрос имеется в виду?
Этот запрос же в любом случае нужно будет выполнять:

db_query('UPDATE {node} SET status = 0 WHERE nid = %d', $node->nid);

Аватар пользователя Sinkora Sinkora 3 мая 2010 в 16:32

"olk" wrote:
можно ли считать создание новой ноды ее редактированием :)

Нет, у Друпала это разные операции: insert и update...

Аватар пользователя Dan Dan 3 мая 2010 в 16:42

"olk" wrote:
presave-же выполниться и при insert-e,

Да, выполнится, но можно посмотреть наличие nid - если есть, значит нода обновляется, если нет - новая.

"Sinkora" wrote:
тот запрос же в любом случае нужно будет выполнять:

Нет, можно просто изменить объект $node, а друпал сам всё сохранит.

Аватар пользователя Sinkora Sinkora 3 мая 2010 в 16:48

"Dan" wrote:
Нет, можно просто изменить объект $node, а друпал сам всё сохранит.

Да, согласен. Так будет правильнее:

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  if ($op == 'presave') {
    if (!user_access('administer nodes') && $node->status) {
      $node->status = 0;
    }
  }    
}
Аватар пользователя Sinkora Sinkora 4 мая 2010 в 2:32

"sozdatel" wrote:
Если не сложно можешь поделится как по ролям сделать такой функционал...

Вы даже не написали, что конкретно хотите. Например, если юзер имеет роль news redactor ($user->roles[3] => 'news redactor'), то код примерно такой:

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  if ($op == 'presave') {
    global $user;
    if (isset($user->roles[3]) && $node->status) {
      $node->status = 0;
    }
  }    
}
Аватар пользователя Sinkora Sinkora 4 мая 2010 в 18:40

"Dan" wrote:
А если номера поменяются?

Вместо isset($user->roles[3]) лучше сделать:
array_intersect($user->roles, array('role1', 'role2'))

А если названия ролей поменяются?)

В идеале, чтобы была универсальность, можно и форму настроек сделать, где можно выбирать нужные типы ноды, нужные роли, а потом эти настройки ($mymodule_types, $mymodule_roles) использовать...

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  if ($op == 'presave') {
    global $user;
    $mymodule_types = variable_get('mymodule_types', array());
    $mymodule_roles = variable_get('mymodule_roles', array());
    if (in_array($node->type, $mymodule_types) && array_intersect($user->roles, $mymodule_roles)) {
      $node->status = 0;
    }
  }    
}