Умышленно пишу отдельной темой, так как это пока еще сырой вариант. Проверен на локалхосте и несколько минут крутится на живом форуме. В ходе написания было несколько идей разных путей реализации. Хотелось бы их обсудить и уже финальный вариант внести в БД модификаций и добавлений.
Итак:
Название: Фиксация первого сообщения в многостраничных топиках
Описание: Позволяет закрепить первое сообщение в длинном многостраничном топике для того, чтобы оно отображалось на каждой странице обсуждения.
Применение: Например подготовка к какой-либо тусовке, где автор (инициатор) топика собирает список и корректирует место, время и дату сбора.
Версия: iB 3.1.2a mySQL (Вероятнее всего применим и к iB 3.1.1 и должен работать с DBM)
Изменяемые файлы:
Sources/Topic.pm
Sources/Moderate.pm
Skin/{your skin}/TopicView.pm
Skin/{your skin}/Styles.pm
Languages/{your lang}/TopicWords.pm
Languages/{your lang}/ModerateWords.pm
Database/config/forum_posts.cfg
ib_forum_posts
Автор: DStream D-Stream@mail.ru
1. Сохраняем изменяемые файлы (backup) и таблицу ib_forum_posts
2. Добавляем в таблицу ib_forum_posts еще одну колонку PINNED_FIRST_POST тип: tinyint(1), allow null. Это можно сделать через web-фейс к mySQL или в виде запроса
Цитата:
3. В файле Database/config/forum_posts.cfg ищем
Цитата:
и добавляем строку
Цитата:
4. В файле Languages/{your lang}/TopicWords.pm
ищем
Цитата:
Цитата:
5. В файле Languages/{your lang}/ModerateWords.pm
ищем
Цитата:
Цитата:
6. В файле Skin/{your skin}/Styles.pm ищем
Цитата:
Цитата:
7. В файле Sources/Moderate.pm:
ищем
Цитата:
Цитата:
ищем
Цитата:
Цитата:
Продолжение завтра...
Итак:
Название: Фиксация первого сообщения в многостраничных топиках
Описание: Позволяет закрепить первое сообщение в длинном многостраничном топике для того, чтобы оно отображалось на каждой странице обсуждения.
Применение: Например подготовка к какой-либо тусовке, где автор (инициатор) топика собирает список и корректирует место, время и дату сбора.
Версия: iB 3.1.2a mySQL (Вероятнее всего применим и к iB 3.1.1 и должен работать с DBM)
Изменяемые файлы:
Sources/Topic.pm
Sources/Moderate.pm
Skin/{your skin}/TopicView.pm
Skin/{your skin}/Styles.pm
Languages/{your lang}/TopicWords.pm
Languages/{your lang}/ModerateWords.pm
Database/config/forum_posts.cfg
ib_forum_posts
Автор: DStream D-Stream@mail.ru
1. Сохраняем изменяемые файлы (backup) и таблицу ib_forum_posts
2. Добавляем в таблицу ib_forum_posts еще одну колонку PINNED_FIRST_POST тип: tinyint(1), allow null. Это можно сделать через web-фейс к mySQL или в виде запроса
Цитата:
alter table ib_forum_posts
add column PINNED_FIRST_POST tinyint(1) null after ATTACH_TYPE,
type=MyISAM;
3. В файле Database/config/forum_posts.cfg ищем
Цитата:
%{ $COLS } = ( POST_ID => [0, 'update', 10, 1],
AUTHOR => [1, 'string', 32 ],
ENABLE_SIG => [2, 'num' , 1 ],
ENABLE_EMO => [3, 'num' , 1 ],
IP_ADDR => [4, 'string', 16, 1],
POST_DATE => [5, 'num' , 10, 1],
POST_ICON => [6, 'num' , 2 ],
POST => [7, 'text' , -1 ],
AUTHOR_TYPE => [8, 'num' , 1 ],
QUEUED => [9, 'num' , 1 ],
TOPIC_ID => [10,'num' , 10, 1],
FORUM_ID => [11,'num' , 5 , 1],
ATTACH_ID => [12,'string', 64, ],
ATTACH_HITS => [13,'num' , 5 ],
ATTACH_TYPE => [14,'string', 128 ],
и добавляем строку
Цитата:
PINNED_FIRST_POST => [2, 'num' , 1 ],
4. В файле Languages/{your lang}/TopicWords.pm
ищем
Цитата:
PIN_TOPIC =>и добавляем после этой строки
Цитата:
'PIN_FIRST_POST' => q!Закрепить первое сообщение в теме!,
'UNPIN_FIRST_POST' => q!Освободить первое сообщение в теме!,
5. В файле Languages/{your lang}/ModerateWords.pm
ищем
Цитата:
p_moved =>и ниже добавляем
Цитата:
'p_pin_first_post' => q!Первое сообщение закреплено!,
'p_unpin_first_post' => q!Первое сообщение освобождено!,
6. В файле Skin/{your skin}/Styles.pm ищем
Цитата:
'P_WEBSITE' => qq!<img src="$iB::INFO->{'IMAGES_URL'}/Skin/Default/images/pb_website.gif" border="0" alt="WEB">!,и ниже добавляем
'P_YIM' => qq!<img src="$iB::INFO->{'IMAGES_URL'}/Skin/Default/images/pb_yahoo.gif" border="0" alt="YIM">!,
Цитата:
'P_PIN_FIRST' => qq!<img src="$iB::INFO->{'IMAGES_URL'}/Skin/Default/images/f_pin.gif" border="0" alt="Прикрепленное первое сообщение">!,не уверен, что f_pin.gif есть у всех, но речь идет о маленькой иконке типа pin topic и т.п.
7. В файле Sources/Moderate.pm:
ищем
Цитата:
my %Mode = ( '00' => \&CloseForm,и добавляем в конце
'01' => \&OpenForm,
'02' => \&MoveForm,
'03' => \&DeleteForm,
Цитата:
'21' => \&PinFirstPost,
'22' => \&UNPinFirstPost
ищем
Цитата:
sub UNPinTopic {и добавляем после
my ($obj, $db) = @_;
$obj->{'MODE'} = 'UNPIN_TOPIC';
$obj->CheckAuthorisation($db);
$std->Error( DB => $db, LEVEL=>'1',MESSAGE=>'moderate_no_permission') unless $obj->{'PASSED'} == 1;
$db->update( TABLE => 'forum_topics',
KEY => $obj->{'.topic_id'},
ID => $obj->{'.forum_id'},
VALUES => { PIN_STATE => 0 }
) || die $db->{'error'};
$output->redirect_screen(TEXT => $Moderate::lang->{p_unpinned}, URL => "act=ST;f=$obj->{'.forum_id'};t=$obj->{'.topic_id'}");
}
Цитата:
sub PinFirstPost {
my ($obj, $db) = @_;
$obj->{'MODE'} = 'PIN_FIRST_POST';
$obj->CheckAuthorisation($db);
$std->Error( DB => $db, LEVEL=>'1',MESSAGE=>'moderate_no_permission') unless $obj->{'PASSED'} == 1;
my $tmpq = $db->query( TABLE => 'forum_posts',
DBID => 'f'.$obj->{'.forum_id'},
ID => $obj->{'.topic_id'},
WHERE => "TOPIC_ID == '$obj->{'.topic_id'}' and QUEUED != '1'",
RANGE => '0 to 1',
SORT_KEY => 'POST_DATE',
);
my $pin_post = @{$tmpq}[0];
my $pin_post_id = $pin_post->{'POST_ID'};
$db->update( TABLE => 'forum_posts',
WHERE => "POST_ID = $pin_post_id",
VALUES => { PINNED_FIRST_POST => '1' }
) || die "T:".$db->{'error'};
$output->redirect_screen(TEXT => $Moderate::lang->{p_pin_first_post}, URL => "act=ST;f=$obj->{'.forum_id'};t=$obj->{'.topic_id'}");
}
sub UNPinFirstPost {
my ($obj, $db) = @_;
$obj->{'MODE'} = 'UNPIN_FIRST_POST';
$obj->CheckAuthorisation($db);
$std->Error( DB => $db, LEVEL=>'1',MESSAGE=>'moderate_no_permission') unless $obj->{'PASSED'} == 1;
my $tmpq = $db->query( TABLE => 'forum_posts',
DBID => 'f'.$obj->{'.forum_id'},
ID => $obj->{'.topic_id'},
WHERE => "TOPIC_ID == '$obj->{'.topic_id'}' and QUEUED != '1'",
RANGE => '0 to 1',
SORT_KEY => 'POST_DATE',
);
my $pin_post = @{$tmpq}[0];
my $pin_post_id = $pin_post->{'POST_ID'};
$db->update( TABLE => 'forum_posts',
WHERE => "POST_ID = $pin_post_id",
VALUES => { PINNED_FIRST_POST => '0' }
) || die "T:".$db->{'error'};
$output->redirect_screen(TEXT => $Moderate::lang->{p_unpin_first_post}, URL => "act=ST;f=$obj->{'.forum_id'};t=$obj->{'.topic_id'}");
}
Продолжение завтра...