Доброго времени суток!
Подскажите какой есть модуль для снятия новости с публикации после ее редактирования? Если такой вопрос уже обсуждался буду очень рад увидеть ссылку на это обсуждение самому найти не удалось
Пробовал через Workflow и Rules но что-то не получилось, может уже готовый модуль есть для таких целей?
Комментарии
При редектировании прежде чем сохранить, посмотрите чуть выше кнопки submit.
Что - нибудь похожее на "Публикация" убирайте(ставьте) галочки...(там около трех полей)
Елси этих полей нет, значит администратор сайта в доступах вам не разрешает этих действий.
может поможет.
http://drupal.ru/node/42652
http://drupal.ru/node/43256
Не совсем то, нужно чтоб автоматичеки новость снималась с публикации после ее редактирования. Но всеравно спасибо за активную помощь. Какие еще есть варианты?
hook_nodeapi
- самый лучший вариант.rules
Чтоб в rules сделать подобное, рецептик есть, мучаюсь целый день ничего толкового не выходит
И еще не по теме где можно почитать как работать с rules?
через hook_nodeapi это делается за несколько минут.
А примерчик можно как это реализовать думаю многим будет интерестно...
Ок. Только через несколько часиков, сейчас занят.
Спасибо бедем ждать. Радует что есть такие люди, которые готовы оказать помощь
В файл mymodule.module своего модуля mymodule вставьте эту функцию:
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), тогда это нужно указать в условии:
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);
}
}
}
Конечно, можно еще создать и форму настроек для админки, где можно будет вручную выбирать типы узлов. Но это не самое главное, принцип я показал.
Попробовал работает спасибо бльшое Сам бы я долго с этим мучался...
А, кстати, вам нужно было это для какой-то роли пользователей, или для всех, кроме админа?
Я подобную функцию тоже сделал на сайте.
Для определенной роли.
Если не сложно можешь поделится как по ролям сделать такой функционал...
А почему не presave? Тогда и запрос не надо будет делать.
Не скажу про автора решения, но наверное потому что в топике был вопрос про редактирование ноды, presave-же выполниться и при insert-e, хотя вопрос конечно филосовский, можно ли считать создание новой ноды ее редактированием
Что-то не понял вопроса. Какой запрос имеется в виду?
Этот запрос же в любом случае нужно будет выполнять:
db_query('UPDATE {node} SET status = 0 WHERE nid = %d', $node->nid);
Нет, у Друпала это разные операции: insert и update...
Да, выполнится, но можно посмотреть наличие nid - если есть, значит нода обновляется, если нет - новая.
Нет, можно просто изменить объект $node, а друпал сам всё сохранит.
Да, согласен. Так будет правильнее:
if ($op == 'presave') {
if (!user_access('administer nodes') && $node->status) {
$node->status = 0;
}
}
}
Вы даже не написали, что конкретно хотите. Например, если юзер имеет роль news redactor ($user->roles[3] => 'news redactor'), то код примерно такой:
if ($op == 'presave') {
global $user;
if (isset($user->roles[3]) && $node->status) {
$node->status = 0;
}
}
}
А если номера поменяются?
Вместо isset($user->roles[3]) лучше сделать:
array_intersect($user->roles, array('role1', 'role2'))
А если названия ролей поменяются?)
В идеале, чтобы была универсальность, можно и форму настроек сделать, где можно выбирать нужные типы ноды, нужные роли, а потом эти настройки ($mymodule_types, $mymodule_roles) использовать...
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;
}
}
}
Всем спасибо! Теперь вроде проблем со снятием новости с публикации нет, все работает так как нужно.
Ну дык! Осталось только добавить покер и дам
полезно