как разрешить юзерам редактировать "ничейные" ноды?

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

Аватар пользователя pildwell pildwell 20 мая 2008 в 0:19

очень нужно сделать возможность для зарегистрированных юзеров редактировать ноды у которых отсутствует автор (поле пустое), да так чтоб после редактрования они сами становились авторами этих нодов. сейчас даже если дать зарегистрированным пользователям возможность редактировать такие "ничейные" ноды, то авторами они всёравно после этого не становятся.
либо как вариант можно просто сделать возможность юзерам просто становиться авторами "ничейных" нодов и тем самым получать доступ к их редактированию и закрывать редактирование этих нодов другим пользователям. Но опять же как??

Комментарии

Аватар пользователя VladSavitsky VladSavitsky 20 мая 2008 в 1:01

Есть модуль node_adoption, который позволяет при удалении пользователя все его документы (ноды) назначить зарание определённому пользователю. Таким образом "ничейных" нод быть уже не должно.
А для тех нод, которые уже стали "ничейными" - мне кажется пользователи просто должны прописать своё имя в нужном поле (автор) при редактировании...

Аватар пользователя pildwell pildwell 20 мая 2008 в 1:16

я создавал тестовый нод админом и поле автора принудительно очистил от своего ника, так что нод получился реально "ничейный" Smile но для его редактирования юзером этого недостаточн т.к. в коде модуля задано жёсткое условие чтоб имя юзера = имя автора нода - только тогда даётся разрешение на редактирование. вот сейчас пытаюсь сделать какраз возможность редактирования нодов с пустым полем авторства или на худой конец с каким-то заранее известным...

Аватар пользователя pildwell pildwell 20 мая 2008 в 1:10

для решения своей проблемы я решил закодить в модуле 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 не силён, так что надеюсь на вашу помощь Smile

Аватар пользователя VladSavitsky VladSavitsky 20 мая 2008 в 1:16
if (user_access('edit guest images') && ($user->uid == $node->uid)) {
return TRUE;
}

Этот код вернёт Истина в случае, если пользователь имеет привилегию 'edit guest images' И он не является автором ноды.
Мне кажется, что нужно настроить "edit images" - эта привилегия даёт право менять чужие ноды, а не только свои...
Если нужно вернуть Истина, когда пользоваатель не явлется автором ноды, то так:

if (user_access('edit guest images') && ($user->uid != $node->uid)) {
return TRUE;
}
Аватар пользователя pildwell pildwell 20 мая 2008 в 1:23

ну это почти то что нужно, но не подходит, т.к. тогда получится что один юзер сможет "отбирать" ноды у других юзеров, а это уже не то Smile
надо как-то так чтоб условием доступа к редактированию было то самое пустое поле авторства... я языка не знаю, но надо как-то так наверное:

if (user_access('edit guest images') && ($node->uid == пусто)) {
return TRUE;
}

только вот как это "пусто" в PHP называется? Smile

Аватар пользователя pildwell pildwell 20 мая 2008 в 2:08

спасибо большое!
как вариант мне тут ещё посоветовали вот так:

if (user_access('edit guest images') && ($node->uid == 0)) {

а ещё теперь у меня следующая проблема - даже после редактирования "ничейного" нода пользователь не становится его автором.
как это можно реализовать?

p.s. наверное сейчас вынесу этот вопрос в отдельную тему, если не найду ничего в инете.

Аватар пользователя VladSavitsky VladSavitsky 20 мая 2008 в 2:09

Разница между:
if (user_access('edit guest images') && ($node->uid == 0)) {

и:

if (user_access('edit guest images') && ($user->uid != $node->uid) && !$node->uid) {

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

Чтобы юзер стал автором:
1. Он может вписать себя в соотв. поле при редактировании (требуются пользователи с повышенным IQ).
2. Хакнуть нужный вам модуль, чтобы сам заполнял поле (требуется программер).

Аватар пользователя pildwell pildwell 20 мая 2008 в 2:20

друпал не даёт пользователям по умолчанию редактировать авторство картинок (image.module) да и других типов материалов вроде бы тоже. да и заставлять юзеров каждый раз вводить вручную свой ник не хочется, так что буду искать хаккерство Smile

Аватар пользователя olk olk 20 мая 2008 в 9:03

Найти функцию в модуле [module]_update(&$node)
в начале функции (если не определено)

global $user;

где нибудь в конце

if(!$node->uid && $user->uid) {
 $node->uid=$user->uid;
}
Аватар пользователя pildwell pildwell 20 мая 2008 в 12:45

Ура! кажется получилось то что я хотел!
и даже лучше Smile
я оставил возможность админам очищать поле авторства, в то время как обычный юзер редактируя "ничейный нод" автоматически становится его автором даже без редактирования поля авторства:

в node.module:

в самом конце функции добавил такое:

if(!user_access('administer nodes') && !$node->uid && $user->uid) {
$node->uid=$user->uid;
}

жалко конечно что пришлось делать это в системном модуле, но зато теперь всё работает Smile
всем спасибо!

Аватар пользователя olk olk 20 мая 2008 в 18:23

Зря ты системный модуль изменил, надо было менять имено в том модуле в котором данное свойство тебе нужно (это меньшее зло) , а так это будет действовать на изменение любой ноды (хотя может тебе это и надо ?)

Аватар пользователя pildwell pildwell 27 мая 2008 в 1:36

я просто так понял что image многое наследует из модуля node - в том числе и то что мне надо... конечно я бы лучше менял image, Но не получится. ктому же заплатки можно программно ставить, вот как товарищ выше показывает... сейчас выдалась минутка времени - пойду попробую изучить технологию патчения Smile