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

Разделитель поста для 2.1.х


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

Есть мод для 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";




!все!

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

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

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

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

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

Зарузка...
×
×
  • Создать...

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

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