Редактирование комментариев

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

Аватар пользователя snupy snupy 9 января 2011 в 16:05

Речь идет о 7-ке (тестировал релиз версию). Проблема в следующем: если разрешить пользователю редактирование своих комментариев (включить "Edit own comments"), то пользователь может редактировать свои комментарии, даже если после них уже размещены другие комментарии. Как я понял, в 6-ке было иначе.

Хотелось бы вернуть эту замечательную особенность. Как это сделать?

P.S. И не понятно, то ли это такая особенность 7-ки, то ли ошибка.

Комментарии

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 13 января 2011 в 13:07

"snupy" wrote:

Хотелось бы вернуть эту замечательную особенность. Как это сделать?


Может hook_menu_alter()?
Добавить свою функцию туда и проверять есть ли ответ на коммент

Аватар пользователя snupy snupy 13 января 2011 в 14:52

RxB

Возможно. Я пытаюсь понять, как узнать был ли ответ на комментарий. Раньше использовалась функция comment_num_replies(). А теперь от нее отказались: http://drupal.org/node/363977

У Вас есть соображения по поводу того, как проверить, был ли ответ?

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 13 января 2011 в 15:12

Объясняю моё предложение.
Чтобы отредактировать мой коммент, мне надо перейти по пути http://drupal.ru/comment/edit/304120.
Для друпала это путь http://drupal.ru/comment/edit/% (%comment), точно не знаю, ядро надо смотреть, но суть не в этом.
Правила обработки путей задаются в hook_menu().
В ядре будет что-то типа

function comment_menu(){
...

$item[comment/edit/%] = array(
..
'access_callback' => 'функция проверки доступа для редактирования'
..
);
...
}

Так как хаканье ядра карается боженькой, можно влезть сюда через hook_menu_alter() и добавить проверку на то был ли ответ на коммент. Это лучший выход

Аватар пользователя snupy snupy 13 января 2011 в 15:52

"RxB" wrote:
В ядре будет что-то типа

http://api.drupal.org/api/drupal/modules--comment--comment.module/functi...

А ссылка на редактирование в этом случае будет сформирова? Если будет, то это не очень здорово. Какой смысл показывать ссылку на редактирование, если редактирование запрещено (по условию)?

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 13 января 2011 в 16:29
  $items['comment/%comment/edit'] = array(
    '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.
Тут можно либо её переопределить, либо добавить вторую функцию, которая тупо проверяет наличие ответов.

Аватар пользователя snupy snupy 13 января 2011 в 16:56

RxB

Ну хорошо, допустим, это сработает. А как все-таки проверить наличие ответов? Может быть, воспользоваться кодом из бывшей comment_num_replies()?! Хотя, конечно, да, это дополнительная нагрузка. Если комментариев много, то это будет не очень здорово. Впрочем, если будет задействован кеш, то никаких проблем не будет.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 13 января 2011 в 17:09

Написать свою функцию, с запросом типа:
SELECT count(*) FROM comments WHERE pid = [id коммента] LIMIT 1
ну и if от неё.
Насчёт pid могу ошибаться, нет сейчас БД семёрки рядом.
LIMIT чтобы запрос быстрее проходил

Аватар пользователя snupy snupy 13 января 2011 в 18:50

RxB

К сожалению, этот вариант не работает. Если отвечать на саму статью, pid у всех комментариев будет 0. Этот вариант работает только тогда, когда ответ был на какой-то конкретный комментарий (кстати, в 6-ке также).

В общем, для плоских комментариев это не подходит. Если включен Flat comments, то там вообще у всех комментариев pid всегда будет равен 0, даже если ответ был на какой-то комментарий.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 13 января 2011 в 19:29

Тогда принцип аналогичный, запрос меняется:
SELECT count(*) FROM comment WHERE cid > [cid] AND nid = [nid] LIMIT 1;
Можно добавить временные извраты и т.п.
Мотивация: последующие комментарии имеют более высокий ID, чем от которого считаем (который редактируем).
cid и nid можно будет получить через access arguments