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

[1.x.x]Перемещение и удаление отдельных сообщений


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

Название: Перемещение и удаление отдельных сообщений

Добавил: theIggs

Добавлен: 21 Июл 2004

Обновлен: 03 Мар 2005

Категория: IP.Board 1.x.x

 

В темах возле постов добавляются галочки, а в выпадающем списке модератора - новые пункты меню: "Удалить выбранные сообщения" и "Переместить выбранные сообщения" в другую тему.

 

Внимательно читайте тему поддержки, там важные сведения!

 

Нажмите здесь, чтобы скачать файл

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

  • Ответы 143
  • Создана
  • Последний ответ

Лучшие авторы в этой теме

Лучшие авторы в этой теме

Загружено фотографий

Или лыжи не едут, или есть глюк с javascript, возникающий при перенесении <form method='POST' style='display:inline' выше. А именно если используется форма быстрого ответа, форма, которой оказывается вложенной в форму для модераторских опций, то вылазит ошибка

Event thread: onchange

Error:

name: TypeError

message: Statement on line 1: Expression evaluated to null or undefined and is not convertible to Object: this.form

Backtrace:

  In unknown script

    this.form.where2move.style.visibility = "hidden";

  At unknown location

    {event handler trampoline}

 

форму он эту не видит, как обратится к форме с именем modform я не знаю, каюсь js я не разбирал.

 

Если убрать быстрый ответ все ок.

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

Vanish

Точно! Спасибо за сообщение, всё поправлю на досуге.

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

поискал решение, вроде нашел если заменить this.form на document.modform то все пучком (по части js)

Сами действия еще не проверял =)

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

Кстати, если установлек хак уменьшения количества постов пользователя при удалении его сообщений, то удаление через эту панельку корректно работает ?

 

Я нашел раздел

# Пересчитать статистику темы и форума

 

А для пользователя ?

 

 

P.S. Модератор, я так понимаю, может перемещать только в пределах одного форума сообщения ? А если у него несколько форумов ? Может перекидывать из одного в другой ?

	 //------------------------------------------
 // Не даём нашему модеру зацепить 
 // чужие форумы
 //------------------------------------------
 
   $DB->query("SELECT pid FROM ibf_posts WHERE pid IN ($idz) AND forum_id != {$this->forum['id']}");
 

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

Кстати, если установлек хак уменьшения количества постов пользователя при удалении его сообщений, то удаление через эту панельку корректно работает ?

Нет, наверно. ;)

Ой, не хочется аддоны к аддонам писать... :)

 

P.S. Модератор, я так понимаю, может перемещать только в пределах одного форума сообщения ? А если у него несколько форумов ? Может перекидывать из одного в другой ?

Фиг знает. Логически - должен иметь возможность перемещать из своего в любой. Щас даже проверю. :)

Добавлено в [mergetime]1090614939[/mergetime]

Всё нормально. Модер может переместить сообщения из своего форума в любой другой.

Или это логически неправильно? :D

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

Да в принципе нормально :D Пусть пуляют, так даже хорошо. Он все равно перенесет туда, где этой теме самое подходящее место.

 

А по-поводу удалений, жаааалко ;)theIggs, скажи, могу я убрать опции удаления из твоего мода и оставть только жутко полезное перемещение постов в выделенные темы ?

 

Либо... либо может выдрать тот кусок кода где стоит уменьшение постов пользователя в Хаке постов, и вставить вместо твоего ? (задумчиво)...

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

Я сюда напишу что вместо чего.

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

могу я убрать опции удаления из твоего мода и оставть только жутко полезное перемещение постов в выделенные темы ?

Конечно, флаг в руки. ;)

 

ну попроблвать надо наверное

Вот-вот! Прежде всего - попробуй сам, сделаешь доброе дело. А там уж если чего не получится - поможем. :D

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

Для тех у кого установлен мод закрытия тем с причиной, привожу правильную функцию (если сделаете как в моде, то он работать не будет):

function Mod_Panel($data, $fid, $tid, $key="") {
global $ibforums;
return <<<EOF

<div align='left' style='float:left;width:auto'>
<form method='POST' style='display:inline' name='modform' action='{$ibforums->base_url}'>
<input type='hidden' name='t' value='$tid'>
<input type='hidden' name='f' value='$fid'>
<input type='hidden' name='st' value='{$ibforums->input['st']}'>
<input type='hidden' name='auth_key' value='$key'>
<input type='hidden' name='act' value='Mod'>
<select name='CODE' class='forminput' style="font-weight:bold;color:red" onchange=
"if (this.value=='00') 
{
 this.form.why_close.style.visibility='visible';
         this.form.where2move.style.visibility='hidden';
} else
if (this.value=='67') 
{
 this.form.where2move.style.visibility='visible';
         this.form.why_close.style.visibility='hidden';
} else 
        {
 this.form.where2move.style.visibility='hidden';
         this.form.why_close.style.visibility='hidden';
        }">
<option value='-1' style='color:black'>{$ibforums->lang['moderation_ops']}</option>
$data
</select> <input type='submit' value='{$ibforums->lang['jmp_go']}' class='forminput'>
<br><input type='text' class='textinput' style='width:243px; visibility:hidden' name='why_close' value="Причина закрытия темы" onclick="this.select();"/>
<br><input type='text' class='textinput' style='width:250px; visibility:hidden' name='where2move' value="{$ibforums->lang['where2move']}" onclick="this.select();"/></form>
  </div>


EOF;
}

Добавлено в [mergetime]1090654410[/mergetime]

theIggs

у меня вопросик.

В этом моде, а также в моде закрытия темы с причиной у тебя применён единый принцип - при выборе нужного пункта меню модпанели, появляется текстовое поле, которое и принимает инфу. Но когда этот пункт не выбран, то этого поля нет, но место для него резервируется пустым. Это очень некрасиво.

Нельзя ли сделать также как в IPB в "Опции темы", там когда выбираешь просто в середину вставляется кусок кода (там вставляется таблица). Нельзя ли сделать, чтобы у тебя вставлялось соответствующее текстовое поле, раздвигая при этом комбобокс модпанели и форму быстрого ответа?

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

Кстати, если установлек хак уменьшения количества постов пользователя при удалении его сообщений, то удаление через эту панельку корректно работает ?

показываю как это сделать.

После установки мода найти:

	 //---------------------------------------
 // Вперёд и с песней
 //---------------------------------------

(Кстати с моим ником этот отрывок кода Игса приобретает вполне осмысленное действие :D )

далее вырезаем кусок

	 # Открепить аттачи
 $DB->query("SELECT * FROM ibf_posts WHERE pid IN ({$ibforums->input['pidz']})");
 
 while ($post = $DB->fetch_row())
 {
	 if ($post['attach_id'] != "")
	 {
   if (is_file($this->upload_dir."/".$post['attach_id']))
   {
  	 unlink ($this->upload_dir."/".$post['attach_id']);
   }
	 }
 }

и заменяем его на

  # Открепить аттачи
 $DB->query("SELECT author_id,attach_id FROM ibf_posts WHERE pid IN ({$ibforums->input['pidz']})");

                $ids = array();
 while ($post = $DB->fetch_row())
 {
         $ids[ $post['author_id'] ] ++;
	 if ($post['attach_id'] != "")
	 {
   if (is_file($this->upload_dir."/".$post['attach_id']))
   {
  	 unlink ($this->upload_dir."/".$post['attach_id']);
   }
	 }
 }

 # Уменьшить счётчик сообщений у соответствующих пользователей
                if ( intval($this->forum['inc_postcount']) == 1 ) foreach ($ids as $mid => $count) 
   $DB->query("UPDATE ibf_members SET posts=posts-$count WHERE id='".$mid."'");

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

Song

Нельзя ли сделать также как в IPB в "Опции темы", там когда выбираешь просто в середину вставляется кусок кода (там вставляется таблица). Нельзя ли сделать, чтобы у тебя вставлялось соответствующее текстовое поле, раздвигая при этом комбобокс модпанели и форму быстрого ответа?

Вот какой вид функции Mod_Panel() у меня при этом получился:

function Mod_Panel($data, $fid, $tid, $key="") {
global $ibforums;
return <<<EOF
<div align='left' style='float:left;width:auto'>
<form method='POST' style='display:inline' name='modform' action='{$ibforums->base_url}'>
<input type='hidden' name='t' value='$tid'>
<input type='hidden' name='f' value='$fid'>
<input type='hidden' name='st' value='{$ibforums->input['st']}'>
<input type='hidden' name='auth_key' value='$key'>
<input type='hidden' name='act' value='Mod'>
<select name='CODE' class='forminput' style="font-weight:bold;color:red" onchange=
"var w2m, wc;
if (document.getElementById){w2m=document.getElementById('w2m');wc=document.getElementById('wc');
} else if (document.all){w2m=document.all['w2m'];wc=document.all['wc'];
} else if (document.layers){w2m=document.layers['w2m'];wc=document.layers['wc'];
}
if (this.value=='00'){
w2m.style.display = 'none';
wc.style.display = '';
} else if (this.value=='67'){
wc.style.display = 'none';
w2m.style.display = '';
} else {
wc.style.display = 'none';
w2m.style.display = 'none';
}">
<option value='-1' style='color:black'>{$ibforums->lang['moderation_ops']}</option>
$data
</select> <input type='submit' value='{$ibforums->lang['jmp_go']}' class='forminput'>
<div style='display:none;' id='wc'><input type='text' class='textinput' style='width:250px;' name='why_close' value="Причина закрытия темы" onclick="this.select();" /></div>
<div style='display:none;' id='w2m'><input type='text' class='textinput' style='width:250px;' name='where2move' value="{$ibforums->lang['where2move']}" onclick="this.select();"/></div></form>
</div>
EOF;
}

Напоминаю для всех, что функция Mod_Panel() находится в файле skin_topic.php.

 

Song, спасибо тебе большое за дополнения! :D

 

И ещё, маленькая рекомендация для всех - для большего удобства модерирования ставьте мод Просмотр всех страниц темы по ссылке All (вариант его можно найти тут или .поиском по нашему форуму.

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

В общем, постарался я учесть замечания Vanishа (логично, что формы, вложенные друг в друга, не хотят работать), но получается какая-то галиматья. Пришлось переменные на уровне JavaScript разбирать.

Если кто знает более простой метод, поделитесь. :D

pius.zip

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

Для совмещения с хаком why close topic (причина закрытия темы) функция Mod_Panel() примет вид:

function Mod_Panel($data, $fid, $tid, $key="") {
global $ibforums;
return <<<EOF
<div align='left' style='float:left;width:auto'>
<form method='POST' style='display:inline' name='modform' action='{$ibforums->base_url}'>
<input type='hidden' name='t' value='$tid' />
<input type='hidden' name='f' value='$fid' />
<input type='hidden' name='st' value='{$ibforums->input['st']}' />
<input type='hidden' name='auth_key' value='$key' />
<input type='hidden' name='act' value='Mod' />
<select name='CODE' class='forminput' style="font-weight:bold;color:red" onchange=
"var w2m, wc;
if (document.getElementById){w2m=document.getElementById('w2m');wc=document.getElementById('wc');
} else if (document.all){w2m=document.all['w2m'];wc=document.all['wc'];
} else if (document.layers){w2m=document.layers['w2m'];wc=document.layers['wc'];
}
if (this.value=='00'){
w2m.style.display = 'none';
wc.style.display = '';
} else if (this.value=='67'){
wc.style.display = 'none';
w2m.style.display = '';
} else {
wc.style.display = 'none';
w2m.style.display = 'none';
}">
<option value='-1' style='color:black'>{$ibforums->lang['moderation_ops']}</option>
$data
</select> <input type='submit' value='{$ibforums->lang['jmp_go']}' class='forminput' onClick='collect_pidz();' />
<script type="text/javascript">
<!--
function collect_pidz()
{
for (var i in document.collect.elements){
 if (i.indexOf('pozt')!=-1){
  var ne=document.createElement("input");
  ne.name=document.collect[i].name;
  ne.type='hidden';
  if (document.collect[i].checked.toString()=='true') ne.value=1; else ne.value=0;
  document.modform.appendChild(ne);
}}}
//-->
</script>
<div style='display:none;' id='wc'><input type='text' class='textinput' style='width:250px;' name='why_close' value="Причина закрытия темы" onclick="this.select();" /></div>
<div style='display:none;' id='w2m'><input type='text' class='textinput' style='width:250px;' name='where2move' value="{$ibforums->lang['where2move']}" onclick="this.select();"/></div></form>
</div>
EOF;
}

Плюс надо не забыть добавить это:

Найти:

<div align='right' class='postlinksbar'>
   <strong><!--{IBF.START_NEW_POLL}--><a href='{$ibforums->base_url}act=Track&f={$data['FORUM']['id']}&t={$data['TOPIC']['tid']}'>{$ibforums->lang['track_topic']}</a> |
   <a href='{$ibforums->base_url}act=Forward&f={$data['FORUM']['id']}&t={$data['TOPIC']['tid']}'>{$ibforums->lang['forward']}</a> |
   <a href='{$ibforums->base_url}act=Print&client=printer&f={$data['FORUM']['id']}&t={$data['TOPIC']['tid']}'>{$ibforums->lang['print']}</a></strong>
</div>

Ниже добавить:

<form method='POST' style='display:inline' name='collect' action='{$ibforums->base_url}'>

Найти:

function TableFooter($data) {
global $ibforums;
return <<<EOF

Заменить на:

function TableFooter($data) {
global $ibforums;
return <<<EOF
</form>

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

Перестал работать перенос сообщений, пишет "Не выбрано ни одного сообщения". По крайней мере в Опере не пашет.

Я так понимаю дело в той функции на ява скрипте, которая собирает отмеченные чекбоксы, явилась узким местом.

theIggs, идеи есть? :D

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

Я так понимаю дело в той функции на ява скрипте, которая собирает отмеченные чекбоксы, явилась узким местом.

Так и есть. Работаю над проблемой, но решения пока не видать.

Вернее, замечено, что если делать

ne.type='text';

вместо 'hidden', то всё работает (но тогда перед отправкой ответа успевают промелькнуть <input>'ы. :D Я решительно не понимаю принципов яваскрипта... ;)

Добавлено в [mergetime]1090682130[/mergetime]

Вот так кажися тоже работает, но не могу нормально оттестировать. :)

<script type="text/javascript">
<!--
function collect_pidz()
{
for (var i in document.collect.elements){
 if (i.indexOf('pozt')!=-1){
  var ne=document.createElement("input");
  ne.name=document.collect[i].name;
  ne.type='text';
  if (document.collect[i].checked.toString()=='true') ne.value=1; else ne.value=0;
  document.modform.appendChild(ne);
  ne.style.display='none';
}}}
//-->
</script>

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

theIggs

я понял в чём проблема нерабочести первого варианта (с формой). Вовсе не из-за того что не хочет браться вложенность форм.

Просто дело в том, что форма (та которая перед чекбоксами) начинается у всех юзеров, а заканчивается - </form> только у модераторов и админов. Поэтому у простых юзеров, она заканчивается формой быстрого ответа, который от этого и не работает. Т.е. на лицо не кратность количества тегов.

 

P.S. А я-то думаю, чего у меня пользователи все кричат, что ничего не работает, а у меня всё ок :D

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

P.S. А я-то думаю, чего у меня пользователи все кричат, что ничего не работает, а у меня всё ок

Странно, а я на локалке проверял из-под админа. :\ Надо ещё раз проверить.

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

Нет, не получается.

document.modform.where2move.style - есть null или не является объектом

:D

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

У меня не было такого из-под себя ни в ослике ни в опере.

Ну ладно, если через яву решится, лучше через яву.

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

Ну вообщем, как получилось у меня:

1) skin_topic.php

Я вернулся к первоначальному варианту, в котором

а) в модпанели у меня ява скрипта нет

б) в PageTop я ввёл переменную:

  <div align='right' class='postlinksbar'>
  <b><!--{IBF.START_NEW_POLL}--><a href='{$ibforums->base_url}act=Track&f={$data['FORUM']['id']}&t={$data['TOPIC']['tid']}'>{$ibforums->lang['track_topic']}</a> |
  <a href='{$ibforums->base_url}act=Forward&f={$data['FORUM']['id']}&t={$data['TOPIC']['tid']}'>{$ibforums->lang['forward']}</a> |
  <a href='{$ibforums->base_url}act=Print&client=printer&f={$data['FORUM']['id']}&t={$data['TOPIC']['tid']}'>{$ibforums->lang['print']}</a>{$data['TOPIC']['fav_text']}</b>
  </div>
{$data['TOPIC']['modform']}  // <-- ТА САМАЯ переменная :)

в) в ф-ии TableFooter я убрал </form>.

 

2) Topics.php

найти

$this->output .= $this->html->PageTop( array( 'TOPIC' => $this->topic, 'FORUM' => $this->forum,  ) );

вставить перед ним

                $this->topic['modform'] = "";
  if ( $this->moderator['mid'] or $ibforums->member['g_is_supmod'] ) $this->topic['modform'] = "<form method='POST' style='display:inline' name='modform' action='{$ibforums->base_url}'>";

 

 

Всё работает для пользователей, гостей, модераторов, админов. Проверял в IE 6.0 и Опере.

Т.е. имеем вложенную, но рабочую форму.

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

В архиве сейчас лежит последняя версия.
Ссылка на комментарий
Поделиться на других сайтах


×
×
  • Создать...