DStream
Advanced Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Умышленно пишу отдельной темой, так как это пока еще сырой вариант. Проверен на локалхосте и несколько минут крутится на живом форуме. В ходе написания было несколько идей разных путей реализации. Хотелось бы их обсудить и уже финальный вариант внести в БД модификаций и добавлений. Итак: Название: Фиксация первого сообщения в многостраничных топиках Описание: Позволяет закрепить первое сообщение в длинном многостраничном топике для того, чтобы оно отображалось на каждой странице обсуждения. Применение: Например подготовка к какой-либо тусовке, где автор (инициатор) топика собирает список и корректирует место, время и дату сбора. Версия: 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_FIRST_POST' => q!Закрепить первое сообщение в теме!, 'UNPIN_FIRST_POST' => q!Освободить первое сообщение в теме!, | 5. В файле Languages/{your lang}/ModerateWords.pm ищем Цитата: и ниже добавляем Цитата: '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'}"); } | Продолжение завтра... | Всего записей: 605 | Зарегистр. 03-05-2003 | Отправлено: 02:15 23-01-2004 | Исправлено: DStream, 09:32 06-10-2005 |
|