Последние сообщения с форума SMF

Буквально только что пришлось решать проблему, как вывести на главной странице WordPress последние сообщения на форуме под управлением движка SMF. Спешу поделиться!

Итак варианта два. Первый самый простой — через RSS. Для этого добавляем в виджет «RSS» такую ссылку:

http://site.ru/forum/index.php?type=rss;action=.xml

Способ универсальный для любого форума, даже если он располагается на стороннем домене. Однако, был выявлен один неприятный баг, в результате которого пришлось от него отказаться и использовать другой вариант. А заключался он в том, что новые сообщения на форуме показывались с большим опозданием по времени. В чем причина — в движке или в сервере или еще в чем-то — я разбираться не стал и реализовал запасной вариант. Называется он SSI (Server Side Includes) — включенная в SMF система транслирования той или иной информации для компоновки разных данных на странице. Чтобы отобразить последние новые сообщения на форуме, добавляем в виджет код:

<?php
require("/home/local/public_html/forum/SSI.php");
ssi_recentTopics();
?>

где «/home/local/public_html/forum/» — абсолютный путь до корневой папки форума. Да, форум должен находиться на одном хостинге и аккаунте с вашим сайтом, то есть в поддомене или внутренней папке. И плюс к этому, у вас должна быть активирована поддержка вставки php кода из виджетов или вставьте этот код напрямую в шаблон.

После этого открываем файл forum/Sources/Security.php и удаляем или закомментируем код:

function is_admin()
{
isAllowedTo('admin_forum');
}

В принципе в таком виде все будет работать. Однако, если форум и сайт в разных кодировках, например форум в windows-1251, а сайт на WP в utf-8, то вместо русских букв могут быть знаки вопросов. Как вариант, чтобы не мучиться с кодировками, отображать только заголовок темы последних записей в виде ссылки + дату публикации — это отображается без проблем.

Настройки для вывода информации по SSI находятся в файле SSI.php, который лежит в корне форума.

Открываем его и находим строки:

// Recent topic list:   [board] Subject by Poster	Date

Эта функция отвечает за вывод списка последних сообщений на форуме. Сразу под ней настраиваем, сколько сообщений будет отображатсья:

function ssi_recentTopics($num_recent = 5, $exclude_boards = null, $output_method = 'echo')

Как вы уже поняли, за это отвечает параметр «$num_recent = 5».

Далее смотрим, что содержится в массиве после строки

// Build the array





а именно:

$posts[] = array(
			'board' => array(
				'id' => $row['ID_BOARD'],
				'name' => $row['bName'],
				'href' => $scripturl . '?board=' . $row['ID_BOARD'] . '.0',
				'link' => '<a href="' . $scripturl . '?board=' . $row['ID_BOARD'] . '.0">' . $row['bName'] . '</a>'
			),
			'topic' => $row['ID_TOPIC'],
			'poster' => array(
				'id' => $row['ID_MEMBER'],
				'name' => $row['posterName'],
				'href' => empty($row['ID_MEMBER']) ? '' : $scripturl . '?action=profile;u=' . $row['ID_MEMBER'],
				'link' => empty($row['ID_MEMBER']) ? $row['posterName'] : '<a href="' . $scripturl . '?action=profile;u=' . $row['ID_MEMBER'] . '">' . $row['posterName'] . '</a>'
			),
			'subject' => $row['subject'],
			'short_subject' => shorten_subject($row['subject'], 25),
			'preview' => $row['body'],
			'time' => timeformat($row['posterTime']),
			'timestamp' => forum_time(true, $row['posterTime']),
			'href' => $scripturl . '?topic=' . $row['ID_TOPIC'] . '.msg' . $row['ID_MSG'] . ';topicseen#new',
			'link' => '<a href="' . $scripturl . '?topic=' . $row['ID_TOPIC'] . '.msg' . $row['ID_MSG'] . '#new">' . $row['subject'] . '</a>',
			'new' => !empty($row['isRead']),
			'new_from' => $row['new_from'],
			'icon' => '<img src="' . $settings[$icon_sources[$row['icon']]] . '/post/' . $row['icon'] . '.gif" align="middle" alt="' . $row['icon'] . '" border="0" />',
		);
	}
	mysql_free_result($request);

Добавим в него новый параметр

'pubDate' => gmdate('d.m.Y', $row['posterTime']),

Тут я заменил стандартный вывод даты и времени (параметр «time» в исходном коде) на свой без отображения часа и дня недели — того, где были кракозябры.

А за вывод всего этого на странице отвечает код под строкой

// Just return it.

то есть:

if ($output_method != 'echo' || empty($posts))
		return $posts;

	echo '
		<table border="0" class="ssi_table">';
	foreach ($posts as $post)
		echo '
			<tr>
				<td align="right" valign="top" nowrap="nowrap">
					[', $post['board']['link'], ']
				</td>
				<td valign="top">
					<a href="', $post['href'], '">', $post['subject'], '</a>
					', $txt[525], ' ', $post['poster']['link'], '
					', $post['new'] ? '' : '<a href="' . $scripturl . '?topic=' . $post['topic'] . '.msg' . $post['new_from'] . ';topicseen#new"><img src="' . $settings['images_url'] . '/' . $context['user']['language'] . '/new.gif" alt="' . $txt[302] . '" border="0" /></a>', '
				</td>
				<td align="right" nowrap="nowrap">
					', $post['time'], '
				</td>
			</tr>';
	echo '
		</table>';
}

Поменяем на свой — более простой и без ошибок в кодировке с использованием нашего параметра вывода даты публикации :

// Just return it.
	if ($output_method != 'echo' || empty($posts))
		return $posts;

	foreach ($posts as $post)

		echo '

			

				<table width="100%"><tr><td width="80%">

					<a href="', $post['href'], '">', $post['subject'], '</a></td>
					<td width="20%">

					', $post['pubDate'], '

				</td></tr></table>';

}

Получаем такой результат:

Я показал один из вариантов, который меня устроил. Вы можете пойти дальше и разрешить проблему с кодировками для того, чтобы задействовать весь функционал SSI в SMF и отображать полную информацию о ваших последних сообщениях на форуме. Примерами можете делиться в комментариях к статье!

Поделись этой статьей с друзьями!

Это будет интересно прочитать:

  • Интересная задумка, особенно, думаю, будет полезна для владельцев форумов, которые параллельно ведут блоги.

  • Приветствую.
    Вчера начальство поставило задачу сделать сайт, а я сам с этим никогда не сталкивался, а против директора не попрёшь….
    Если не сложно, набросайте список контор, которые этим занимаются…
    Может кто пользовался услугами этой фирмы? borosite.net
    Заранее спасибо!

  • Всем привет!
    Подскажите подойдет ли Samsung galaxy TAB 2 в качестве регистратора или навигатора?
    Рассматривал также варианты
    Galaxy GalaPad 7" Wi-Fi 8GB — но я так понял в нем нету камеры, знач видеорегистратор из него не получится
    Asus MeMO Pad HD 7
    Acer Iconia Tab B1-A71 16GB
    Wexler Tab 7iS 8GB Wi-Fi White
    Asus Google Nexus 7

    Подскажите какой из выше перечисленных подойдет для этих целей? также хотелось чтобы и фильмы без тормозов воспроизводились, в магазине порекомендовали Samsung galaxy TAB 2 сказали что изза того что сейчас уже вышел самсунг таб 3 на 2-ю версию хорошие скидки. Стоит ли брать?
    Или всеже лучше взять отдельно регистратор и отдельно навигатор?
    Заранее спасибо тел. 89619435050 Лашин Сергей Анатольевич

    P.S. упс.. извините если ошиблась разделом

    • Вообще конечно лучше для разных задач использовать специально приспособленные под это устройства. Но если вы хотите именно планшет, чтобы им еще и пользоваться для выхода в интернет и чтения книг, то выбирайте из Самсунга и Нексуса. Я для себя выбрал последний из-за более низкой цены и большей производительности, в которой он ничем не проигрывает iPad. И обновления для него выходят гораздо чаще, чем для Самсунга, а тем более, раз вышел 3, то про новые прошивки для 2 очень скоро фирма забудет, как это произошло с 1м Galaxy Tab. Единственное, экран у Самсунга более надежный, а так во всем лучше Нексус

Добавить комментарий