FatCat Опубликовано 21 Апреля 2007 Жалоба Поделиться Опубликовано 21 Апреля 2007 Топик модификации закрыт, приходится писать здесь... Добавил к модификации уважаемого 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'"); Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 23 Апреля 2007 Жалоба Поделиться Опубликовано 23 Апреля 2007 Два модера если одновременно делать будут, может быть косяк. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
DANMASTER Опубликовано 28 Апреля 2007 Жалоба Поделиться Опубликовано 28 Апреля 2007 Может быть стоит сделать какое-то условие? Например ввести id сообщения в скрытое поле и дату сообщения, если один модератор уже поменял их местами, то при проверке условия у второго модератора id и дата в этом поле не совпадут с информацией из базы и можно вывести сообщение о том что сообщение уже отмодерированно. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 28 Апреля 2007 Автор Жалоба Поделиться Опубликовано 28 Апреля 2007 Время выполнения запроса - меньше 0,1 секунды.Вероятность, что два модератора попадут в этот интервал очень мала.Но даже в этом случае mySQL не выполняет запросы одновременно, а ставит в очередь, поэтому риска затирания постов не будет, будет лишь перемещение постов не в соответствии с запросами двух модераторов, но все равно в пределах одной страницы. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 28 Апреля 2007 Жалоба Поделиться Опубликовано 28 Апреля 2007 всё-равно.нужно делать всё правильно.Надеяться на авось только для лузеров. Правильно ставит в очередь, но вовсе не факт что они будут выполняться в таком порядке: 1_запрос_модератора12_запрос_модератора13_запрос_модератора14_запрос_модератора11_запрос_модератора22_запрос_модератора23_запрос_модератора24_запрос_модератора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-го не обновлялась страница. Он делает обмен. Что он видит? Он видит что ничего не поменялось тут два решения: 1) нужно короче бы ещё желательно вводить ещё какое-то поле, например поле время апдейта.И селектить по нему. И менять его после смены также.Если селект не принёс результатов, значит один модератор уже успел сделать вперёд. 2) забить болт. Кроме того у тебя не проверяется: 1) является ли один из выбранных постов постом начала топика. В случае если ты это допускаешь, тогда нужно правильно апдейтить поле new_topic 2) является ли модератор модератором обоих постов. У Игза кстати это всё проверяется. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 28 Апреля 2007 Автор Жалоба Поделиться Опубликовано 28 Апреля 2007 они запросто могут перемешаться, это зависиит от внутреннего оптимизатора MySQL.Самое страшное, что может произойти: //Первому выбранному меняем пид $DB->query("UPDATE ibf_posts SET pid = '1' WHERE pid = $idz[0]");Если этот запрос повторится дважды подряд (от разных модераторов) - одно сообщение будет затерто, и по результатам последующих запросов либо станет пустым, либо в него сдублируется сообщение из запроса второго модератора.Причем это опасно даже если модераторы работают в разных топиках: у обоих будет использоваться строка таблицы pid = '1'... 2) забить болт.Забью.У меня на все 4 запроса уходит (по данным сервера) примерно 0,011 секунды.Вероятность попадания в этот кусок времени двух модераторов столь мала, что мне как админу придется стать долгожителем, чтобы дожить до реализации столь малой вероятности. У Игза кстати это всё проверяется.Обрати внимание, мой код ставится дополнением к моду Игза, и не отменяет его проверок.Таким образом, все эти проверки осуществляются. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 28 Апреля 2007 Жалоба Поделиться Опубликовано 28 Апреля 2007 Если этот запрос повторится дважды подряд (от разных модераторов) - одно сообщение будет затерто, и по результатам последующих запросов либо станет пустым, либо в него сдублируется сообщение из запроса второго модератора.Причем это опасно даже если модераторы работают в разных топиках: у обоих будет использоваться строка таблицы pid = '1'...поэтому я и предложил свой вариант. Обрати внимание, мой код ставится дополнением к моду Игза, и не отменяет его проверок.Таким образом, все эти проверки осуществляются.ммм... честно говоря не понимаю.У тебя вызывается complete_recombing, там никаких проверок нет, кроме как на $this->moderator['split_merge']У Игза проверяется, да, но в других функциях, они к твоей никакого отношения не имеют и не будут запускаться при использовании этой фичи, а значит никаких проверок не будет. и ещё чего вспомнил: 1) у тебя не проверяется, что оба сообщения являются сообщениями одного топика.2) сильно не присматривался, но по-моему у тебя при выводе функции RECOMB_POSTZ в комбо-бокс модератора не проверяется этот пункт на права, и этот пункт будет добавлен для всех модераторов. Вероятность попадания в этот кусок времени двух модераторов столь мала, что мне как админу придется стать долгожителем, чтобы дожить до реализации столь малой вероятности.у нас с тобой разный подход.У тебя подход администратора-потребителя, а у меня подход программиста. Программист проверяет всё даже если это может случиться только теоретически, т.к. практика показывает, что это случается.Вообщем моё дело предложить. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 28 Апреля 2007 Жалоба Поделиться Опубликовано 28 Апреля 2007 На всякий случай вот функция в моём исполнении http://forum.sysman.ru/index.php?act=Attac...p;id=1177761295кто сочтёт мои замечания нужными Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
DANMASTER Опубликовано 28 Апреля 2007 Жалоба Поделиться Опубликовано 28 Апреля 2007 А как им пользоваться Сонг? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 28 Апреля 2007 Жалоба Поделиться Опубликовано 28 Апреля 2007 никак, если ты имеешь ввиду воспользоваться в готовом виде. Я его положил только показать как я реализовал алгоритмы проверки, о которых говорил выше.Им не получится у тебя воспользоваться, потому что там вызываются мои функции, которые в других классах, но некоторые запросы и проверки можно смело взять и включить в мод FatCat при установке последнего, если есть такое желание. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
DANMASTER Опубликовано 28 Апреля 2007 Жалоба Поделиться Опубликовано 28 Апреля 2007 FatCat, послушай Сонга не пожалеешь ) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 28 Ноября 2007 Автор Жалоба Поделиться Опубликовано 28 Ноября 2007 Добавил возможность архивации выбранных сообщений. Описание перезалил. Текст архивируемого сообщения сбрасывается в файл, ячейка таблицы очищается, сархивированный файл инклайдится на страницу топика. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
PALADIN+ Опубликовано 2 Декабря 2007 Жалоба Поделиться Опубликовано 2 Декабря 2007 Вот это в описании пропущеноelse if ($key == 'ARC_POSTZ')перед этим { if ($this->moderator['delete_post'] == 1) { $mod_links .= $this->append_link($key); } }--- Далее вопросы и предложения. Почему чекбоксы нельзя выбрать для сархивированных постов? Допустим я захочу удалить уже сархивированные сообщения.Можно ли добавить функции разархивирования?Если удаляется архивный пост, не удаляется сам файлик архива. Можно поправить? В RenderRow, для каждого поста проверяется файл на запись. Это нормально? никак оптимизировать нельзя? ====Вобще по хорошему надо всё в БД хранить, а таблицу ibf_post как-то на части раздробить.. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 2 Декабря 2007 Автор Жалоба Поделиться Опубликовано 2 Декабря 2007 Далее вопросы и предложения. Почему чекбоксы нельзя выбрать для сархивированных постов?Лень было дописать переименовывание сархивированных файлов при перемене мест.Да и вообще, ИМХО, архивировать следует СТАРЫЕ топики, в которых никакая модерация уже не предполагается. Можно ли добавить функции разархивирования?Конечно можно: считать из файла и записать в БД, файл удалить. Если удаляется архивный пост, не удаляется сам файлик архива. Можно поправить?Это буду делать в первую очередь. В RenderRow, для каждого поста проверяется файл на запись. Это нормально? никак оптимизировать нельзя?Тормозов не замечено.Открывал по act=print страницу с 300 сообщений - тормозов не заметил. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 2 Декабря 2007 Автор Жалоба Поделиться Опубликовано 2 Декабря 2007 Почему чекбоксы нельзя выбрать для сархивированных постов? Допустим я захочу удалить уже сархивированные сообщения.Можно ли добавить функции разархивирования?Если удаляется архивный пост, не удаляется сам файлик архива. Можно поправить?Завелся. Сделал чекбоксы и для архивированных постов, и удаление архива при удалении поста.Заодно обнаружил багу с удалением постов: если в топике постов больше 1000, выкидывает по таймауту, не успев удалить все посты. Не успевает майэскуэль за 30 секунд.Кто не верит, вот скрин: http://img47.imageshack.us/img47/1751/0000nw7.gifЖелающие могут сами проверить в майадмине.А вот как выглядит в эррорлоге сервера запрос select pid from ibf_posts where pid < 2000Allowed memory size of 20971520 bytes exhausted (tried to allocate 4850847 bytes)У меня же еще добавилось удаление файлов архива, что не ускоряет процесса...Для перестраховки сделал ограничение на 300 постов топика за одно удаление. Если постов больше 300, удаляет первые 300 постов топика. Длинные топики придется удалять в несколько заходов.Описание мода обновил и перезалил. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
PALADIN+ Опубликовано 3 Декабря 2007 Жалоба Поделиться Опубликовано 3 Декабря 2007 Спасибо, буду иметь ввиду что мод есть. Буду прикидывать. В архив у меня рано или поздно уйдёт большая часть форума. Главное что меня беспокоит, что есть куча веток, где многие сообщения ещё короче чем ссылка на джабба-скрипт и оттого оптимизации там не будет( Хочется всё-таки разбить ibf_post на 2 части (или даже больше). Было бы вобще удобно, чтобы у каждого форума была своя таблица. Но чувствую - не в этой жизни, не с этим двигом) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 3 Декабря 2007 Автор Жалоба Поделиться Опубликовано 3 Декабря 2007 Главное что меня беспокоит, что есть куча веток, где многие сообщения ещё короче чем ссылка на джабба-скрипт и оттого оптимизации там не будет(Жабаскрипт в другом топике и в другом моде.Здесь в БД записывается только один пробел. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
PALADIN+ Опубликовано 3 Декабря 2007 Жалоба Поделиться Опубликовано 3 Декабря 2007 О. Точно O_o Тогда похоже это мега мод. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 4 Декабря 2007 Жалоба Поделиться Опубликовано 4 Декабря 2007 Жабаскрипт в другом топике и в другом моде.Здесь в БД записывается только один пробел.А как он узнает какой файл инклудить? Поле в БД что ли пишется? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 4 Декабря 2007 Автор Жалоба Поделиться Опубликовано 4 Декабря 2007 Жабаскрипт в другом топике и в другом моде.Здесь в БД записывается только один пробел.А как он узнает какой файл инклудить? Поле в БД что ли пишется?Имя и путь файла собирается из айдишника поста.$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 ); Потому-то и были проблемы сначала при смене постов местами - там айдишники меняются у постов. Потом дописал, чтобы при смене айдишник апоста фал чтобы тоже переименовывался. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
PALADIN+ Опубликовано 4 Декабря 2007 Жалоба Поделиться Опубликовано 4 Декабря 2007 Может и правда лучше хранить короткий путь к файлу вместо поста, чем проверять кучу файлов на существование? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 4 Декабря 2007 Автор Жалоба Поделиться Опубликовано 4 Декабря 2007 кучу файлов на существование?Кроме редких случаев, проверяется всего 15 файлов - по числу постов на странице топика.А чем оно пугает? Это обращение существенно "нежнее", чем картинка на странице... Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Song Опубликовано 5 Декабря 2007 Жалоба Поделиться Опубликовано 5 Декабря 2007 Фигасе.. это ж сколько файлов..!Их бы надо ещё и порциям расфосовывать, а то потом не откроешь директорию с этими файлами. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 5 Декабря 2007 Автор Жалоба Поделиться Опубликовано 5 Декабря 2007 Фигасе.. это ж сколько файлов..!Их бы надо ещё и порциям расфосовыватьЯ не случайно привел этот код:Имя и путь файла собирается из айдишника поста.$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 Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
FatCat Опубликовано 7 Декабря 2007 Автор Жалоба Поделиться Опубликовано 7 Декабря 2007 Можно ли добавить функции разархивирования?Добавил.Заодно отловил недоделку, когда модератор мог повторно архивировать уже архивированные, при этом одиночный пробел перезаписывался в файл архива, затирая полезное содержимое. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.