Доработка плагина tru_tags 2

16 июня 2010

Возможно, Вам не сильно интересно читать, что и почему я добавил. Можете взять код функции tru_tags_handler и заменить в плагине tru_tags. В результате изменения заработала связка плагинов ob1_pagination и tru_tags. Весь код плагинов в системе Textpattern пишется на PHP, как и сама система :) Ну это так, для тех, кто не в курсе. Хотя если Вы пришли на данную страницу, то Вы прекрасно осведомлены о системе Textpattern. Да, чтобы связка заработала, необходимо указать лимит в месте вывода результата работы плагина tru_tags(<txp:tru_tags_handler limit="20" />). По умолчанию лимит установлен в 1000, что очень и очень много.

 

function tru_tags_handler($atts) {
$pg = urldecode(strip_tags(gps('pg')));
$pg = (!empty($pg)) ? $pg : 1;


$tag_parameter = tru_tags_tag_parameter(array(), false);
if (!empty($tag_parameter)) {
if (tru_tags_redirect_if_needed($tag_parameter)) {
return '';
}
$clean_atts = tru_tags_fixup_query_atts($atts, $tag_parameter);

$pageby = (empty($clean_atts['pageby']) ? $clean_atts['limit'] : $clean_atts['pageby']);
$offset = ($pg - 1) * $pageby;
$clean_atts['pageby'] = $pageby;
$clean_atts['offset'] = $offset;

if ($clean_atts['keywords']) {
$keys = doSlash(do_list($clean_atts['keywords']));
foreach ($keys as $key) {
$keyparts[] = "FIND_IN_SET('".$key."',Keywords)";
}
$keywords = " and (" . join(' or ',$keyparts) . ")";
}
else {$keywords = "";}
$where = "1=1" . $keywords;
$grand_total = safe_count('textpattern',$where);
$total = $grand_total - $offset;
$numPages = ceil($grand_total/$pageby);
$pageout['pg'] = $pg;
$pageout['numPages'] = $numPages;
$pageout['s'] = 'tag';
$pageout['c'] = '';
$pageout['grand_total'] = $grand_total;
$pageout['total'] = $total;
global $thispage;
if (empty($thispage)) $thispage = $pageout;


$result = doArticles($clean_atts, true); #function in TXP code
if (trim($result) == '') {
if (isset($atts['noarticles'])) {
tru_tags_redirect($atts['noarticles'], true);
} else if (isset($atts['404redirect']) && !$atts['404redirect']) {
return $result;
} else {
txp_die(gTxt('404_not_found'), '404');
}
} else {
return $result;
}
} else {
return tru_tags_cloud($atts);
}
}

 Красным выделен добавленный мною код. В первой строке получаем параметр PG. Как его получить, я подсмотрел в коде этого же самого плагина на примере параметра tag_parameter. Дальше проверяем, есть ли этот самый параметр, и если он отсутствует, устанавливаем значение по умолчанию равным единице.

Дальше идет оригинальный код функции tru_tags_handler. Получаем значение параметра tag_parameter, который содержит ключевое слово (можно ключевые слова через запятую). И заполняем массив $clean_atts, содержащий атрибуты для функции doArticles. Массив заполняется с помощью функции tru_tags_fixup_query_atts, и по логике часть кода я должен был вынести в эту функцию, передав ей дополнительный параметр $PG, который получил ранее. Но я решил весь свой дополнительный код сконцентрировать в одном месте (в одной функции). Хотя (еще раз повторюсь) логичнее и правильней код по заполнению дополнительных данных в массив $clean_atts перенести в функцию tru_tags_fixup_query_atts. Вот эти четыре строчки:
$pageby = (empty($clean_atts['pageby']) ? $clean_atts['limit'] : $clean_atts['pageby']);
$offset = ($pg - 1) * $pageby;
$clean_atts['pageby'] = $pageby;
$clean_atts['offset'] = $offset;

В этих строчках мы добавляем смещение для запроса в базу данных (параметр $offset). $pageby в нашем случае равен параметру limit. Наверно, в принципе можно его не заполнять.

Дальше в коде мы заполняем переменную $where, которая (как не трудно догадаться) будет содержать строку с критериями для запроса в базу данных. Критерии эти просты, будут выбираться статьи, содержащие ключевое слова (слова). Код я подсмотрел в функции doArticles. Да весь дальнейший код я взял из этой функции (textpattern/publish.php). Просто я не стал заполнять многие параметры: категорию, секцию, дату и автора. Заполнил только один параметр - ключевые слова.

Потом для правильной работы плагина ob1_pagination необходимо заполнить глобальный массив $thispage. Именно из-за того, что этот массив не заполнен, не работал плагин  ob1_pagination в связке с  tru_tags. Массив $thispage содержит параметры, показывающие, сколько всего страниц, и номер страницы, на которой находимся. Также там есть название секции и категории, которые в данном случае не влияют на вывод. Вот и все. Всем удачи.

Андрей Лебедев

,

, , , , ,

Комментарий

Нет комментарий.

Комментировать: