urisoft Опубликовано 15 Апреля 2004 Жалоба Поделиться Опубликовано 15 Апреля 2004 Задача для создания мода изложена в этой теме: Вывод новостей в IPDynamic Lite Попытаемся разбить создание мода на несколько задач. Куда сохранять данные ? 1. Нам понадобится хранить информацию о разрешении публиковать тему в качестве новостей.Для этого нам необходимо создать новое поле в таблице, в которой храниться информация о темах. Эта таблица имеет имя ibf_topics. Дадим этому полю имя is_news, тип TINYINT, значение по умолчанию 0.Добавляем новое поле в таблицу запросом:ALTER TABLE `ibf_topics` ADD `is_news` TINYINT( 1 ) DEFAULT '0'; 2. Нам необходимо сохранять информацию о группе пользователей имеющих право публиковать новости.Снова обратимся к таблицам. Создадим новое поле в таблице хранящей данные о группах пользователей. Таблица с именем ibf_groups. Добавим в нее новое поле с именем g_news_man, тип TINYINT, значение по умолчанию 0.Запрос для добавления поля:ALTER TABLE `ibf_groups` ADD `g_news_man` TINYINT( 1 ) DEFAULT '0'; Как добавить новый чекбокс ? Нам понадобиться изменять файлы которые имеют отношение к форме создания темы.Вот эти файлы:/sources/lib/post_new_post.php/sources/Post.php/Skin/X/skin_post.php/lang/X/lang_post.php 3. Изменяем skin_post.phpМы хотим вставить новый чекбокс после поля подписки на тему. В skin_post.php находим <!--IBF.TRACK--> и следующей строчкой вставляем <!--IBF.NEWS_CHECK-->. Таким образом мы "отмечаем" место куда будем вставлять наш чекбокс. Добавленная нами строчка должна быть закомментирована (начинаться на '<!--' и оканчиваться на '-->') и иметь уникальное имя.Добавим функцию для отображения чекбокса. Находим чуть ниже: function get_box_enableemo($checked) {вставляем выше:function get_box_newscheck() { global $ibforums; return <<<EOF <br /><input type='checkbox' name='newscheck' class='checkbox' value='yes' /> {$ibforums->lang['enable_newscheck']} EOF; }Тут стоит отметить, что мы дали нашему чекбоксу имя newscheck и указали в качестве подписи к нему {$ibforums->lang['enable_newscheck']}.Если Вы посмотрите внимательнее, то увидите, что практически такие же функции используются для вывода чекбокса подписки на тему (функция get_box_enabletrack), для чекбокса разрешения смайлов (функция get_box_enableemo) и для чекбокса разрешения подписи пользователя (функция get_box_enablesig). То есть мы не придумали ничего нового, а просто сделали по аналогии с уже существующими функциями. 4. Изменяем lang_post.phpДля того, что бы мы увидели подпись к чекбоксу, нам надо эту подпись создать.Находим:$lang = array (Вставляем ниже:'enable_newscheck' => "<strong>Публиковать</strong> как новость ?", 5. Изменяем Post.phpНам необходимо проверить права пользователя на публикацию новости и убедиться, что создается новая тема.Находим функцию которая добавляет чекбоксы в форму ввода сообщения. Эта функция html_checkboxes. Находим в ней следующую строчку:$this->output = str_replace( '<!--IBF.EMO-->' , $this->html->get_box_enableemo( $default_checked['emo'] ) , $this->output );Добавляем выше:if ($ibforums->member['g_news_man'] and $type == "") { $this->output = str_replace( '<!--IBF.NEWS_CHECK-->', $this->html->get_box_newscheck(), $this->output ); }Данным кодом мы заменяем ранее добавленный нами уникальный идентификатор (<!--IBF.NEWS_CHECK-->) на содержимое нами же добавленной функции get_box_newscheck. Таким образом мы добавляем чекбокс в финальный HTML код если пользователю разрешено публиковать новости. Обработка данных. 6. Изменяем post_new_post.phpТеперь нужно позаботиться об обработке данных. Найдем функцию создания новой темы (add_new_topic). Добавим наше новое поле в массив и заодно присвоим ему значение в соответствии с состоянием чекбокса и разрешением на публикацию в качестве новости для текущего пользователя.Найдем:$this->topic = array(Добавим ниже:'is_news' => ($ibforums->member['g_news_man'] == 1 and $ibforums->input['newscheck'] == 'yes') ? 1 : 0, Вывод результатов. 7. Для вывода новостей нам понадобится изменить IPDynamicLite.Файл: /sources/dynamiclite/csite.phpДля того, чтобы отображались только темы разрешенные нами для публикации, нам нужно изменить запрос.Находим:WHERE t.forum_id IN (-1{$ibforums->vars['csite_article_forum']}) $qeДанная часть запроса отвечает за отбор тем из форумов указанных в настройке.Заменяем на:WHERE t.is_news $qeЕсли нужно объеденить и отображать только темы из определенных в настройке форумов для которых разрешена публикация в качестве новостей, тогда заменяем на:WHERE t.forum_id IN (-1{$ibforums->vars['csite_article_forum']}) AND t.is_news $qeВажно: Данный запрос встречается дважды, изменить надо оба запроса. Настройки. 8. Чуть не забыл о разрешении на публикацию новостей Нам нужен файл: /sources/Admin/ad_groups.phpНаходим в нем:'g_reply_other_topics' => $IN['g_reply_other_topics'],Добавляем выше:'g_news_man' => $IN['g_news_man'],Ну и добавим саму опцию.Найдем: $ADMIN->html .= $SKIN->add_td_row( array( "<b>Can view board?</b>" , $SKIN->form_yes_no("g_view_board", $group['g_view_board'] ) ) );Добавим ниже: $ADMIN->html .= $SKIN->add_td_row( array( "<b>Can post news to IPDynamicLite?</b>" , $SKIN->form_yes_no("g_news_man", $group['g_news_man'] ) ) ); Вот собственно и все.Все изложенное выше не претендует на руководство по написанию модов (хаков). Но если это поможет кому-то в освоении форума, я буду только рад. Ну и в качестве "домашнего задания": Может кто напишет отмену публикации темы в новостях и разрешение публикации уже существующих тем ? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Momus Опубликовано 16 Апреля 2004 Жалоба Поделиться Опубликовано 16 Апреля 2004 urisoftСПАСИБО!!! Отлично!Замечательно работает только вотWHERE t.forum_id IN (-1{$ibforums->vars['csite_article_forum']}) AND t.is_news $qeтак не работает Всеравно выводит только те, темы, которые отмечены галочкой "Публиковать как новость" И еще вопросик, а количество выводимых новостей так же будет, как поставлено в настройках IPDynamic Lite? Ну и в качестве "домашнего задания": Может кто напишет отмену публикации темы в новостях и разрешение публикации уже существующих тем ?Это я бы с удовольствием, да в PHP ни бум-бум А вот разрешение публикации уже существующих тем было бы тоже здорово...... хотя..... вечерком дома возьму умную книжку, и буду попытаться Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
urisoft Опубликовано 16 Апреля 2004 Автор Жалоба Поделиться Опубликовано 16 Апреля 2004 Momus так не работает Всеравно выводит только те, темы, которые отмечены галочкой "Публиковать как новость"Угу. Может я не так выразился. При таком запросе будут выводиться только отмеченные темы и только из разрешенных форумов. К примеру если ты форум "Софт" не внес в список разрешенных, то даже с отмеченной галочкой тема из этого форума не попадет в новости. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Momus Опубликовано 16 Апреля 2004 Жалоба Поделиться Опубликовано 16 Апреля 2004 urisoft Ааааа.... вот оно как Вот теперь понятно Беру свои слова обратно Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Momus Опубликовано 20 Апреля 2004 Жалоба Поделиться Опубликовано 20 Апреля 2004 Не получается у меня с "домашним заданием" Может подскажет кто, как бы еще добавить опцию эту в форму быстрого ответа ( что бы в качестве новостей выводились и просто ответы)И что-бы опция была при нажатии редактировать.( что бы можно было в новости добавлять уже существующие посты.) Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Shader Опубликовано 27 Мая 2004 Жалоба Поделиться Опубликовано 27 Мая 2004 Очень интересный мод! А можно как то сделать, так, что бы новость выводилась не в IPDynamic Lite, а в отдельный текстовый файл! Типо ssi.php?a=news ? Хотелось бы, что бы когда редактируешь чью-то новость можно было бы добовлять тему в эту новостную ленту. И еще сделать, так, что бы к примеру был виден только текст и то не полный, а только начало, или только прикрепленная картинка, но с определенным размером. Дело в том, что у меня на форуме есть раздел творчества и там пишут стихи, рассказы, рисуют картинки. Вот хотелось бы самые интересные и лучшие работы попадали и в такой же раздел сайта. А так нажал администратор "редактировать тему" в форуме и внизу добовляй галочки типо "Добавить в рассказы" или "Добаить в рисунки". И еще хотелось бы, что бы к примеру если добавил в рассказы, то к примеру только первый абзац был виден, а потом дана ссылка на тему в форуме, а форуме уже это тема была бы полностью. Или же например если добавить рисунок, то он создавал или оптимизировал рисунок для сайта и убирал все написи, котрый написал пользователь в теме. Я знаю, что я много хочу, но просто мои администраторы и модераторы умеют пользоватся только форумом, и приходится на сайт добовлять все самому, а так было бы проще. Я думаю кому нибудь это тоже пригодилось. Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Elvis271 Опубликовано 29 Мая 2004 Жалоба Поделиться Опубликовано 29 Мая 2004 Тээээкс...А в портале 1.3 нужно где че менять? function news($title,$newsforums,$maxnews,$newscut=false,$newscutchars=200) { global $DB, $std, $ibforums; $output=""; $output .= $this->html->news_header($title); if(!$maxnews) $maxnews=5; if(!$newsforums) $newsforums="0"; $dbresult=$DB->query(sprintf("SELECT p.*,t.title,t.posts FROM ibf_posts p LEFT JOIN ibf_topics t ON p.topic_id=t.tid where p.forum_id IN (%s) AND t.approved=1 group by p.topic_id order by p.post_date DESC LIMIT 0,%d", $newsforums, $maxnews)); while ($entry = mysql_fetch_assoc($dbresult)) { $data = array("autor" => sprintf("<a href=\"{$this->url}?showuser=%d&s={$ibforums->session_id}\">%s</a>", $entry['author_id'], $entry['author_name']), "date" => $std->get_date($entry['post_date'], 'LONG'), "title" => $entry['title'], "go" => sprintf("<a href=\"{$this->url}?showtopic=%d&s={$ibforums->session_id}\">%s</a>", $entry['topic_id'], $ibforums->lang['go_topic']), ); $output .= $this->html->news_entry_header($data); //cut the news .. only if needed if($newscut) { $newsentry=$this->parser->unconvert($entry['post']); if(strlen($newsentry) > $newscutchars) { $newsentry=substr($newsentry,0,$newscutchars); $newsentry=$this->parser->convert(array( 'TEXT' => $newsentry, 'SMILIES' => 0, 'CODE' => 1, 'SIGNATURE' => 0, 'HTML' => 1)); if(preg_match("#\[(b|u|i|s|quote|code)\]#mi",$newsentry,$re)) { $newsentry=$this->parser->convert(array( 'TEXT' => $this->parser->unconvert($newsentry)."[/".$re[1]."]", 'SMILIES' => 1, 'CODE' => 1, 'SIGNATURE' => 0, 'HTML' => 1)); } $entry['post']=$newsentry."...<br/>".sprintf("<a href=\"{$this->url}?showtopic=%d&s={$ibforums->session_id}\">%s</a>", $entry['topic_id'],"<b>(".$ibforums->lang['read_more'].")</b>"); } } if ($ibforums->vars['post_wordwrap'] > 0) { $entry['post'] = $this->parser->my_wordwrap($entry['post'], $this->settings['post_wordwrap']); } $entry['post'] = str_replace("<br>", "<br/>", $entry['post']); $output .= $this->html->news_entry(array("news" => $this->parser->post_db_parse($entry['post'], 1), "go" => $data['go'], "comm" => $entry['posts'])); } $output .= $this->html->news_foot(); return $output; } Я так понял вроде это $dbresult=$DB->query(sprintf("SELECT p.*,t.title,t.posts FROM ibf_posts p LEFT JOIN ibf_topics t ON p.topic_id=t.tid where p.forum_id IN (%s) AND t.approved=1 group by p.topic_id order by p.post_date DESC LIMIT 0,%d", $newsforums, $maxnews));нужно заменить на это$dbresult=$DB->query(sprintf("SELECT p.*,t.title,t.posts FROM ibf_posts p LEFT JOIN ibf_topics t ON p.topic_id=t.tid where t.is_news AND p.forum_id IN (%s) AND t.approved=1 group by p.topic_id order by p.post_date DESC LIMIT 0,%d", $newsforums, $maxnews)); Я прав? Теоретически? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Elvis271 Опубликовано 30 Мая 2004 Жалоба Поделиться Опубликовано 30 Мая 2004 Да, я проверил и оказался прав Вот тока настройки бы пошире сделать, например чтобы можно было выбирать из какого форума тока с галочкой импортировать сообщения а у какого все... Добавлено в [mergetime]1085875894[/mergetime] И кстати почему кады нжимаешь отредактировать чекбоксика уже нет и как бы сделать чтобы не только первое сообщение так нароить можно было Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Elvis271 Опубликовано 6 Июня 2004 Жалоба Поделиться Опубликовано 6 Июня 2004 Ну и в качестве "домашнего задания": Может кто напишет отмену публикации темы в новостях и разрешение публикации уже существующих тем ?Я написал через Moderate.phpМогу выложить если нужно Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Momus Опубликовано 7 Июня 2004 Жалоба Поделиться Опубликовано 7 Июня 2004 Elvis271 Нужно конечно, выложи плз Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
tstf Опубликовано 30 Января 2005 Жалоба Поделиться Опубликовано 30 Января 2005 для 2,0 есть таоке? Цитата Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения
Присоединиться к обсуждению
Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.