Перейти к контенту

Меняем местами сообщения в топике


Рекомендуемые сообщения

Топик модификации закрыт, приходится писать здесь...

 

Добавил к модификации уважаемого theIggs возможность выбрать два сообщения в топике и через новый пункт опций модератора "Поменять местами" поменять местами сообщения в топике.

Даты сообщений при этом не меняются, просто более раннее сообщение окажется после более поздних...

 

Мод с моими дополнениями лежит на http://vesvalo.net/uploads/pius11plus.zip

 

Просьба theIggs посмотреть, и в случае одобрения переложить на http://www.ibresource.ru/db/?get=307

 

 

 

Если кто захочет попробовать переделать мод под другие версии форума, основная идея довольно проста:

Посты в топике выстраиваются в порядке возрастания pid.

У двух постов меняем эти значения.

Для этого нам понадобится "буфер обмена" - удаленный пост с маленьким значением pid; я взял удаленный давным-давно пост сообщения от разработчиков, возникающий при установке нового форума; pid этого сообщения 1.

Вместо первого поста можно взять любой другой, важно, чтобы его pid был меньше самого большого имеющегося на момент установки мода.

 

pid-ы выбраных сообщений собираются в массив $idz, этот механизм я взял у theIggs без изменений; так же взял и все проверки на модераторские полномочия.

 

Перестановка сообщений происходит четырьмя запросами:

		//Чистим ячейку на случай старых "хвостов" от сбоев
	// !!!
	// Убедиться, что пост с номерочком 1 (или какой там выбран) действительно удален!!!
	// !!!
	$DB->query("DELETE FROM ibf_posts WHERE pid = '1' LIMIT 1");

	//Первому выбранному меняем пид
		$DB->query("UPDATE ibf_posts SET pid = '1' WHERE pid = $idz[0]");

	//Второму отдаем пид первого
	$DB->query("UPDATE ibf_posts SET pid = '$idz[0]' WHERE pid = $idz[1]");

	//Первому отдаем пид второго
	$DB->query("UPDATE ibf_posts SET pid = '$idz[1]' WHERE pid = '1'");

Ссылка на комментарий
Поделиться на других сайтах

  • Ответы 64
  • Создана
  • Последний ответ

Лучшие авторы в этой теме

Лучшие авторы в этой теме

Два модера если одновременно делать будут, может быть косяк.
Ссылка на комментарий
Поделиться на других сайтах

Может быть стоит сделать какое-то условие? Например ввести id сообщения в скрытое поле и дату сообщения, если один модератор уже поменял их местами, то при проверке условия у второго модератора id и дата в этом поле не совпадут с информацией из базы и можно вывести сообщение о том что сообщение уже отмодерированно.
Ссылка на комментарий
Поделиться на других сайтах

Время выполнения запроса - меньше 0,1 секунды.

Вероятность, что два модератора попадут в этот интервал очень мала.

Но даже в этом случае mySQL не выполняет запросы одновременно, а ставит в очередь, поэтому риска затирания постов не будет, будет лишь перемещение постов не в соответствии с запросами двух модераторов, но все равно в пределах одной страницы.

Ссылка на комментарий
Поделиться на других сайтах

всё-равно.

нужно делать всё правильно.

Надеяться на авось только для лузеров.

 

Правильно ставит в очередь, но вовсе не факт что они будут выполняться в таком порядке:

 

1_запрос_модератора1

2_запрос_модератора1

3_запрос_модератора1

4_запрос_модератора1

1_запрос_модератора2

2_запрос_модератора2

3_запрос_модератора2

4_запрос_модератора2

 

они запросто могут перемешаться, это зависиит от внутреннего оптимизатора MySQL.

Особенно 5-ая версия любит такие штучки.

 

Мне кажется если делать такую штуку, то как минимум так:

//Первому выбранному меняем пид
	$DB->query("UPDATE ibf_posts SET pid = '-{$ibforums->member['id']}' WHERE pid = $idz[0]");

	//Второму отдаем пид первого
	$DB->query("UPDATE ibf_posts SET pid = '$idz[0]' WHERE pid = $idz[1]");

	//Первому отдаем пид второго
	$DB->query("UPDATE ibf_posts SET pid = '$idz[1]' WHERE pid = '-{$ibforums->member['id']}'");

и убрать unsigned свойство если оно есть для колонки pid.

и + обязательно делать откат, если вдруг по каким-то причинам последний апдейт не принёс результатов.

 

Кроме того не рассмотрена такая ситуация: у раздела 2 активных модератора, оба сразу увидели проблему с постами.

Один вперёд другого сделал обмен, но у 2-го не обновлялась страница. Он делает обмен. Что он видит? Он видит что ничего не поменялось :D

 

тут два решения:

 

1) нужно короче бы ещё желательно вводить ещё какое-то поле, например поле время апдейта.

И селектить по нему. И менять его после смены также.

Если селект не принёс результатов, значит один модератор уже успел сделать вперёд.

 

2) забить болт.

 

Кроме того у тебя не проверяется:

 

1) является ли один из выбранных постов постом начала топика. В случае если ты это допускаешь, тогда нужно правильно апдейтить поле new_topic

 

2) является ли модератор модератором обоих постов.

 

У Игза кстати это всё проверяется.

Ссылка на комментарий
Поделиться на других сайтах

они запросто могут перемешаться, это зависиит от внутреннего оптимизатора MySQL.
Самое страшное, что может произойти:
		//Первому выбранному меняем пид
	$DB->query("UPDATE ibf_posts SET pid = '1' WHERE pid = $idz[0]");

Если этот запрос повторится дважды подряд (от разных модераторов) - одно сообщение будет затерто, и по результатам последующих запросов либо станет пустым, либо в него сдублируется сообщение из запроса второго модератора.

Причем это опасно даже если модераторы работают в разных топиках: у обоих будет использоваться строка таблицы pid = '1'...

 

 

 

2) забить болт.
Забью.

У меня на все 4 запроса уходит (по данным сервера) примерно 0,011 секунды.

Вероятность попадания в этот кусок времени двух модераторов столь мала, что мне как админу придется стать долгожителем, чтобы дожить до реализации столь малой вероятности.

 

 

 

 

У Игза кстати это всё проверяется.

Обрати внимание, мой код ставится дополнением к моду Игза, и не отменяет его проверок.

Таким образом, все эти проверки осуществляются.

Ссылка на комментарий
Поделиться на других сайтах

Если этот запрос повторится дважды подряд (от разных модераторов) - одно сообщение будет затерто, и по результатам последующих запросов либо станет пустым, либо в него сдублируется сообщение из запроса второго модератора.

Причем это опасно даже если модераторы работают в разных топиках: у обоих будет использоваться строка таблицы pid = '1'...

поэтому я и предложил свой вариант.

 

Обрати внимание, мой код ставится дополнением к моду Игза, и не отменяет его проверок.Таким образом, все эти проверки осуществляются.

ммм... честно говоря не понимаю.

У тебя вызывается complete_recombing, там никаких проверок нет, кроме как на $this->moderator['split_merge']

У Игза проверяется, да, но в других функциях, они к твоей никакого отношения не имеют и не будут запускаться при использовании этой фичи, а значит никаких проверок не будет.

 

и ещё чего вспомнил:

1) у тебя не проверяется, что оба сообщения являются сообщениями одного топика.

2) сильно не присматривался, но по-моему у тебя при выводе функции RECOMB_POSTZ в комбо-бокс модератора не проверяется этот пункт на права, и этот пункт будет добавлен для всех модераторов.

 

Вероятность попадания в этот кусок времени двух модераторов столь мала, что мне как админу придется стать долгожителем, чтобы дожить до реализации столь малой вероятности.

у нас с тобой разный подход.

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

Вообщем моё дело предложить.

Ссылка на комментарий
Поделиться на других сайтах

На всякий случай вот функция в моём исполнении http://forum.sysman.ru/index.php?act=Attac...p;id=1177761295

кто сочтёт мои замечания нужными

Ссылка на комментарий
Поделиться на других сайтах

А как им пользоваться Сонг?
Ссылка на комментарий
Поделиться на других сайтах

никак, если ты имеешь ввиду воспользоваться в готовом виде.

 

Я его положил только показать как я реализовал алгоритмы проверки, о которых говорил выше.

Им не получится у тебя воспользоваться, потому что там вызываются мои функции, которые в других классах, но некоторые запросы и проверки можно смело взять и включить в мод FatCat при установке последнего, если есть такое желание.

Ссылка на комментарий
Поделиться на других сайтах

FatCat, послушай Сонга не пожалеешь )
Ссылка на комментарий
Поделиться на других сайтах

  • 7 месяцев спустя...

Добавил возможность архивации выбранных сообщений. Описание перезалил.

 

Текст архивируемого сообщения сбрасывается в файл, ячейка таблицы очищается, сархивированный файл инклайдится на страницу топика.

Ссылка на комментарий
Поделиться на других сайтах

Вот это в описании пропущено

else if ($key == 'ARC_POSTZ')

перед этим

  {
				if ($this->moderator['delete_post'] == 1)
				{
					$mod_links .= $this->append_link($key);
				}
			}

---

 

Далее вопросы и предложения.

 

Почему чекбоксы нельзя выбрать для сархивированных постов? Допустим я захочу удалить уже сархивированные сообщения.

Можно ли добавить функции разархивирования?

Если удаляется архивный пост, не удаляется сам файлик архива. Можно поправить?

 

 

В RenderRow, для каждого поста проверяется файл на запись. Это нормально? никак оптимизировать нельзя?

 

 

====

Вобще по хорошему надо всё в БД хранить, а таблицу ibf_post как-то на части раздробить..

Ссылка на комментарий
Поделиться на других сайтах

Далее вопросы и предложения.

 

Почему чекбоксы нельзя выбрать для сархивированных постов?

Лень было дописать переименовывание сархивированных файлов при перемене мест.

Да и вообще, ИМХО, архивировать следует СТАРЫЕ топики, в которых никакая модерация уже не предполагается.

 

 

Можно ли добавить функции разархивирования?

Конечно можно: считать из файла и записать в БД, файл удалить.

 

 

Если удаляется архивный пост, не удаляется сам файлик архива. Можно поправить?

Это буду делать в первую очередь.

 

 

В RenderRow, для каждого поста проверяется файл на запись. Это нормально? никак оптимизировать нельзя?

Тормозов не замечено.

Открывал по act=print страницу с 300 сообщений - тормозов не заметил.

Ссылка на комментарий
Поделиться на других сайтах

Почему чекбоксы нельзя выбрать для сархивированных постов? Допустим я захочу удалить уже сархивированные сообщения.

Можно ли добавить функции разархивирования?

Если удаляется архивный пост, не удаляется сам файлик архива. Можно поправить?

Завелся. Сделал чекбоксы и для архивированных постов, и удаление архива при удалении поста.

Заодно обнаружил багу с удалением постов: если в топике постов больше 1000, выкидывает по таймауту, не успев удалить все посты. Не успевает майэскуэль за 30 секунд.

Кто не верит, вот скрин: http://img47.imageshack.us/img47/1751/0000nw7.gif

Желающие могут сами проверить в майадмине.

А вот как выглядит в эррорлоге сервера запрос

select pid from ibf_posts where pid < 2000

Allowed memory size of 20971520 bytes exhausted (tried to allocate 4850847 bytes)

У меня же еще добавилось удаление файлов архива, что не ускоряет процесса...

Для перестраховки сделал ограничение на 300 постов топика за одно удаление. Если постов больше 300, удаляет первые 300 постов топика. Длинные топики придется удалять в несколько заходов.

Описание мода обновил и перезалил.

Ссылка на комментарий
Поделиться на других сайтах

Спасибо, буду иметь ввиду что мод есть. Буду прикидывать. В архив у меня рано или поздно уйдёт большая часть форума.

 

Главное что меня беспокоит, что есть куча веток, где многие сообщения ещё короче чем ссылка на джабба-скрипт и оттого оптимизации там не будет(

 

Хочется всё-таки разбить ibf_post на 2 части (или даже больше). Было бы вобще удобно, чтобы у каждого форума была своя таблица. Но чувствую - не в этой жизни, не с этим двигом)

Ссылка на комментарий
Поделиться на других сайтах

Главное что меня беспокоит, что есть куча веток, где многие сообщения ещё короче чем ссылка на джабба-скрипт и оттого оптимизации там не будет(

Жабаскрипт в другом топике и в другом моде.

Здесь в БД записывается только один пробел.

Ссылка на комментарий
Поделиться на других сайтах

О. Точно O_o

 

Тогда похоже это мега мод.

Ссылка на комментарий
Поделиться на других сайтах

Жабаскрипт в другом топике и в другом моде.

Здесь в БД записывается только один пробел.

А как он узнает какой файл инклудить? Поле в БД что ли пишется?

Ссылка на комментарий
Поделиться на других сайтах

Жабаскрипт в другом топике и в другом моде.

Здесь в БД записывается только один пробел.

А как он узнает какой файл инклудить? Поле в БД что ли пишется?

Имя и путь файла собирается из айдишника поста.

$arc_path = ($post['pid']-$post['pid']%1000)/1000;
$arc_path = intval($arc_path)."/";
$arc_file = $post['pid']%1000;
$arc_file = intval($arc_file).".arc";
<...>
		include( "arc/".$arc_path.$arc_file );

 

Потому-то и были проблемы сначала при смене постов местами - там айдишники меняются у постов. Потом дописал, чтобы при смене айдишник апоста фал чтобы тоже переименовывался.

Ссылка на комментарий
Поделиться на других сайтах

Может и правда лучше хранить короткий путь к файлу вместо поста, чем проверять кучу файлов на существование?
Ссылка на комментарий
Поделиться на других сайтах

кучу файлов на существование?

Кроме редких случаев, проверяется всего 15 файлов - по числу постов на странице топика.

А чем оно пугает? Это обращение существенно "нежнее", чем картинка на странице...

Ссылка на комментарий
Поделиться на других сайтах

Фигасе.. это ж сколько файлов..!

Их бы надо ещё и порциям расфосовывать, а то потом не откроешь директорию с этими файлами.

Ссылка на комментарий
Поделиться на других сайтах

Фигасе.. это ж сколько файлов..!

Их бы надо ещё и порциям расфосовывать

Я не случайно привел этот код:

Имя и путь файла собирается из айдишника поста.
$arc_path = ($post['pid']-$post['pid']%1000)/1000;
$arc_path = intval($arc_path)."/";
$arc_file = $post['pid']%1000;
$arc_file = intval($arc_file).".arc";
<...>
		include( "arc/".$arc_path.$arc_file );

Таким образом, файлов в директории будет не больше 1000.

Например, файл архива для поста с айдишником 12345 будет: arc/12/345.arc

Ссылка на комментарий
Поделиться на других сайтах

Можно ли добавить функции разархивирования?

Добавил.

Заодно отловил недоделку, когда модератор мог повторно архивировать уже архивированные, при этом одиночный пробел перезаписывался в файл архива, затирая полезное содержимое.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

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

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.