orc Опубликовано 23 Июля 2004 Жалоба Поделиться Опубликовано 23 Июля 2004 Meowth[OGD]Я ламер в этом. Можно по-подробнее? Как пятилетнему обьясните пожалуста. Ссылка на комментарий Поделиться на других сайтах Прочее
orc Опубликовано 25 Июля 2004 Жалоба Поделиться Опубликовано 25 Июля 2004 Помогите плиз. Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 3 Августа 2004 Жалоба Поделиться Опубликовано 3 Августа 2004 Так, с 2.0 кто-нить уже извращался? . Я вот чего надумалmodunctions.php FIND: function post_delete($id) { global $std, $ibforums, $DB; $posts = array(); $attach_tid = array(); $topics = array(); ADD BELOW: $authors = array(); FIND: //--------------------------------------- // Get Stuff //--------------------------------------- $DB->simple_construct( array( 'select' => 'pid, topic_id', 'from' => 'posts', 'where' => 'pid'.$pid ) ); $DB->simple_exec(); while ( $r = $DB->fetch_row() ) { $posts[ $r['pid'] ] = $r['topic_id']; $topics[ $r['topic_id'] ] = 1; } REPLACE: //--------------------------------------- // Get Stuff //--------------------------------------- $DB->simple_construct( array( 'select' => 'author_id, pid, topic_id', 'from' => 'posts', 'where' => 'pid'.$pid ) ); $DB->simple_exec(); while ( $r = $DB->fetch_row() ) { $posts[ $r['pid'] ] = $r['topic_id']; $topics[ $r['topic_id'] ] = 1; $authors[] = $r['author_id']; } FIND: //--------------------------------------- // delete the post //--------------------------------------- $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "pid".$pid ) ); //--------------------------------------- // Update the stats //--------------------------------------- ADD BELOW: if ($this->forum['inc_postcount']) { if ( count($authors) > 0 ) { $authorids = " IN(".implode(",",$authors).")"; $DB->simple_exec_query( array( 'update' => 'members', 'set' => 'posts = posts - 1', 'where' => "id{$authorids}") ); } }Но тут есть одно но. Система-то теперь по другом работает, так что если удалять сразу несколько сообщений одного человека, его счетчик уменьшится только на 1. Можно конечно считать для каждого человека и обновлять его инфу отдельно, но так, имхо, запросов слишком много будет... Что не есть приемлимо... Какие будут предложения? Есть вариант группировать по количеству удаляемых сообщений, так количество запросов уменьшится, но то же не очень (зависит от ситуации конечно). Можно было бы что-нить помутить с самим запросом, но MySQL же подзапросы не понимает . Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 я сделал- даже рабтает - причем и при удалении темы тоже..вот:описывать что куда вставлено не буду просто вот этим надо заменить соответсвующее место в файле modunctions.php в принципе места вставок помечены строчкой "//my post-1" //------------------------------------------------------ // @post_delete: delete post ID(s) // ----------- // Accepts: $id (array | string) // Returns: NOTHING (TRUE/FALSE) //------------------------------------------------------ function post_delete($id) { global $std, $ibforums, $DB; $posts = array(); $attach_tid = array(); $topics = array(); //my post-1 $author_id = array(); //my post-1 $this->error = ""; if ( is_array( $id ) ) { if ( count($id) > 0 ) { $pid = " IN(".implode(",",$id).")"; } else { return FALSE; } } else { if ( intval($id) ) { $pid = "=$id"; } else { return FALSE; } } //--------------------------------------- // Get Stuff //--------------------------------------- //my post-1 $DB->simple_construct( array( 'select' => 'pid, topic_id, author_id', 'from' => 'posts', 'where' => 'pid'.$pid ) ); //my post-1 $DB->simple_exec(); while ( $r = $DB->fetch_row() ) { $posts[ $r['pid'] ] = $r['topic_id']; $topics[ $r['topic_id'] ] = 1; //my post-1 $author_id[]=$r['author_id']; //my post-1 } //--------------------------------------- // Is there an attachment to this post? //--------------------------------------- $DB->simple_construct( array( 'select' => '*', 'from' => 'attachments', 'where' => "attach_pid".$pid ) ); $DB->simple_exec(); $attach_ids = array(); while ( $killmeh = $DB->fetch_row( ) ) { if ( $killmeh['attach_location'] ) { @unlink( $ibforums->vars['upload_dir']."/".$killmeh['attach_location'] ); } if ( $killmeh['attach_thumb_location'] ) { @unlink( $ibforums->vars['upload_dir']."/".$killmeh['attach_thumb_location'] ); } $attach_ids[] = $killmeh['attach_id']; $attach_tid[ $posts[ $killmeh['attach_pid'] ] ] = $posts[ $killmeh['attach_pid'] ]; } if ( count($attach_ids) ) { $DB->simple_exec_query( array( 'delete' => 'attachments', 'where' => "attach_id IN(".implode(",",$attach_ids).")" ) ); //--------------------------------------- // Recount topic upload marker //--------------------------------------- require_once( ROOT_PATH.'sources/post.php' ); $postlib = new post(); foreach( $attach_tid as $apid => $tid ) { $postlib->pf_recount_topic_attachments($tid); } } //--------------------------------------- // delete the post //--------------------------------------- $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "pid".$pid ) ); //--------------------------------------- // Update the stats //--------------------------------------- $ibforums->cache['stats']['total_replies'] -= count($posts); $std->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 0 ) ); //--------------------------------------- // Update all relevant topics //--------------------------------------- foreach( array_keys($topics) as $tid ) { $this->rebuild_topic($tid); } //my post-1 //################################################## for ($i=0; $i<count($author_id);$i++) { $pcount = ""; $mgroup = ""; // $DB->simple_construct( array( 'select' => '*', 'from' => 'members', 'where' => 'id='.$author_id[$i] ) ); // $DB->simple_exec(); // $r = $DB->fetch_row(); $pcount = "posts=posts-1, "; $r['last_post'] = time(); $DB->simple_construct( array( 'update' => 'members', 'set' => $pcount." last_post=".intval($r['last_post']), 'where' => 'id='.$author_id[$i] ) ); $DB->simple_exec(); } //################################################## //my post-1 // $this->add_moderate_log("Deleted posts ($pid)", "", "", $pid, ""); } зы у меня внутри этой функции еще небольшое изменение закоментирована строчка в самом низу // $this->add_moderate_log("Deleted posts ($pid)", "", "", $pid, "");я немного усовершенствовал логирование действий модераторов если не хотите совершенствовать, то можно строчку раскоментироватьв файле moderate.php заменить на это соответсвующюю фунцию...сделал это потому что опять же MySQL пропускал ошибки, а я работаю с постгре- он ошибки выдавал при стандартных запросах.. function delete_post() { global $std, $ibforums, $DB, $print; // Get this post id. $ibforums->input['p'] = intval($ibforums->input['p']); $DB->simple_construct( array( 'select' => 'pid, author_id, post_date, new_topic', 'from' => 'posts', 'where' => "topic_id={$this->topic['tid']} and pid={$ibforums->input['p']}" ) ); $DB->simple_exec(); if ( ! $post = $DB->fetch_row() ) { $this->moderate_error(); } $passed = 0; if ($ibforums->member['g_is_supmod'] == 1) { $passed = 1; } else if ($this->moderator['delete_post'] == 1) { $passed = 1; } else if ( ($ibforums->member['g_delete_own_posts'] == 1) and ( $ibforums->member['id'] == $post['author_id'] ) ) { $passed = 1; } else { $passed = 0; } if ($passed != 1) $this->moderate_error(); //--------------------------------------- // Check to make sure that this isn't the first post in the topic.. //--------------------------------------- if ($post['new_topic'] == 1) { $this->moderate_error('no_delete_post'); } if ( $this->trash_forum and $this->trash_forum != $this->forum['id'] ) { //--------------------------------------- // Set up and pass to split topic handler //--------------------------------------- $ibforums->input['checked'] = 1; $ibforums->input['fid'] = $this->trash_forum; $ibforums->input['title'] = "From: ".$this->topic['title']; $ibforums->input['desc'] = "From Topic ID: ".$this->topic['tid']; $ibforums->input[ 'post_'.$ibforums->input['p'] ] = 1; $this->trash_inuse = 1; $this->multi_split_topic(); $this->trash_inuse = 0; } else { $this->modfunc->post_delete( $ibforums->input['p'] ); $this->modfunc->forum_recount( $this->forum['id'] ); $this->moderate_log("Deleted posts. Author:".$post['author_name']." Nom. post: ". $ibforums->input['p']); } $print->redirect_screen( $ibforums->lang['post_deleted'], "act=ST&f=".$this->forum['id']."&t=".$this->topic['tid']."&st=".$ibforums->input['st'] ); } ну и чтобы счетчик уменьшался при удалении тем делаем такое изменение в файле modfunctions.phpищем функцию function topic_delete($id, $nostats=0)внутри строчку $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "topic_id".$tid ) );меняем на $this->post_delete($posts); // $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "topic_id".$tid ) );- все...проверенно работает.. проверял долго, при мульти удалениях тожеНО если юзаете корзину то счетчик уменьшается только при удалении из нее Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 winnie А тебе не кажется, что делать по запросу на каждый пост это мягко говоря не оптимально? Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 (изменено) А тебе не кажется, что делать по запросу на каждый пост это мягко говоря не оптимально?кажется.. 1. ищу решения -и уже близок к нахождению2. фича удаления постов только для модеров, так что большой загрузки нет3. реальная загрузка думаю может быть только если удалять тему с 500 постами.., много ли у вас таких тем и часто ли их вы удаляете? Изменено 4 Августа 2004 пользователем winnie Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 кхм.. сказано сделано вот более продвинутый по идее меньше грузящий базу заменить этим всю функцию post_delete из файла modunctions.php //------------------------------------------------------ // @post_delete: delete post ID(s) // ----------- // Accepts: $id (array | string) // Returns: NOTHING (TRUE/FALSE) //------------------------------------------------------ function post_delete($id) { global $std, $ibforums, $DB; $posts = array(); $attach_tid = array(); $topics = array(); //my post-1 $author_id = array(); //my post-1 $this->error = ""; if ( is_array( $id ) ) { if ( count($id) > 0 ) { $pid = " IN(".implode(",",$id).")"; } else { return FALSE; } } else { if ( intval($id) ) { $pid = "=$id"; } else { return FALSE; } } //--------------------------------------- // Get Stuff //--------------------------------------- //my post-1 $DB->simple_construct( array( 'select' => 'pid, topic_id, author_id', 'from' => 'posts', 'where' => 'pid'.$pid ) ); //my post-1 $DB->simple_exec(); while ( $r = $DB->fetch_row() ) { $posts[ $r['pid'] ] = $r['topic_id']; $topics[ $r['topic_id'] ] = 1; //my post-1 $author_id[$r['author_id']]=$author_id[$r['author_id']]+1; //my post-1 } //--------------------------------------- // Is there an attachment to this post? //--------------------------------------- $DB->simple_construct( array( 'select' => '*', 'from' => 'attachments', 'where' => "attach_pid".$pid ) ); $DB->simple_exec(); $attach_ids = array(); while ( $killmeh = $DB->fetch_row( ) ) { if ( $killmeh['attach_location'] ) { @unlink( $ibforums->vars['upload_dir']."/".$killmeh['attach_location'] ); } if ( $killmeh['attach_thumb_location'] ) { @unlink( $ibforums->vars['upload_dir']."/".$killmeh['attach_thumb_location'] ); } $attach_ids[] = $killmeh['attach_id']; $attach_tid[ $posts[ $killmeh['attach_pid'] ] ] = $posts[ $killmeh['attach_pid'] ]; } if ( count($attach_ids) ) { $DB->simple_exec_query( array( 'delete' => 'attachments', 'where' => "attach_id IN(".implode(",",$attach_ids).")" ) ); //--------------------------------------- // Recount topic upload marker //--------------------------------------- require_once( ROOT_PATH.'sources/post.php' ); $postlib = new post(); foreach( $attach_tid as $apid => $tid ) { $postlib->pf_recount_topic_attachments($tid); } } //--------------------------------------- // delete the post //--------------------------------------- $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "pid".$pid ) ); //--------------------------------------- // Update the stats //--------------------------------------- $ibforums->cache['stats']['total_replies'] -= count($posts); $std->update_cache( array( 'name' => 'stats', 'array' => 1, 'deletefirst' => 0 ) ); //--------------------------------------- // Update all relevant topics //--------------------------------------- foreach( array_keys($topics) as $tid ) { $this->rebuild_topic($tid); } //my post-1 //################################################## foreach ($author_id as $member_id => $post_delete) { $pcount = ''; $pcount = "posts=posts-$post_delete, "; $r['last_post'] = time(); $DB->simple_construct( array( 'update' => 'members', 'set' => $pcount.' last_post='.intval($r['last_post']), 'where' => 'id='.$member_id ) ); $DB->simple_exec(); } //################################################## //my post-1 // $this->add_moderate_log("Deleted posts ($pid)", "", "", $pid, ""); } теперь запрос к базе мемберов идет по просто по каждому пользователю - сразу списывается количество удаленных постов.. тоже конечно не идеально для больших тем где отметилось много народу, но больше вроде ничего не придумать.. или можно? мысли есть у кого?кстати думаю еще внести изменения сюда: если включен переход пользователей от по группаом от кол-ва постов - снижать групу если надо Ссылка на комментарий Поделиться на других сайтах Прочее
theIggs Опубликовано 4 Августа 2004 Автор Жалоба Поделиться Опубликовано 4 Августа 2004 тоже конечно не идеально для больших тем где отметилось много народу, но больше вроде ничего не придумать.. или можно? мысли есть у кого?А чем старый способ не нравился?кстати думаю еще внести изменения сюда: если включен переход пользователей от по группаом от кол-ва постов - снижать групу если надоwinnie, ты правильно мыслишь, но вопрос - где столько времени берёшь? Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 А чем старый способ не нравился?старый это какой? если мой предыдущий, то там как правильно заметил d1pro количество запросов к базе мемберов было столько же сколько и удаляемых постов.... я сам понимал что это не хорошо- руки не доходили исправить, ну раз уж выложил на всеобщее пользование, то решил улучшить где столько времени берёшь?ОФФ не сплю не ем... Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 winnie Тоже не совсем рационально... Есть у меня мысля, сейчас может даже воплощу... Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 Итак, я вот какой изврат навыдумывал... Жду критику:modunctions.php FIND: function post_delete($id) { global $std, $ibforums, $DB; $posts = array(); $attach_tid = array(); $topics = array(); ADD BELOW: $author_id = array(); $num_to_del = array(); FIND: //--------------------------------------- // Get Stuff //--------------------------------------- $DB->simple_construct( array( 'select' => 'pid, topic_id', 'from' => 'posts', 'where' => 'pid'.$pid ) ); $DB->simple_exec(); while ( $r = $DB->fetch_row() ) { $posts[ $r['pid'] ] = $r['topic_id']; $topics[ $r['topic_id'] ] = 1; } REPLACE: //--------------------------------------- // Get Stuff //--------------------------------------- $DB->simple_construct( array( 'select' => 'author_id, pid, topic_id', 'from' => 'posts', 'where' => 'pid'.$pid ) ); $DB->simple_exec(); while ( $r = $DB->fetch_row() ) { $posts[ $r['pid'] ] = $r['topic_id']; $topics[ $r['topic_id'] ] = 1; $author_id[$r['author_id']]++; } FIND: //--------------------------------------- // delete the post //--------------------------------------- $DB->simple_exec_query( array( 'delete' => 'posts', 'where' => "pid".$pid ) ); //--------------------------------------- // Update the stats //--------------------------------------- ADD BELOW: if ($this->forum['inc_postcount']) { if ( count($author_id) > 0 ) { foreach ($author_id as $member_id => $posts_to_del) { $num_to_del[$posts_to_del] .= $member_id." "; } foreach ($num_to_del as $num => $auth) { $authorids = " IN(".implode( ",", explode (" ", rtrim ($auth)) ).")"; $DB->simple_exec_query( array( 'update' => 'members', 'set' => "posts = posts - ".$num, 'where' => "id{$authorids}") ); } } } Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 $author_id[$r['author_id']]++; хех с этим согласен- странно почему я не заюзал- глюкину кстати сразу есть глюк..если удаляете из корзины.. а у вас стоит проверка на форум (счетчик постов вкл/выкл) .. вообщем проверка конечно нужна, но более продвинутая, и честно говоря пока не знаю как ее организовать.на счет запроса к базе мемберов на апдейт ее разве такой запрос возможен? Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 winnie Проверял, возможен . Группировка по количеству удаляемых постов и создание запросов адекватных только этом числу... Насчет корзины не думал, не юзаю сею фичу... Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 d1pro Проверял, возможен . Группировка по количеству удаляемых постов и создание запросов адекватных только этом числу...да сейчас разобрался- действительно возможен, НО .. не факт что таких запросов будет меньше чем если для каждого пользователя делать запрос.. выгода вообщем не большая... а иногда может и не быть ее на счет корзины.. я юзаю- фича полезная да и многие думаю будут юзать, а вот как быть с ней пока никаких идей.. вообщем будем думать.. Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 winnie Если удалять кучу постов разных юзеров, оставивших каждый по одному посту например, будет всего один запрос, а не куча... Ну в общем-то тоже выгода сомнительная, но именно при модерировании имхо будет выдавать меньше запросов... Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 d1pro Если удалять кучу постов разных юзеров, оставивших каждый по одному посту например, будет всего один запрос, а не куча... Ну в общем-то тоже выгода сомнительная, но именно при модерировании имхо будет выдавать меньше запросов...вообщем в этом вопросе думаю мы к ощему мнению не придем и поэтому думаю надо направить мыслительную деятельность на то, как проверить из какого форума удаляем посты (топики) при наличии корзины Добавлено в [mergetime]1091658606[/mergetime] пока только варианты 1. не использовать корзину2. не использвать форумы в которых отключен счетчик постов.. Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 4 Августа 2004 Жалоба Поделиться Опубликовано 4 Августа 2004 winnie А при удалении в корзину разве посты не убавляются? Или нет? На корзине не стоит признат inc_count? Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 5 Августа 2004 Жалоба Поделиться Опубликовано 5 Августа 2004 А при удалении в корзину разве посты не убавляются?нет идет просто перемещение постов/топиков и только при удалении из корзины списываются посты, то есть идет обращение к нашей функции function post_delete($id) и соответственно списываются посты.На корзине не стоит признат inc_count?кхм.. ставить его конечно можно, НО.. смысл.. счетчик у нас списываться не будет никогда, хотя посты/топики могут попасть в корзину из форума в котором включен счетчик Ссылка на комментарий Поделиться на других сайтах Прочее
Aleks Опубликовано 8 Августа 2004 Жалоба Поделиться Опубликовано 8 Августа 2004 (изменено) Скажите, какой из всех вышеперечисленных способов нормально работает во второй версии СО ВКЛЮЧЕННОЙ КОРЗИНОЙ? Изменено 8 Августа 2004 пользователем Aleks Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 8 Августа 2004 Жалоба Поделиться Опубликовано 8 Августа 2004 оба если нет форумов с выключенными счетчиками + у меня еще описание как удалять кол-во постов при удалении топиков Ссылка на комментарий Поделиться на других сайтах Прочее
Aleks Опубликовано 8 Августа 2004 Жалоба Поделиться Опубликовано 8 Августа 2004 а если есть со включенными. Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 8 Августа 2004 Жалоба Поделиться Опубликовано 8 Августа 2004 увы пока никак.. простыми проверками тут не обойтись к соалению.. есть идеи реализации, но они требуют больших изменений.. так что либо одно либо другоеОФФ в в принципе я думал уже на счет надобности форумов без счетчика.. нужны ли они? ведь обчно они флеймовые.. и их чистят так что.. какая разница есть счетчик или нет.. Ссылка на комментарий Поделиться на других сайтах Прочее
Aleks Опубликовано 8 Августа 2004 Жалоба Поделиться Опубликовано 8 Августа 2004 непорядочек конечно.... делать - так нормально.. с автоперемещением из группы (если ты в нёё помещён по числу постов) Ссылка на комментарий Поделиться на других сайтах Прочее
winnie Опубликовано 8 Августа 2004 Жалоба Поделиться Опубликовано 8 Августа 2004 с автоперемещением из группы (если ты в нёё помещён по числу постов)это то не долго организовать...ОФФ просто пока решаю проблему " как простым способом делать проверку - убавлять не убавлять кол-во постов"просто хаки желательно делать при помощи минимальных исправлений в файлах, для удобства повторения Ссылка на комментарий Поделиться на других сайтах Прочее
Aleks Опубликовано 8 Августа 2004 Жалоба Поделиться Опубликовано 8 Августа 2004 о. возникла идея. а что если не мучить форум и не править сорцы, а просто написать модуль для таскменеджера который с определённой переодичностью пересчитывает все посты? Добавлено в [mergetime]1091992355[/mergetime] ведь править сорцы форума - это далеко не лучший выход. а тут хоть чуть-чуть статистика будет неверна, но всё время будет подправляться. и не надо мучится с вопросом уменьшать счётчик или нет. Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения