Авто анонс
Задумался о добавлении возможности создания анонса. Полез в код… Оказывается, в ливстрит есть все, что нужно для создания анонса! Максу респект!
Но просто добавить новое поле в форму добавления топика мне показалось мало. Точнее я передумал. =)))
Вместо ручного добавления анонса решил сделать авто обрезание текста топика. Варианта три:
1) Отрезать определенное количество символов и тупо ставить троеточие.
2) То же самое, но до первого пробела. В этом случае целостность слов сохраняется.
3) То же самое, но до первого знака окончания строки. :)
Первый тупой и простой никому давно не интересен, поэтому расскажу, как сделать второй и третий.
Заходим в файл \classes\actions\ActionTopic.class.php
Находим строки 386 и 536 с текстом:
Вариант 2. Меняем их на:
Вариант 3. Меняем строки 386 и 536 на:
* * * * UPDATE * * * *
Чтобы была возможность использовать настройку этого хака — либо «да», либо стандартный cut, делаем нижеследующее.
Добавляем в config.php строчку:
Соответственно исправляем в \classes\actions\ActionTopic.class.php:
* * * * UPDATE 2 * * * *
Если не хотим «портить» конфиг и нас устраивает условие «есть кат — ничего не трогаем, нет ката — обрезаем» — тогда этот вариант для вас. Редактируем только "\classes\actions\ActionTopic.class.php", заменив "$sTextShort=$sText;" из строк 386 и 536 на:
Но просто добавить новое поле в форму добавления топика мне показалось мало. Точнее я передумал. =)))
Вместо ручного добавления анонса решил сделать авто обрезание текста топика. Варианта три:
1) Отрезать определенное количество символов и тупо ставить троеточие.
2) То же самое, но до первого пробела. В этом случае целостность слов сохраняется.
3) То же самое, но до первого знака окончания строки. :)
Первый тупой и простой никому давно не интересен, поэтому расскажу, как сделать второй и третий.
Заходим в файл \classes\actions\ActionTopic.class.php
Находим строки 386 и 536 с текстом:
$sTextShort=$sText;
Вариант 2. Меняем их на:
// Ищем первый пробел в строке, начиная с 200 по направлению к началу
$sTextShort = substr ($sText, 0, 200 - strlen (strrchr (substr ($sText, 0, 200), ' ')));
Вариант 3. Меняем строки 386 и 536 на:
// Обрезаем все, что больше 200 символов, но только после точки (или других знаков окончания предложения)
preg_match("/.{200}[^.!;?]*[.!;?]/si", $sText.". ", $matches);
$sTextShort = $matches[0];
* * * * UPDATE * * * *
Чтобы была возможность использовать настройку этого хака — либо «да», либо стандартный cut, делаем нижеследующее.
Добавляем в config.php строчку:
define('BLOG_TOPIC_CUT',200); // 0 - используем стандартный cut, больше 0 - обрезаем анонс после этого символа.
Соответственно исправляем в \classes\actions\ActionTopic.class.php:
if (BLOG_TOPIC_CUT > 0 and strlen($sText) > BLOG_TOPIC_CUT) {
// Обрезаем все, что больше BLOG_TOPIC_CUT символов, но только после точки (или других знаков окончания предложения)
preg_match("/.{".BLOG_TOPIC_CUT."}[^.!;?]*[.!;?]/si", $sText.". ", $matches);
$sTextShort = $matches[0];
} else {
$sTextShort = $sText;
}
* * * * UPDATE 2 * * * *
Если не хотим «портить» конфиг и нас устраивает условие «есть кат — ничего не трогаем, нет ката — обрезаем» — тогда этот вариант для вас. Редактируем только "\classes\actions\ActionTopic.class.php", заменив "$sTextShort=$sText;" из строк 386 и 536 на:
if (strstr ($sText, '<cut>') or strlen ($sText) <= 200) {
$sTextShort = $sText;
} else {
// Обрезаем все, что больше 200 символов, но только после точки (или других знаков окончания предложения)
preg_match("/.200[^.!;?]*[.!;?]/si", $sText.". ", $matches);
$sTextShort = $matches[0];
}
71 комментарий
я скорее предполагал вариант когда кат работает автоматически постоянно, но если вставляешь его вручную, то используется ручной :)
Ща исправим…
P.S. Считаю, что пользователь сам должен определять когда необходимо ставить «cut».
Просто у мну нет мультибайтовых строк, т.к. хостер не дает, и я от них вообще избавился и всё работает. :)
И прощай mb_string! :)
Вроде работает…
а способ из «update» — сразу заработал, им и пользуюсь :)
Автору огромное спасибо!
Автор забыл в строке…
… число (в данном случае 200) заключить в фигурные скобки.
Я у себя на проекте заключил — все работает.
Автору плюс. Т.к. очень нужная для мну штука. Благодарствую.
Тогда для «резиновых» сайтов придётся и ширину, и высоту учитывать. :)
СПС за ответ
Потому как в том же notepad++
Для латинского текста вывел 1019 chars 1029 bytes
Для кирилицы — 556 chars 1018 bytes
Скорее всего константа BLOG_TOPIC_CUT для preg_match в строке
preg_match("/.{".BLOG_TOPIC_CUT."}[^.!;?]*[.!;?]/si", $sText.". ", $matches);
Указывает кол-во байт а не символов.
Подскажите гуру php как побороть данный вопрос?
заменить на
Проверил для русского текста результат 1004 char 1816 bytes при настройке BLOG_TOPIC_CUT — 1000.
Для предыдущего комментария BLOG_TOPIC_CUT тоже 1000.
$tmp_str = iconv(«UTF-8», "CP1251", $sText);
в
$tmp_str = iconv(«UTF-8», "CP1251//IGNORE", $sText);
чтобы не было
iconv() [function.iconv]: Detected an illegal character in input string
Просто заключите нужный текст в тег