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

Разделитель поста для 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";




!все!

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

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

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

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

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

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

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

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

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

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

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

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