Russian TYPO3 community Форум больше не используется. Присоединяйтесь к каналу #community-ru в Slack for TYPO3 community  

Вернуться   Russian TYPO3 community > Обсуждение общих технических вопросов > Общие вопросы

 
 
Опции темы Опции просмотра
Старый 01.09.2011, 01:59   #2
elezeo
Продвинутый
 
Аватар для elezeo
 
Регистрация: 05.07.2011
Адрес: Россия, Интернет
Сообщений: 69
По умолчанию

В общем в результате долгих мучений всё-таки сделал как надо.
Для того чтобы обрезать контент разработчики придумали маркер ###MORE### который надо вставить в тексте контента и в список блогов выведеться только то, что до маркера.

Но не тут то было!!!
Текст действительно становиться меньше, но обрезается он не в месте маркера, а ниже и отображается еще примерно такое же количество текста.

Долго ломал голову и ковырял код t3blog расширения. Вроде бы все верно делается.
Смущало лишь одно.. В функции, где делается обрезка получается не верная позиция маркера ###MORE###
Тут до меня и дошло, что при работе с кодировкой UTF-8 функция strpos видит больше байтов в строке, кодированной utf-8 и потому позиция находиться не та.

Итак я нашел функцию utf8_strpos и внедрил ее в код.
Вот какие изменения я внес:
файл: .../ext/t3blog/pi1/lib/class.t3blog_div.php
Код:
class t3blog_div {

    static public function utf8_strpos($haystack, $needle, $offset = 0){ 
      // get substring (if isset offset param) 
      $offset = ($offset<0) ? 0 : $offset; 
      if ($offset>0){ 
         preg_match('/^.{' . $offset . '}(.*)/us', $haystack, $dummy); 
         $haystack = (isset($dummy[1])) ? $dummy[1] : ''; 
      } 

      // get relative pos 
      $p = strpos($haystack, $needle); 
      if ($haystack=='' or $p===false) return false; 
      $r = $offset; 
      $i = 0; 

      // calc real pos 
      while($i<$p){ 
         if (ord($haystack[$i])<128) { 
            # ascii symbol 
            $i = $i + 1; 
         } else { 
            # non-ascii symbol with variable length 
            # (handling first byte) 
            $bvalue = decbin(ord($haystack[$i])); 
            $i = $i + strlen(preg_replace('/^(1+)(.+)$/', '\1', $bvalue)); 
         } 
         $r++; 
      } 
      return $r; 
    }
//........тут дальнейший код
Код:
	static public function fetchContentData($postId, array &$contentUidArray, &$hasDivider, &$textBeforeDivider) {
.....какой-то код
  if ($rowContent['CType'] == 'text' || $rowContent['CType'] == 'textpic') {
      $dividerPosition = t3blog_div::utf8_strpos($rowContent['bodytext'], '###MORE###');
.....какой-то код
}
и еще там же в другой функции.. найдите эту строку
Код:
			$textBeforeDivider = $cObj->cropHTML($renderedText,
				($dividerPosition + 10). '|');
и замените "10" на 14
Код:
			$textBeforeDivider = $cObj->cropHTML($renderedText,
				($dividerPosition + 14). '|');
Это они немного накасячили, забыв включить в размер закрытый тег </p>
Всё должно работать.

Думаю пригодиться!

Последний раз редактировалось elezeo; 01.09.2011 в 02:31
elezeo вне форума   Ответить с цитированием
 

Теги
bloglist, crop, обрезка, strpos, t3blog


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB code is Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу настройть T3BLOG demav Общие вопросы 4 18.06.2011 15:20
t3blog 500 Internal Server Error Aprel Общие вопросы 0 23.06.2010 23:44
Security issues in third party TYPO3 extensions including t3blog RSS Bot Новости TYPO3 (на английском) 0 04.03.2010 18:50
tt_news: листание статьи в режиме SINGLE simon.kms TypoScript практикум 4 04.01.2008 23:33
Статьи из журнала T3N Magazine Comrade Новости TYPO3-разработки 1 12.07.2006 16:12


Часовой пояс GMT +4, время: 23:11.


Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot

Хостинг и техническая поддержка: TYPO3 Лаборатория