mrMad-Cat Опубликовано 12 Ноября 2006 Жалоба Поделиться Опубликовано 12 Ноября 2006 Есть мод для 2.0 по-моему. Его бы переделать... Вещь очень нужная: автор: Anna [url="http://www.ibresource.ru/forums/index.php?showuser=5178"]Anna[/url] особая благодарность за помощь: Dr.Freddy [url="http://www.ibresource.ru/forums/index.php?showuser=1069"]Dr.Freddy[/url] Итак, модификация для разделения поста. Назначение очевидно - смысл такой же как "разделить тему", только для поста. Модификация по смыслу и коду является обратной функции "объединить сообщения". Понятия. 1. Первичный пост - выбранный для разделения пост 2. Вторичный пост - новый пост (с новым pid). Модификация позволяет. 1. Свободно определять содержимой первичного и вторичного постов. 2. Свободно выбирать автора вторичного поста 3. Свободно выбирать положение вторичного поста относительно первичного (на минуту раньше или на минуту позже). 4. Управлять вложенными файлами (оставить в первичном, перенести во вторичный, удалить). Особенности. 1. Вторичный пост создается в той же теме, что и первичный. Уже после этого вы можете делать с ним что хотите, например переместить в другую тему. 2. Для корректной реализации возможности размещения втричного поста ПЕРЕД первичным, необходимо в настройках админки (секция Posts,Polls,Topics) установить Post Order знаенчие Post date, иначе сортировка постов в теме будет по pid. 3. Для работы мода, надо выбрать в теме ОДИН постинг, а затем выбрать в падающем меню управления выбранными постами функцию "разделить один пост". Все поля появившеся формы являются обязательными. установка 1. lang/*/lang_topic.php добавить: // split post 'cpt_post_split' => "Разделить один пост", 2. lang/*/lang_mod.php добавить: //split_post 'cm_master' => 'Оставить в первичном', 'cm_slave' => 'Перенести во вторичный', 'split_master_title' => 'Первичный пост', 'split_slave_title' => 'Вторичный пост', 'split_before' => 'Перед первичным', 'split_after' => 'После первичного', 'split_title' => 'Разделение поста', 'split_master_author' => 'Автор первичного поста', 'split_slave_author' => 'Автор вторичного поста', 'split_master_date' => 'Дата первичного поста', 'split_slave_date' => 'Дата вторичного поста', 'split_master_post' => 'Содержание первичного поста', 'split_slave_post' => 'Содержание вторичного поста', 'split_attach' => 'Разнесение присоединенных файлов', 'split_submit' => 'Разделить пост', 3. Templates/Topic View/TableFooter После <option value="merge">{ipb.lang['cpt_merge']}</option> Добавить ниже <option value="post_split">{ipb.lang['cpt_post_split']}</option> 4. Templates/Moderator Function/ Добавить новый шаблон кнопкой: Add Template Bit Name: uploadbox_post_split Incoming Variables: $attach="" <tr> <td width="1%" align="center"><select name="attach_{$attach['attach_id']}" class="dropdown"><option value="master">{ipb.lang['cm_master']}</option><option value="slave">{ipb.lang['cm_slave']}</option><option value="delete">{$ibforums->lang['cm_delete']}</option></select></td> <td width="1%"><img src="{ipb.vars['mime_img']}/{$attach['image']}" alt="" /></td> <td width="15%" nowrap="nowrap">{$attach['size']}</td> <td width="95%"><a href="{ipb.script_url}act=Attach&type=post&id={$attach['attach_id']}" target="_blank"><b>{$attach['attach_file']}</b></a> #{$attach['attach_pid']}</td> </tr> 5. Templates/Moderator Function/ Добавить новый шаблон кнопкой: Add Template Bit Name: user_pick_box Incoming variables: $author <input name="user_pick" value="{$author}"><br /> <input type="button" name="findusers" onclick="find_users()" value="{ipb.lang['find_user_names']}" /> 6. Templates/Moderator Function/ Добавить новый шаблон кнопкой: Add Template Bit Name: post_split_post_form Incoming variables: $post="",$master_date="",$slave_date="",$author="",$auth_key="",$upload="",$user_pick="" <form name="REPLIER" action="{ipb.script_url}act=mod&CODE=postchoice&tact=post_split&checked=1" method="post"> <input type="hidden" name="act" value="mod" /> <input type="hidden" name="selectedpids" value="{ipb.input['selectedpids']}" /> <input type="hidden" name="auth_key" value="{$auth_key}" /> <input type="hidden" name="t" value="{ipb.input['t']}" /> <input type="hidden" name="f" value="{ipb.input['f']}" /> <input type="hidden" name="st" value="{ipb.input['st']}" /> <div class="borderwrap"> <div class="maintitle">{ipb.lang['split_title']}</div> <table cellspacing="1"> <td colspan=2 align=center width="50%" class="row2"><b>{ipb.lang['split_master_title']}</b></td> <td colspan=2 align=center width="50%" class="row2"><b>{ipb.lang['split_slave_title']}</b></td> <tr> <td width="15%" class="row2"><b>{ipb.lang['split_master_date']}</b></td> <td width="35%" class="row2">{$master_date}</td> <td width="15%" class="row2"><b>{ipb.lang['split_slave_date']}</b></td> <td width="35%" class="row2"><select name="slave_date" class="dropdown">{$slave_date}</select></td> </tr> <tr> <td class="row2"><b>{ipb.lang['split_master_author']}</b></td> <td class="row2">{$author}</td> <td class="row2"><b>{ipb.lang['split_slave_author']}</b></td> <td class="row2">{$user_pick} </td> </tr> <tr> <td class="row2" valign="top"><b>{ipb.lang['split_master_post']}</b></td> <td class="row2"><textarea cols="40" rows="20" name="Master" class="textarea">$post</textarea></td> <td class="row2" valign="top"><b>{ipb.lang['split_slave_post']}</b></td> <td class="row2"><textarea cols="40" rows="20" name="Slave" class="textarea"></textarea></td> </tr> <if="upload != """> <tr> <td class="row2" valign="top"><b>{ipb.lang['split_attach']}</b><div class="desc">{ipb.lang['cm_attach2']}</div></td> <td class="row2" colspan=3> <table cellspacing="1"> $upload </table> </td> </tr> </if> </table> <div class="formsubtitle" align="center"><input type="submit" value="{ipb.lang['split_submit']}" /></div> </div> </form> 7. sources/moderate.php Найти function multi_post_modify() Найти далее case 'merge': $this->multi_merge_post(); break; Добавить ниже case 'post_split': $this->multi_post_split_post(); break; Найти } ?> ВЫШЕ добавить function multi_post_split_post() { global $std, $ibforums, $DB, $print, $forums; //check moderate permissions $passed = 0; if ($ibforums->member['g_is_supmod'] == 1) { $passed = 1; } else if ($this->moderator['delete_post'] == 1) { $passed = 1; } else { $passed = 0; } if ($passed != 1) $this->moderate_error(); //check selected pid if ( (! count( $this->pids )) or ( count($this->pids)>1 ) ) { $std->Error( array( 'LEVEL' => 1, 'MSG' => 'incorrect_use') ); } //load post parsing lib require_once( ROOT_PATH.'sources/lib/post_parser.php' ); $parser = new post_parser(); //check a required action if ( ! $ibforums->input['checked'] ) { //----------------------------------------- // Get post data //----------------------------------------- $master_post = ""; $master_date = ""; $master_author = ""; $dropdown = ""; $author = ""; $seen_author = array(); $upload_html = ""; //fetch post data $DB->query("SELECT p.*, m.name as author_name, t.forum_id FROM ibf_posts p LEFT JOIN ibf_members m ON (p.author_id=m.id) LEFT JOIN ibf_topics t ON (p.topic_id=t.tid) WHERE pid='{$this->pids[0]}'"); $p = $DB->fetch_row(); if ( $std->check_perms( $forums->forum_by_id[ $p['forum_id'] ]['read_perms']) == TRUE ) { $master_post = $parser->unconvert( trim($p['post']) ); $master_date = $std->get_date( $p['post_date'], 'LONG'); $dropdown = "<option value=0>".$ibforums->lang['split_before'].": ".$std->get_date($p['post_date']-60, 'LONG') ."</option><option value=1 selected>".$ibforums->lang['split_after'].": ".$std->get_date($p['post_date']+60, 'LONG') ."</option>"; $master_author = $p['author_name']; } else $this->moderate_error(); //fetch attachment info $DB->query("SELECT * FROM ibf_attachments WHERE attach_pid='{$this->pids[0]}'"); while( $row = $DB->fetch_row() ) { $row['image'] = $ibforums->cache['attachtypes'][ $row['attach_ext'] ]['atype_img']; $row['size'] = $std->size_format( $row['attach_filesize'] ); if ( strlen( $row['attach_file'] ) > 40 ) { $row['attach_file'] = substr( $row['attach_file'], 0, 35 ) .'...'; } $upload_html .= $this->html->uploadbox_post_split($row); } //print our form $java_picker = <<<HTM <script type="text/javascript"> <!-- function find_users(){ url = "index.{$ibforums->vars['php_ext']}?act=legends&CODE=finduser_one&s={$ibforums->session_id}&entry=textarea&name=user_pick&sep=none"; window.open(url,"FindUsers","width=400,height=250,resizable=yes,scrollbars=yes"); } --> </script> HTM; $user_pick = $java_picker.$this->html->user_pick_box($master_author); $this->output .= $this->html->post_split_post_form( trim($master_post), $master_date, $dropdown, $master_author, $std->return_md5_check(), $upload_html, $user_pick ); if ( $this->topic['tid'] ) { $this->nav[] = "<a href='{$ibforums->base_url}showtopic={$this->topic['tid']}'>{$this->topic['title']}</a>"; } $this->nav[] = $ibforums->lang['split_title']; $this->page_title = $ibforums->lang['split_title']; $print->add_output( $this->output ); $print->do_output( array( 'TITLE' => $this->page_title, 'JS' => 0, NAV => $this->nav ) ); } else { //start action here $ibforums->input['slave_date'] = intval($ibforums->input['slave_date']); //check for required values if ( !( $ibforums->input['selectedpids'] and $ibforums->input['user_pick'] and $ibforums->input['Master'] and $ibforums->input['Slave'])) { $std->Error( array( 'LEVEL' => 1, 'MSG' => 'incorrect_use') ); } $Master = $parser->convert( array( 'TEXT' => $ibforums->input['Master'], 'SMILIES' => 1, 'CODE' => 1, 'HTML' => 0 ) ); $Slave = $parser->convert( array( 'TEXT' => $ibforums->input['Slave'], 'SMILIES' => 1, 'CODE' => 1, 'HTML' => 0 ) ); //find required user for slave post $DB->query("SELECT id, name FROM ibf_members WHERE LOWER(name)=LOWER('{$ibforums->input[user_pick]}')"); if (!$r=$DB->fetch_row()) { $std->Error( array( 'LEVEL' => 1, 'MSG' => 'incorrect_use') ); } //updating Master post $DB->do_update("posts", array('post' => $Master), "pid='{$this->pids[0]}'"); //insert Slave post $DB->query("SELECT p.*, m.name as author_name, t.forum_id FROM ibf_posts p LEFT JOIN ibf_members m ON (p.author_id=m.id) LEFT JOIN ibf_topics t ON (p.topic_id=t.tid) WHERE pid='{$this->pids[0]}'"); $p = $DB->fetch_row(); $slave_date = $ibforums->input[slave_date] ? $p[post_date]+60 : $p[post_date]-60; $slave_post_key = md5(time()); $DB->do_insert('posts', array('author_id' => $r[id], 'author_name' => $r[name], 'use_sig' => '1', 'use_emo' => '1', 'ip_address' => $p['ip_address'], 'post_date' => $slave_date, 'post' => $Slave, 'topic_id' => $p[topic_id], 'post_key' => $slave_post_key)); $slave_pid = $DB->get_insert_id(); //now fixxing attachments $attach_master = array(); $attach_slave = array(); $attach_kill = array(); foreach ($ibforums->input as $key => $value) { if ( preg_match( "/^attach_(\d+)$/", $key, $match ) ) { if ( $ibforums->input[$match[0]] == 'master' ) { //echo $key." - master"; $attach_master[] = $match[1]; } else if ( $ibforums->input[$match[0]] == 'slave' ) { //echo $key." - slave"; $attach_slave[] = $match[1]; } else if ( $ibforums->input[$match[0]] == 'delete' ) { //echo $key." - delete"; $attach_kill[] = $match[1]; } } } //proceed Master attachments //... no any action needed //proceed Slave attachments if ( count( $attach_slave ) ) { //echo "<br>proceed slave...<br>"; //echo "slave_pid: ".$slave_pid."<br>"; //echo "slave_post_key: ".$slave_post_key."<br>"; //echo "slave member id: ".$r[id]."<br>"; //echo "attach ids: ".implode(",",$attach_slave)."<br>"; $DB->do_update( 'attachments', array( 'attach_pid' => $slave_pid, 'attach_post_key' => $slave_post_key, 'attach_member_id' => $r[id] ), 'attach_id IN('.implode(",",$attach_slave).')' ); } //proceed Kill attachments if ( count( $attach_kill ) ) { $DB->simple_construct( array( "select" => '*', 'from' => 'attachments', 'where' => 'attach_id IN('.implode(",",$attach_kill).')') ); $DB->simple_exec(); 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'] ); } } $DB->simple_construct( array( 'delete' => 'attachments', 'where' => 'attach_id IN('.implode(",",$attach_kill).')' ) ); $DB->simple_exec(); } //recount stats $this->modfunc->rebuild_topic($p[topic_id], 0); $this->modfunc->forum_recount($p[forum_id]); $this->modfunc->stats_recount(); //log $this->moderate_log("Split post: Master #{$this->pids[0]}, Slave #{$slave_pid}"); } } Огромное спасибо Dr.Freddy за исправления по вышеуказанной функции, а так же нижеследующие дополнения-исправления. в файле sources/lib/modfunctions.php в функции rebuild_topic правим: //----------------------------------------- // Get first post info //----------------------------------------- $DB->simple_construct( array( 'select' => 'post_date, author_id, author_name, pid', 'from' => 'posts', 'where' => "topic_id=$tid", 'order' => 'pid ASC', 'limit' => array(0,1) ) ); $DB->simple_exec(); ИЗМЕНИТЬ на: //----------------------------------------- // Get first post info //----------------------------------------- $DB->simple_construct( array( 'select' => 'post_date, author_id, author_name, pid', 'from' => 'posts', 'where' => "topic_id=$tid", 'order' => 'post_date ASC', 'limit' => array(0,1) ) ); $DB->simple_exec(); Далее - модифицируем функцию mod_func_get_last_post в файле: sources/sql/mysql_queries.php return "SELECT p.post_date, p.topic_id, p.author_id, p.author_name, p.pid, t.forum_id FROM ".SQL_PREFIX."posts p LEFT JOIN ".SQL_PREFIX."topics t ON (p.topic_id=t.tid) WHERE topic_id={$a['tid']} and queued=0 ORDER BY pid DESC LIMIT 0,1"; ЗАМЕНИТЬ на: return "SELECT p.post_date, p.topic_id, p.author_id, p.author_name, p.pid, t.forum_id FROM ".SQL_PREFIX."posts p LEFT JOIN ".SQL_PREFIX."topics t ON (p.topic_id=t.tid) WHERE topic_id={$a['tid']} and queued=0 ORDER BY post_date DESC LIMIT 0,1"; и такую же функцию mod_func_get_last_post в файле: sources/sql/mysql_admin_quries.php return "SELECT p.post_date, p.topic_id, p.author_id, p.author_name, p.pid, t.forum_id FROM ".SQL_PREFIX."posts p LEFT JOIN ".SQL_PREFIX."topics t ON (p.topic_id=t.tid) WHERE topic_id={$a['tid']} and queued <> 1 ORDER BY pid DESC LIMIT 0,1"; ЗАМЕНИТЬ на: return "SELECT p.post_date, p.topic_id, p.author_id, p.author_name, p.pid, t.forum_id FROM ".SQL_PREFIX."posts p LEFT JOIN ".SQL_PREFIX."topics t ON (p.topic_id=t.tid) WHERE topic_id={$a['tid']} and queued <> 1 ORDER BY post_date DESC LIMIT 0,1"; !все! Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.