null

Liferay - добавляем кнопки социальных сетей в блог

В продолжение модной темы про тотальную социализацию сайтов, в этой заметке я расскажу о том, как добавить кнопки социальных сетей в блоговый портлет Liferay Portal.

Делать мы это будем с помошью хука (Liferay Hook Plugin); об основных принципах их создания я уже рассказывал в одной из своих заметок в прошлом году. Так что на самих хуках мы в этот раз внимание заострять не будем, а перейдём сразу к делу и посмотрим, как добавить в блог правильно работающие кнопки социальных сетей.

Подготовка

Создаём хук-плагин. Менять мы будем только одну страничку - /html/portlet/blogs/view_entry.jsp - создаём в плагине её копию. Виджеты добавим сразу после текста заметки - перед навигационными ссылками на следующий / предыдущий пост и комментариями:

Сюда мы добавим кнопки социальных сетей

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

<portlet:renderURL var="currentEntryURL">
	<portlet:param name="struts_action" value="/blogs/view_entry" />
	<portlet:param name="entryId" 
		value="<%= String.valueOf(entryId) %>" />
</portlet:renderURL>

ВКонтакте

К сожалению, для того, чтобы добавить кнопку ВКонтакте, нам недостаточно будет только хук-плагина - т.к. инициалиазция вконтактовой Open API должна производиться в блоке <head>, нам придётся добавить этот код в тему оформления. Открываем нашу тему оформления и добавляем туда такой код:

<head>
	...
	<!-- VK userapi -->
	<script type="text/javascript" src="http://userapi.com/js/api/openapi.js?49"></script>

</head>

Добавляем инициализацию нашего приложения ВКонтакте в тело страницы ("12345678" заменяем на его ИД):

<body>

<!-- VK widgets -->
<script type="text/javascript">
	VK.init({apiId: 12345678, onlyWidgets: true});
</script>

...

Теперь уже можно добавить кнопку на страницу:

<div style="float: left;">
	<div id="vk_like"></div>
	<script type="text/javascript">
		VK.Widgets.Like('vk_like', 
			{type: "button", height: 18}, 
			"blog_<%= entryId %>");
	</script>
</div>

Обратите внимание на параметр "blog_<%= entryId %>", передаваемый функции инициализации виджета. Этот параметр - уникальный идентификатор нашего поста, который позволяет отличить его от других записей. Если бы мы его не задали (Open API позволяет так делать), то по разным URL одной и той же записи соответствовали разные наборы лайков ВКонтакте.

Facebook

Теперь добавим кнопку Фейсбука:

<div style="float: left; margin-left: -5px; width: 180px; text-align: center;">
	<div id="fb-root"></div>
	<script>
		(function(d, s, id) {
			var js, fjs = d.getElementsByTagName(s)[0];
			if (d.getElementById(id)) return;
			js = d.createElement(s); js.id = id;
			js.src = "//connect.facebook.net/ru_RU/all.js#xfbml=1";
			fjs.parentNode.insertBefore(js, fjs);
		}(document, 'script', 'facebook-jssdk'));
	</script>
	<div class="fb-like" data-href="<%= currentEntryURL %>" 
		data-layout="button_count" data-send="false" 
		data-show-faces="true" data-width="140" 
		style="margin: 0 20px 0 0; top: -1px"></div>
</div>

Здесь для того, чтобы отличить одну запись от другой, здесь используется наш уникальный URL.

Twitter

Код для добавления кнопки выглядит так:

<div style="float: left;">
	<a class="twitter-share-button" data-lang="ru" 
		data-text="<%= entry.getTitle() %> #tuneit_ru" 
		data-url="<%= currentEntryURL %>" 
		href="https://twitter.com/share">Tweet</a>
	<script>
		!function(d,s,id){
			var js,fjs=d.getElementsByTagName(s)[0];
			if(!d.getElementById(id)){
				js=d.createElement(s);
				js.id=id;
				js.src="//platform.twitter.com/widgets.js";
				fjs.parentNode.insertBefore(js,fjs);
			}
		}(document,"script","twitter-wjs");
	</script>
</div>

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

Google+

С ним всё просто:

<div style="float: left;">
	<g:plusone href="<%= currentEntryURL %>" size="medium"></g:plusone>
	<script type="text/javascript">
		window.___gcfg = {lang: 'ru'};

		(function() {
			var po = document.createElement('script');
			po.type = 'text/javascript'; 
			po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0];
			s.parentNode.insertBefore(po, s);
		})();
	</script>
</div>

В качестве ИД тоже используем наш уникальный URL.

Итог

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

<!-- Like buttons -->

<portlet:renderURL var="currentEntryURL">
	<portlet:param name="struts_action" value="/blogs/view_entry" />
	<portlet:param name="entryId" value="<%= String.valueOf(entryId) %>" />
</portlet:renderURL>

<!-- VK.com -->
<div style="float: left;">
	<div id="vk_like"></div>
	<script type="text/javascript">
		VK.Widgets.Like('vk_like',
			{type: "button", height: 18},
			"blog_<%= entryId %>");
	</script>
</div>
	
<!-- Facebook -->
<div style="float: left;">
	<div id="fb-root"></div>
	<script>
		(function(d, s, id) {
			var js, fjs = d.getElementsByTagName(s)[0];
			if (d.getElementById(id)) return;
			js = d.createElement(s); js.id = id;
			js.src = "//connect.facebook.net/ru_RU/all.js#xfbml=1";
			fjs.parentNode.insertBefore(js, fjs);
		}(document, 'script', 'facebook-jssdk'));
	</script>
	<div class="fb-like" data-href="<%= currentEntryURL %>"
		data-layout="button_count" data-send="false"
		data-show-faces="true" data-width="140"
		style="margin: 0 20px 0 0; top: -1px"></div>
</div>

<!-- Twitter -->
<div style="float: left;">
	<a class="twitter-share-button" data-lang="ru" 
		data-text="<%= entry.getTitle() %> #tuneit_ru" 
		data-url="<%= currentEntryURL %>" 
		href="https://twitter.com/share">Tweet</a>
	<script>
		!function(d,s,id){
			var js,fjs=d.getElementsByTagName(s)[0];
			if(!d.getElementById(id)){
				js=d.createElement(s);
				js.id=id;
				js.src="//platform.twitter.com/widgets.js";
				fjs.parentNode.insertBefore(js,fjs);
			}
		}(document,"script","twitter-wjs");</script>
</div>

<!-- Google+ -->
<div style="float: left;">
	<g:plusone href="<%= currentEntryURL %>" size="medium"></g:plusone>
	<script type="text/javascript">
		window.___gcfg = {lang: 'ru'};

		(function() {
			var po = document.createElement('script');
			po.type = 'text/javascript';
			po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0];
			s.parentNode.insertBefore(po, s);
		})();
	</script>
</div>

<br>

<!-- End of Like buttons -->

Добавляем этот код на страничку, собираем хук, развёртываем его и радуемся появившимся кнопкам:

Кнопки появились.

Коротко о себе:

Работаю ведущим программистом в компании Tune IT и ассистентом кафедры Вычислительной техники в Университете ИТМО .

Занимаюсь проектами, связанными с разработкой разного рода веб-приложений (порталы, CRM-системы, системы электронного документооборота), а также, в рамках научной работы на кафедре, изучаю возможности применения семантического анализа в задачах САПР.