среда, 25 февраля 2009 г.

Полный листинг виджета Related Posts от Тимура Аметова

*Гостевой пост

Очень странно, что в последнее время возникает столько проблем с такой казалось бы такой мелочью как виджет Related Posts. Сегодня в очередной раз скрипт какое-то время не работал по вине «висящего» сервера, на котором он исполняется. Проблема на самом деле не в «серверах» или «кривых» программистах, а во мне, потому что я поленился в свое время «вытащить» полный листинг скрипта. Тогда мне просто не хотелось отягощать код, что блог обладал максимально легким и "производительным" кодом, но, недостатки моего способа многие уже ощутили.

К счастью, подоспел гостевой пост от Тимура Аметова, который снимает все вопросы. Поэтому, с удовольствием передаю ему слово:

В одной из своих статей, Дмитрий писал про Related Posts Widget. Один из комментаторов спросил, как можно убрать ссылку на создателя Widgeta. Я заглянул в сам код и первое, что мне бросилось в глаза, что сам скрипт загружается с чужой странички.

Плюсами такого способа является то, что даже если в скрипте что-то будет меняться, Вам ничего не придётся менять.

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

Для тех, кто все же решится избавиться от зависимости и написана эта статья, а точнее несколько подправлены шаги, описанные Дмитрием. Если быть еще более точным, то изменился только второй шаг.

Шаг 1. Как всегда делаем бекап, как это делается всем известно, кто не знает – смотрите предыдущие посты рубрики.

Шаг 2а. Если у Вас уже установлен этот виджет, ищем
<script src='http://technotrixdebajyoti.googlepages.com/
RelatedPostsByRealtrix.co.cc.js' type='text/javascript'/>
и заменяем на
<script type='text/javascript'>
//<![CDATA[
var relatedTitles = new Array();
var relatedTitlesNum = 0;
var relatedUrls = new Array();

function related_results_labels(json)
{
for (var i = 0; i < json.feed.entry.length; i++)
{
var entry = json.feed.entry[i];
relatedTitles[relatedTitlesNum] = entry.title.$t;
for (var k = 0; k < entry.link.length; k++)
{
if (entry.link[k].rel == 'alternate')
{
relatedUrls[relatedTitlesNum] = entry.link[k].href;
relatedTitlesNum++;
break;
}
}
}
}

function removeRelatedDuplicates()
{
var tmp = new Array(0);
var tmp2 = new Array(0);
for(var i = 0; i < relatedUrls.length; i++)
{
if(!contains(tmp, relatedUrls[i]))
{
tmp.length += 1;
tmp[tmp.length - 1] = relatedUrls[i];
tmp2.length += 1;
tmp2[tmp2.length - 1] = relatedTitles[i];
}
}
relatedTitles = tmp2;
relatedUrls = tmp;
}

function contains(a, e)
{
for(var j = 0; j < a.length; j++) if (a[j]==e) return true;
return false;
}

function printRelatedLabels()
{
var r = Math.floor((relatedTitles.length - 1) * Math.random());
var i = 0;
document.write('<ul>');
while (i < relatedTitles.length && i < 20)
{
document.write('<li><a href="' + relatedUrls[r] + '">' + relatedTitles[r] + '</a></li>');
if (r < relatedTitles.length - 1)
{
r++;
}
else
{
r = 0;
}
i++;
}
document.write('</ul>');
}
//]]>
</script>
Сохраняем шаблон. И на этом установка виджета закончена.

Шаг 2б. Если Вы еще ни разу не устанавливали этот виджет, находите закрывающий тег </head> и вставляете перед ним следующий код:
<style>
#related-posts {
float : left;
width : 540px;
margin-top:20px;
margin-left : 5px;
margin-bottom:20px;
font : 11px Verdana;
margin-bottom:10px;
}
#related-posts .widget {
list-style-type : none;
margin : 5px 0 5px 0;
padding : 0;
}
#related-posts .widget h2, #related-posts h2 {
color : #940f04;
font-size : 20px;
font-weight : normal;
margin : 5px 7px 0;
padding : 0 0 5px;
}
#related-posts a {
color : #054474;
font-size : 11px;
text-decoration : none;
}
#related-posts a:hover {
color : #054474;
text-decoration : none;
}
#related-posts ul {
border : medium none;
margin : 10px;
padding : 0;
}
#related-posts ul li {
display : block;
margin : 0;
padding-top : 0;
padding-right : 0;
padding-bottom : 1px;
padding-left : 16px;
margin-bottom : 5px;
line-height : 2em;
border-bottom:1px dotted #cccccc;
}
</style>

<script type='text/javascript'>
//<![CDATA[
var relatedTitles = new Array();
var relatedTitlesNum = 0;
var relatedUrls = new Array();

function related_results_labels(json)
{
for (var i = 0; i < json.feed.entry.length; i++)
{
var entry = json.feed.entry[i];
relatedTitles[relatedTitlesNum] = entry.title.$t;
for (var k = 0; k < entry.link.length; k++)
{
if (entry.link[k].rel == 'alternate')
{
relatedUrls[relatedTitlesNum] = entry.link[k].href;
relatedTitlesNum++;
break;
}
}
}
}

function removeRelatedDuplicates()
{
var tmp = new Array(0);
var tmp2 = new Array(0);
for(var i = 0; i < relatedUrls.length; i++)
{
if(!contains(tmp, relatedUrls[i]))
{
tmp.length += 1;
tmp[tmp.length - 1] = relatedUrls[i];
tmp2.length += 1;
tmp2[tmp2.length - 1] = relatedTitles[i];
}
}
relatedTitles = tmp2;
relatedUrls = tmp;
}

function contains(a, e)
{
for(var j = 0; j < a.length; j++) if (a[j]==e) return true;
return false;
}

function printRelatedLabels()
{
var r = Math.floor((relatedTitles.length - 1) * Math.random());
var i = 0;
document.write('<ul>');
while (i < relatedTitles.length && i < 20)
{
document.write('<li><a href="' + relatedUrls[r] + '">' + relatedTitles[r] + '</a></li>');
if (r < relatedTitles.length - 1)
{
r++;
}
else
{
r = 0;
}
i++;
}
document.write('</ul>');
}
//]]>
</script>
Сохраняем шаблон.

Шаг 3. Теперь находим следующий кусок кода <p><data:post.body/></p> (убедитесь что галочка «расширить шаблон» поставлена). И вставляем перед закрывающим тегом </p>, т.е в середину, конструкцию:
<b:if cond='data:blog.pageType == "item"'>
<div id="related-posts">
<font face='Arial' size='3'><b>Related Posts : </b></font><font color='#FFFFFF'><b:loop values='data:post.labels' var='label'>
<data:label.name/>
<b:if cond='data:label.isLast != "true"'>,
</b:if><b:if cond='data:blog.pageType == "item"'>

<script expr:src='"/feeds/posts/default/-/" + data:label.name + "?alt=json-in-script&callback=related_results_labels&max-results=5"' type='text/javascript'/></b:if></b:loop>
</font>
<script type='text/javascript'> removeRelatedDuplicates();
printRelatedLabels(); </script>
</div></b:if>
Сохраняем шаблон, проверяем свои посты и ликуем! А самое главное, замечаем, что ссылки на создателя Widgeta больше нет.

P.S. Про ссылку на создателя виджета. Идём по <a href="http://realtrix.blogspot.com/2008/09/create-related-posts-plugin-for-blogger.html">ней</a>, читаем статью и замечаем "After seeing Mohamed Rias's post, I found a new way to use the Hack ...". В общем, некто Debajyoti Das взял скрипт Mohamed Rias, записал это всё в отдельный файлик и сказал, что он открыл велосипед :) А еще и ссылку на себя поставил. Учимся у него, товарищи!!! :)

Другие «рецепты» от Тимура:
FeedMates. Инструкция по установке.
Случайные посты


Читайте по теме