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

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


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

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

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

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

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

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

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

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

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

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