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