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

Создаем мод своими руками


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

Задача для создания мода изложена в этой теме: Вывод новостей в 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. Чуть не забыл о разрешении на публикацию новостей :D

Нам нужен файл: /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'] )
             )      );

 

 

Вот собственно и все.

Все изложенное выше не претендует на руководство по написанию модов (хаков).

Но если это поможет кому-то в освоении форума, я буду только рад. ;)

 

Ну и в качестве "домашнего задания": Может кто напишет отмену публикации темы в новостях и разрешение публикации уже существующих тем ? :)

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

urisoft

СПАСИБО!!!

 

Отлично!

Замечательно работает :D

 

только вот

WHERE t.forum_id IN (-1{$ibforums->vars['csite_article_forum']}) AND t.is_news $qe

так не работает ;) Всеравно выводит только те, темы, которые отмечены галочкой "Публиковать как новость"

 

И еще вопросик, а количество выводимых новостей так же будет, как поставлено в настройках IPDynamic Lite?

 

 

Ну и в качестве "домашнего задания": Может кто напишет отмену публикации темы в новостях и разрешение публикации уже существующих тем ?

Это я бы с удовольствием, да в PHP ни бум-бум :)

А вот разрешение публикации уже существующих тем было бы тоже здорово.

..... хотя..... вечерком дома возьму умную книжку, и буду попытаться :)

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

Momus

так не работает  Всеравно выводит только те, темы, которые отмечены галочкой "Публиковать как новость"

Угу. Может я не так выразился. При таком запросе будут выводиться только отмеченные темы и только из разрешенных форумов. К примеру если ты форум "Софт" не внес в список разрешенных, то даже с отмеченной галочкой тема из этого форума не попадет в новости.

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

Не получается у меня с "домашним заданием" :D

Может подскажет кто, как бы еще добавить опцию эту в форму быстрого ответа ( что бы в качестве новостей выводились и просто ответы)

И что-бы опция была при нажатии редактировать.( что бы можно было в новости добавлять уже существующие посты.)

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

  • 1 месяц спустя...

Очень интересный мод!

А можно как то сделать, так, что бы новость выводилась не в IPDynamic Lite, а в отдельный текстовый файл! Типо ssi.php?a=news ? Хотелось бы, что бы когда редактируешь чью-то новость можно было бы добовлять тему в эту новостную ленту. И еще сделать, так, что бы к примеру был виден только текст и то не полный, а только начало, или только прикрепленная картинка, но с определенным размером.

Дело в том, что у меня на форуме есть раздел творчества и там пишут стихи, рассказы, рисуют картинки. Вот хотелось бы самые интересные и лучшие работы попадали и в такой же раздел сайта. А так нажал администратор "редактировать тему" в форуме и внизу добовляй галочки :D типо "Добавить в рассказы" или "Добаить в рисунки". И еще хотелось бы, что бы к примеру если добавил в рассказы, то к примеру только первый абзац был виден, а потом дана ссылка на тему в форуме, а форуме уже это тема была бы полностью. Или же например если добавить рисунок, то он создавал или оптимизировал рисунок для сайта и убирал все написи, котрый написал пользователь в теме. ;)

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

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

Тээээкс...

А в портале 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));

 

 

Я прав? Теоретически? :D

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

Да, я проверил и оказался прав :D

 

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

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

И кстати почему кады нжимаешь отредактировать чекбоксика уже нет и как бы сделать чтобы не только первое сообщение так нароить можно было

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

Ну и в качестве "домашнего задания": Может кто напишет отмену публикации темы в новостях и разрешение публикации уже существующих тем ?

Я написал через Moderate.php

Могу выложить если нужно

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

  • 7 месяцев спустя...

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

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

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

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

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

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

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

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

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

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

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