Плагин вывода комментариев через функцию по условиям (аргументам)
Kort |
|
---|---|
[Plugin] Comlist / PagecomПлагин вывода комментариев через функцию по условиям (аргументам):
Для работы плагина необходимо установить или просто загрузить плагин Pagelist. Примеры использования// Вывести 5 последних комментариев {PHP|cot_comlist(‘comlist’, 5} // Вывести 5 последних комментариев, сгруппированных по страницам {PHP|cot_comlist(‘comlist’, 5, ‘’, ‘’, 1} // Вывести последние комментарии, сгруппированные по страницам // и с паджинацией по 5 записей на страницу {PHP|cot_comlist(‘comlist’, 5, ‘’, ‘’, 1, ‘compage’} // Вывести последние комментарии, сгруппированные по страницам // и с ajax-паджинацией по 5 записей на страницу {PHP|cot_comlist(‘comlist’, 5, ‘’, ‘’, 1, ‘compage’, ‘com2list’} // Вывести 5 последних комментариев к опросам {PHP|cot_comlist(‘comlist’, 5, '', 'com_area = "polls"'} // Вывести 5 последних комментариев к разделу docs {PHP|cot_comlist(‘comlist’, 5, '', 'com_area = "page" and com_code = "docs"'} // Вывести 5 последних комментариев с сортировкой по дате и закэшировать на 1 день {PHP|cot_comlist(‘comlist’, 5, 'com_date DESC', '', 1, '', '', 'comments_global', 86400} Почему удалены аргументы black / white listsФункционал белого и черного списка нечасто используется, поэтому он реализоватн в виде дополнения. Пример использования в шаблоне: {PHP|cot_comlist('comlist', '5', 'com_date DESC', '-1docs;system', 1)} В аргументе $extra можно указать режим и опции белого и черно списка:
Если в аргументе $extra присутствует точка с запятой, функция "расшифрует" и обработает указанные настройки. Работает только при включенной опции "Генерировать page tags". Если необходимости в использовании белых и черных списков нет, части comlist.first.black_white.php и comlist.query.black_white.php можно отключить (поставить на паузу). Seditio.by - создание сайтов, разработка плагинов и тем для Котонти
|
|
This post was edited by Kort (2023-09-15 17:06, 1 week ago) |
Kabak |
|
---|---|
В рандом плагин начинает показывать комментарии страниц которые не должны показываться определённым читателям. Нарушается приватность. Чёрный список из прежней версии плагина мне нравится больше. Аякс использован только для кэша ? ( может ерунду спрашиваю ) |
Kort |
|
---|---|
С какими аргументами вызывается функция? Плагин обновлен из репозитория? Seditio.by - создание сайтов, разработка плагинов и тем для Котонти
|
Kabak |
|
---|---|
Я про Pagecom , если не использовать чёрный список.
В Comlist при рандомной генерации списка комментариев учитывается уровень читателя и не используются комментарии из закрытых для пользователя разделов ? |
Kort |
|
---|---|
А как вообще надо? Черно-белые списки нужны принципиально или только для исключения показа комментариев в недоступных пользователю разделах? Seditio.by - создание сайтов, разработка плагинов и тем для Котонти
|
|
This post was edited by Kort (2023-08-29 06:51, 3 weeks ago) |
Kabak |
|
---|---|
Нужно, чтобы плагин делвл выборку комментариев только из тех разделов которые может читать конкретный пользователь в соответствии с его уровнем на сайте. Чёрным списком я могу исключить коментарии как минимум не зарегистрированным пользователям на сайте. Для меня чёрный список удобен.
Если плагин без чёрного списка сам выбирает из базы коментарии которые видны конкретному пользователю в соответствии с его уровнем, то чёрный список не нужен.
Чёрный и белый списки добавляют гибкости. Мне нравится, что я могу управлятьтем, что показывать не зарегистрированным пользователям и наоборот - не показывать, если появилась необходимость. Добавлено 8 минут спустя: Удобно было бы все эти настройки размещать в админке, а не править TPL. Например, что в белом или чёрных листах, количество символов и количество строк которое необходимо оставлять, тип сортировки и т.д. Добавлено 45 секунд спустя: Мне не понятна прелесть кэша. Я , вероятно, не понимаю как он работает в Cotonti |
|
This post was edited by Kabak (2023-08-29 07:17, 3 weeks ago) |
Kort |
|
---|---|
1. Удобство настроек состоит именно в том, что они указываются при конкретном вызове функции. Зачем в админке их задавать глобально? В каждом конкретном случае нужно свое количество записей, порядок сортировки, паджинация, кэш и прочее. 2. Количество символов и строк -- это вообще из области допфункций и CSS. Как оставлять их нужное количество уже пояснял. 3. Прелесть кэша в том, что при наличии закэшированного вывода, он и отдается сразу в шаблон, без отработки функции и не нагружая сервер. При добавлении, удалении и редактировании комментария весь кэш плагина удаляется и при следующем вызове функции создается заново. И так по кругу. Время загрузки страницы можешь сравнить. 4. Кэш и аякс вместе не работают. Плюс необходимости в этом нет. 5. Права доступа к разделам (и, соответственно, страницам) и черно-белые списки -- это о разном. Отдельно сделать можно и то и другое. Seditio.by - создание сайтов, разработка плагинов и тем для Котонти
|
Kabak |
|
---|---|
Я переделал под мои нужны Pagecom/ Из-за наличия чёрного и белых списков он мне нравится больше. Но это здорово, что есть выбор для пользователей Cotonti. |
Kort |
|
---|---|
Реализация белого и черного списка:
Вызов такой: {PHP|cot_comlist('comlist', '0', '', '+0cat1;cat2')} P.S. Но сделать под свои нужды тоже дело! Seditio.by - создание сайтов, разработка плагинов и тем для Котонти
|
|
This post was edited by Kort (2023-08-31 08:02, 3 weeks ago) |
Kabak |
|
---|---|
function pagecom_string_truncate($text, $allowed_symbols_in_str = 100, $considerhtml = true, $exact = false, $Output_Ending = '', $str_amount_required = 3 ) { $looking_for = ['<br>', '<br />', '<br/>' ]; $looking_for2 = [ '<a href=' ]; $looking_for3 = [ '<p>' ]; $looking_for4 = [ '<h1>', '<h2>', '<h3>', '</h1>', '</h2>', '</h3>' ]; $str_amount_required < 1 ? $str_amount_required = 1 : $str_amount_required; $No_BR = 0; $total_symbols_amount = $str_amount_required * $allowed_symbols_in_str; $Output = ''; $No_Output_Ending = false; $Required_output_ending = false; $str_amount_ready = 0; // how many strings ready for output strings $str_symbols_ready = 0; // how many symbols were pushed to the next output struing $link_replaced = false; $visible_length = mb_strlen(preg_replace('/<.*?>/', '', $text)); $Output_Ending_size = strlen( $Output_Ending ) + 1; $truncate = ''; $truncate_required = false; $add_one_BR = false; $truncated_by_space = false; $plain_mode = false; $open_tags = []; $total_length = 0; $plain_tag = false; $long_str_found = false; $text = str_replace($looking_for4, '', $text ); for ( $index = count ( $looking_for ) - 1; $index >= 0; --$index ) { $No_BR += substr_count ($text, $looking_for[$index] ); } if (empty($text)) { $truncate .= $Output_Ending; $truncate .= "<br><br>"; goto Inject_New_Lines; } if (!$considerhtml) { if (mb_strlen($text) <= $total_symbols_amount) { $truncate = $text; goto Inject_New_Lines; } else $truncate = mb_substr($text, 0, $total_symbols_amount); } else { // if the plain text is shorter than the maximum length, return the whole text $temp = mb_strlen(preg_replace('/<.*?>/', '', $text)); if ( !preg_match('/<\s*(pre|plaintext)/', $text ) && $temp <= $total_symbols_amount ) { if ( $No_BR > 0 ) { // do nothing } else { if ( $visible_length < $allowed_symbols_in_str ) { // Check for <p> tag $offset = 0; $offset1 = ''; $offset1 = strpos($text, $looking_for3[0], $offset ); if ( $offset1 == '' ) { $truncate = $text; goto Inject_New_Lines; } // Check for <p> tag } } } // splits all html-tags to scanable lines preg_match_all('/(<.+?>)?([^<>]*)/s', $text, $lines, PREG_SET_ORDER); foreach ($lines as $line_matchings) { // if there is any html-tag in this line, handle it and add it (uncounted) to the output if (!empty($line_matchings[1])) { // if it's an "empty element" with or without xhtml-conform closing slash (f.e. <br/>) if ( preg_match( '/^<(\s*.+?\/\s*|\s*(img|br|input|hr|area|base|basefont|col|frame|isindex|link|meta|param)(\s.+?)?)>$/is', $line_matchings[1] ) ) { // do nothing // ++$str_amount_ready; $str_symbols_ready = 0; } elseif (preg_match('/^<\s*\/([^\s]+?)\s*>$/s', $line_matchings[1], $tag_matchings)) { // if tag is a closing tag (f.e. </b>) $tag = false; if (strtolower($tag_matchings[1]) == $plain_mode) { $plain_mode = false; } else { // delete tag from $open_tags list $pos = array_search($tag_matchings[1], $open_tags); if ($pos !== false) { unset($open_tags[$pos]); } } } elseif (preg_match('/^<\s*([^\s>!]+).*?>$/s', $line_matchings[1], $tag_matchings)) { // if tag is an opening tag (f.e. <b>) $tag = strtolower($tag_matchings[1]); $plain_tag = in_array($tag, array('pre','plaintext')) ? $tag : false; // add tag to the beginning of $open_tags list if (!$plain_mode && !$plain_tag) { array_unshift($open_tags, mb_strtolower($tag)); } } // add html-tag to $truncate'd text if (!$plain_mode) { if ( $str_amount_ready > $str_amount_required ) break; // Found <li> tag if ( $line_matchings[1] == '</li>' ) { if ( $str_amount_ready < $str_amount_required ) { ++$str_amount_ready; $str_symbols_ready = 0; } else { break; } } if ( $line_matchings[1] == '</p>' ) { if ( $str_amount_ready < $str_amount_required ) { ++$str_amount_ready; $str_symbols_ready = 0; $long_str_found == true ? $long_str_found = false : $long_str_found; } else { break; } } // Last <li> should not be closed if ( $line_matchings[1] == '</li>' && $str_amount_ready >= $str_amount_required ) { $No_Output_Ending = true; $truncate .= $Output_Ending; $truncate .= $line_matchings[1]; break; } if ( $line_matchings[1] == '<p>' && $str_amount_ready >= $str_amount_required ) { break; } else { $truncate .= $line_matchings[1]; } if ( $line_matchings[1] == '<p>' && $str_symbols_ready > 0 && $long_str_found ) { ++$str_amount_ready; $str_symbols_ready = 0; $long_str_found = false; } if ( $line_matchings[1] == '</p>' && $str_amount_ready == $str_amount_required ) { break; } if ( $line_matchings[1] == '<br>' || $line_matchings[1] == '<br />' || $line_matchings[1] == '<br/>' ) { if ( $str_amount_ready >= $str_amount_required ) { break; } else { ++$str_amount_ready; $str_symbols_ready = 0; if ( $str_amount_ready >= $str_amount_required ) { $No_Output_Ending = true; $truncate .= $Output_Ending; break; } } } } } // the number of characters which are left $left = $total_symbols_amount - $total_length; if ($plain_mode || ($plain_tag && $tag)) { // treats text as plain in <pre>, <plaintext> tags $content = $plain_mode ? $line_matchings[0] : $line_matchings[2]; if (mb_strlen($content) <= $left) { $truncate .= $content; $total_length += mb_strlen($content); } else { $truncate .= mb_substr($content, 0, $left); $total_length += $left; } if ($plain_tag && !$plain_mode) { $plain_mode = $plain_tag; } } else { // calculate the length of the plain text part of the line; handle entities as one character $content_length = mb_strlen(preg_replace('/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};|[\r\n\s]{2,}/i', ' ', $line_matchings[2])); // Checking for <a> href block $offset1 = strpos($line_matchings[1], $looking_for2[0], 0 ); if ($total_length + $content_length > $total_symbols_amount && $offset1 =='' ) { $entities_length = 0; // One big string $Big_str = (int)($content_length / $allowed_symbols_in_str); $New_str_sym_amount = $content_length - $allowed_symbols_in_str; if ( $New_str_sym_amount < 0 ) { $New_str_sym_amount = 0; } $str_amount_ready += $Big_str; if ( $str_amount_ready >= $str_amount_required ) { // LINK REPLACE $offset1 = strpos($line_matchings[1], $looking_for2[0], 0 ); if ( $offset1 != '' ) { $truncate .= '...'; } else { $truncate_required = true; if ( $left < $allowed_symbols_in_str ) { $truncate .= mb_substr($line_matchings[2], 0, $left ); } if ( $New_str_sym_amount < $allowed_symbols_in_str ) { $truncate .= mb_substr($line_matchings[2], 0, $allowed_symbols_in_str ); $Required_output_ending = true; } if ( $New_str_sym_amount > $allowed_symbols_in_str && $left > $allowed_symbols_in_str ) { $truncate .= mb_substr($line_matchings[2], 0, $left - $Output_Ending_size * 3 ); } } // LINK REPLACE // One big string no <p> tag $offset1 = strpos($truncate, $looking_for3[0], 0 ); if ( $offset1 == '' ) { $add_one_BR = true; } else { $add_one_BR = false; } // One big string no <p> tag } // search for html entities and spaces if ( preg_match_all( '/&[0-9a-z]{2,8};|&#[0-9]{1,7};|&#x[0-9a-f]{1,6};|[\r\n\s]{2,}/i', $line_matchings[2], $entities, PREG_OFFSET_CAPTURE ) ) { // calculate the real length of all entities in the legal range foreach ($entities[0] as $entity) { if ($entity[1]+1-$entities_length <= $left) { $left--; $entities_length += mb_strlen($entity[0]); } else { // no more characters left break; } } } // maximum lenght is reached, so get off the loop $truncated_by_space = preg_match('/[\r\n\s]/', mb_substr($line_matchings[2], $left+$entities_length, 1)); break; } else { $offset1 = strpos($line_matchings[1], $looking_for2[0], 0 ); if ( $offset1 != '' ) { $truncate .= '...'; $No_Output_Ending = true; $total_length += $content_length; $link_replaced = true; } else { $truncate .= $line_matchings[2]; $total_length += $content_length; } /* Injection */ if ( $link_replaced ) { $link_replaced = false; $str_symbols_ready += 3; } else { $str_symbols_ready += $content_length; } if ( $str_symbols_ready >= $allowed_symbols_in_str && $str_amount_ready < $str_amount_required ) { $long_str_found = true; do { ++$str_amount_ready; if ( $str_amount_ready > $str_amount_required ) break; if ( $str_amount_ready == $str_amount_required && $str_symbols_ready > $allowed_symbols_in_str ) { $truncate = mb_substr($truncate, 0, -($str_symbols_ready - $allowed_symbols_in_str + $Output_Ending_size) ); break; } $str_symbols_ready = $str_symbols_ready - $allowed_symbols_in_str; } while ( $str_symbols_ready >= $allowed_symbols_in_str ); } /* Injection */ } } // if the maximum length is reached, get off the loop if ($total_length >= $total_symbols_amount || $str_symbols_ready >= $allowed_symbols_in_str ) { break; } } // No Output_Ending required if ( (( $total_length + $Output_Ending_size ) < $total_symbols_amount) && (( $content_length + $Output_Ending_size ) < $total_symbols_amount ) && ( $str_symbols_ready + $Output_Ending_size ) < $allowed_symbols_in_str ) { $No_Output_Ending = true; } if ( $Required_output_ending ) { $No_Output_Ending = false; } } if ( $truncate_required || ( !$exact && !$truncated_by_space && !$plain_mode && ( ($str_symbols_ready >= $allowed_symbols_in_str) || ($content_length >= $total_symbols_amount)) ) ) { // ...search the last occurence of a space... if (mb_strrpos($truncate, ' ') > 0) { $pos1 = mb_strrpos($truncate, ' '); $pos2 = mb_strrpos($truncate, '>'); $spos = ($pos2 < $pos1) ? $pos1 : ($pos2+1); if (isset($spos)) { // ...and cut the text in this position $truncate = mb_substr($truncate, 0, $spos ); } } } if ( !$No_Output_Ending ) { $truncate .= $Output_Ending; } if ($considerhtml) { // close all unclosed html-tags if ($plain_mode) { $truncate .= '</' . $plain_mode . '>'; } foreach ($open_tags as $tag) { $truncate .= '</' . $tag . '>'; if ( $tag == 'p' ) ++$str_amount_ready; } } Inject_New_Lines: if ( $add_one_BR ) { $truncate .= "<br>"; } for ($count = $str_amount_ready; $count < $str_amount_required ; ++$count ) { $truncate .= "<br>"; } return $truncate; }
$t->assign(cot_generate_usertags($row, 'PAGECOM_ROW_AUTHOR_')); /* +++++ My code ==== */ // $cutstring = cot_string_truncate($row['com_text'], $cfg['plugin']['pagecom']['message_cut_amount'] * $cfg['plugin']['pagecom']['message_strings_amount'], $considerhtml = true, $exact = false, $cuttext = $cfg['plugin']['pagecom']['end_string']); $cutstring = pagecom_string_truncate($row['com_text'], $cfg['plugin']['pagecom']['message_cut_amount'], $considerhtml = true, $exact = false, $cuttext = $cfg['plugin']['pagecom']['end_string'] , $cfg['plugin']['pagecom']['message_strings_amount'] ); /* +++++ My code ==== */ $com_text = cot_parse($row['com_text'], $cfg['plugin']['comments']['markup']); $t->assign(array( 'PAGECOM_ROW_NUM' => $jj, 'PAGECOM_ROW_ODDEVEN' => cot_build_oddeven($jj), 'PAGECOM_ROW_ID' => $row['com_id'], 'PAGECOM_ROW_URL' => cot_url('page', $link_params, '#c'.$row['com_id']), 'PAGECOM_ROW_AUTHOR' => cot_build_user($row['com_authorid'], htmlspecialchars($row['com_author'])), 'PAGECOM_ROW_AUTHORNAME' => htmlspecialchars($row['com_author']), 'PAGECOM_ROW_AUTHORID' => $row['com_authorid'], 'PAGECOM_ROW_TEXT' => $com_text, /* +++++ My code ==== */ 'PAGECOM_ROW_CUTED_TEXT' => $cutstring, /* +++++ My code ==== */ 'PAGECOM_ROW_TEXT_PLAIN' => strip_tags($com_text), 'PAGECOM_ROW_DATE' => cot_date('datetime_medium', $row['com_date']), 'PAGECOM_ROW_DATE_STAMP' => $row['com_date'], 'PAGECOM_ROW_CATTITLE' => htmlspecialchars($structure['page'][$row['page_cat']]['title']) ));
|