очень нужно сделать возможность для зарегистрированных юзеров редактировать ноды у которых отсутствует автор (поле пустое), да так чтоб после редактрования они сами становились авторами этих нодов. сейчас даже если дать зарегистрированным пользователям возможность редактировать такие "ничейные" ноды, то авторами они всёравно после этого не становятся.
либо как вариант можно просто сделать возможность юзерам просто становиться авторами "ничейных" нодов и тем самым получать доступ к их редактированию и закрывать редактирование этих нодов другим пользователям. Но опять же как??
Комментарии
Есть модуль node_adoption, который позволяет при удалении пользователя все его документы (ноды) назначить зарание определённому пользователю. Таким образом "ничейных" нод быть уже не должно.
А для тех нод, которые уже стали "ничейными" - мне кажется пользователи просто должны прописать своё имя в нужном поле (автор) при редактировании...
я создавал тестовый нод админом и поле автора принудительно очистил от своего ника, так что нод получился реально "ничейный"
но для его редактирования юзером этого недостаточн т.к. в коде модуля задано жёсткое условие чтоб имя юзера = имя автора нода - только тогда даётся разрешение на редактирование. вот сейчас пытаюсь сделать какраз возможность редактирования нодов с пустым полем авторства или на худой конец с каким-то заранее известным...
а за наводку на node_adoption отдельное спасибо, думаю он мне тоже пригодится
для решения своей проблемы я решил закодить в модуле image (именно в нём мне нужно отдавать авторство зарегистрированным пользователям) возможность для пользователей редактировать ноды, у которых в поле автора пусто. для этого я залез в файлик image.module и дописал там то, что далее будет выделено жирным шрифтом:
/**
* Implementation of hook_perm
*/
function image_perm() {
return array('create images', 'view original images', 'edit own images', 'edit images', 'edit guest images');
}
/**
* Implementation of hook_access
*/
function image_access($op, $node) {
global $user;
if ($op == 'create' && user_access('create images')) {
return TRUE;
}
if ($op == 'update' || $op == 'delete') {
if (user_access('edit images')) {
return TRUE;
}
if (user_access('edit own images') && ($user->uid == $node->uid)) {
return TRUE;
}
if (user_access('edit guest images') && ($user->uid == $node->uid)) {
return TRUE;
}
}
}
подскажите кто разбирается на что нужно заменить вот это:
if (user_access('edit guest images') && ($user->uid == $node->uid)) {
return TRUE;
}
чтобы эта опция заработала для нодов без автора?
сам я в php не силён, так что надеюсь на вашу помощь
return TRUE;
}
Этот код вернёт Истина в случае, если пользователь имеет привилегию 'edit guest images' И он не является автором ноды.
Мне кажется, что нужно настроить "edit images" - эта привилегия даёт право менять чужие ноды, а не только свои...
Если нужно вернуть Истина, когда пользоваатель не явлется автором ноды, то так:
return TRUE;
}
ну это почти то что нужно, но не подходит, т.к. тогда получится что один юзер сможет "отбирать" ноды у других юзеров, а это уже не то
надо как-то так чтоб условием доступа к редактированию было то самое пустое поле авторства... я языка не знаю, но надо как-то так наверное:
if (user_access('edit guest images') && ($node->uid == пусто)) {
return TRUE;
}
только вот как это "пусто" в PHP называется?
Понял. Тогда так:
return TRUE;
}
PS.
"пусто" в PHP :
$node->uid==''
спасибо большое!
как вариант мне тут ещё посоветовали вот так:
if (user_access('edit guest images') && ($node->uid == 0)) {
а ещё теперь у меня следующая проблема - даже после редактирования "ничейного" нода пользователь не становится его автором.
как это можно реализовать?
p.s. наверное сейчас вынесу этот вопрос в отдельную тему, если не найду ничего в инете.
Разница между:
if (user_access('edit guest images') && ($node->uid == 0)) {
и:
if (user_access('edit guest images') && ($user->uid != $node->uid) && !$node->uid) {
в том, что последний ещё проверяет чтобы пользователь не был автором этой ноды. Если это не нужно, то конечно это нужно опустить.
Чтобы юзер стал автором:
1. Он может вписать себя в соотв. поле при редактировании (требуются пользователи с повышенным IQ).
2. Хакнуть нужный вам модуль, чтобы сам заполнял поле (требуется программер).
друпал не даёт пользователям по умолчанию редактировать авторство картинок (image.module) да и других типов материалов вроде бы тоже. да и заставлять юзеров каждый раз вводить вручную свой ник не хочется, так что буду искать хаккерство
Найти функцию в модуле [module]_update(&$node)
в начале функции (если не определено)
где нибудь в конце
$node->uid=$user->uid;
}
А вот вам и хакерство! Я этот модуль не смотрел, но судя по логике - это и есть решение!
Спасибо, olk.
Ура! кажется получилось то что я хотел!
и даже лучше
я оставил возможность админам очищать поле авторства, в то время как обычный юзер редактируя "ничейный нод" автоматически становится его автором даже без редактирования поля авторства:
в node.module:
в самом конце функции добавил такое:
$node->uid=$user->uid;
}
жалко конечно что пришлось делать это в системном модуле, но зато теперь всё работает
всем спасибо!
Сделайте патч, чтобы при обновлении версии Друпал не потерять изменения.
Заплаты (patch)
или
man patch
Зря ты системный модуль изменил, надо было менять имено в том модуле в котором данное свойство тебе нужно (это меньшее зло) , а так это будет действовать на изменение любой ноды (хотя может тебе это и надо ?)
я просто так понял что image многое наследует из модуля node - в том числе и то что мне надо... конечно я бы лучше менял image, Но не получится. ктому же заплатки можно программно ставить, вот как товарищ выше показывает... сейчас выдалась минутка времени - пойду попробую изучить технологию патчения