Речь идет о 7-ке (тестировал релиз версию). Проблема в следующем: если разрешить пользователю редактирование своих комментариев (включить "Edit own comments"), то пользователь может редактировать свои комментарии, даже если после них уже размещены другие комментарии. Как я понял, в 6-ке было иначе.
Хотелось бы вернуть эту замечательную особенность. Как это сделать?
P.S. И не понятно, то ли это такая особенность 7-ки, то ли ошибка.
Комментарии
Может hook_menu_alter()?
Добавить свою функцию туда и проверять есть ли ответ на коммент
RxB
Возможно. Я пытаюсь понять, как узнать был ли ответ на комментарий. Раньше использовалась функция comment_num_replies(). А теперь от нее отказались: http://drupal.org/node/363977
У Вас есть соображения по поводу того, как проверить, был ли ответ?
Объясняю моё предложение.
Чтобы отредактировать мой коммент, мне надо перейти по пути http://drupal.ru/comment/edit/304120.
Для друпала это путь http://drupal.ru/comment/edit/% (%comment), точно не знаю, ядро надо смотреть, но суть не в этом.
Правила обработки путей задаются в hook_menu().
В ядре будет что-то типа
...
$item[comment/edit/%] = array(
..
'access_callback' => 'функция проверки доступа для редактирования'
..
);
...
}
Так как хаканье ядра карается боженькой, можно влезть сюда через hook_menu_alter() и добавить проверку на то был ли ответ на коммент. Это лучший выход
http://api.drupal.org/api/drupal/modules--comment--comment.module/functi...
А ссылка на редактирование в этом случае будет сформирова? Если будет, то это не очень здорово. Какой смысл показывать ссылку на редактирование, если редактирование запрещено (по условию)?
'title' => 'Edit',
'page callback' => 'comment_edit_page',
'page arguments' => array(1),
'access callback' => 'comment_access',
'access arguments' => array('edit', 1),
'type' => MENU_LOCAL_TASK,
'weight' => 0,
);
Вот этот кусок.
ссылка по идее показываться не будет.
Если редактирование разрешено, то функция comment_access() вернёт TRUE.
Тут можно либо её переопределить, либо добавить вторую функцию, которая тупо проверяет наличие ответов.
RxB
Ну хорошо, допустим, это сработает. А как все-таки проверить наличие ответов? Может быть, воспользоваться кодом из бывшей comment_num_replies()?! Хотя, конечно, да, это дополнительная нагрузка. Если комментариев много, то это будет не очень здорово. Впрочем, если будет задействован кеш, то никаких проблем не будет.
Написать свою функцию, с запросом типа:
SELECT count(*) FROM comments WHERE pid = [id коммента] LIMIT 1
ну и if от неё.
Насчёт pid могу ошибаться, нет сейчас БД семёрки рядом.
LIMIT чтобы запрос быстрее проходил
RxB
К сожалению, этот вариант не работает. Если отвечать на саму статью, pid у всех комментариев будет 0. Этот вариант работает только тогда, когда ответ был на какой-то конкретный комментарий (кстати, в 6-ке также).
В общем, для плоских комментариев это не подходит. Если включен Flat comments, то там вообще у всех комментариев pid всегда будет равен 0, даже если ответ был на какой-то комментарий.
Стоп, т.е. нужно запретить редакторование если ПОСЛЕ были ответы, а не "На"?
RxB
Да.
Тогда принцип аналогичный, запрос меняется:
SELECT count(*) FROM comment WHERE cid > [cid] AND nid = [nid] LIMIT 1;
Можно добавить временные извраты и т.п.
Мотивация: последующие комментарии имеют более высокий ID, чем от которого считаем (который редактируем).
cid и nid можно будет получить через access arguments
RxB
Да, это работает. Спасибо, теперь попытаюсь все это реализовать в виде модуля.
В данном решении есть куда и что оптимизировать
RxB
Согласен. Приходится проверять для всех комментариев, а нужно только для 1-го - последнего.