1. Мы продолжаем публиковать интересные статьи на тему SocialEngine 4. Одна из статей посвящена правильному выбору сервера для вашей социальной сети, а другая содержит советы по увеличению производительности платформы. Также мы добавили большую статью о пользовательских уровнях. Ознакомиться со статьями вы можете в разделе Вопросы и Ответы SocialEngine 4.
  2. Вам кажется, что ваша версия SocialEngine 4, работает медленно?

    Голосуйте. Пишите свою версию системы, железо на чем работает и количество пользователей. Будем увеличивать производительность :-) Подробнее

  3. В связи с участившимися случаями попыток продажи пользователями форума различных "сборок" коммерческих социальных платформ, обычно основанных на SocialEngine 3, вводится новое правило для форума. Запрещается создание тем или размещение в уже созданных предложений о продаже или размещение ссылок на сайты, где происходит продажа "сборок". Пользователи, которые продолжат свою коммерческую деятельность в данном направлении, будут заблокированы. Подробнее.

?*? в имени?

Discussion in 'Прочая Поддержка - Help Requests' started by mafia, Nov 17, 2009.

  1. mafia Thread starter Novice member


    Offline
    Message Count:
    10
    Likes Received:
    0
    Я заметил, что у некоторых пользователей в имени и фамилии присутствуют вопросы, например Михаил* Драгу??, Татьян*а Хохл??нова и т.д.. И этот баг присутствует только во вкладке друзья, а в остальном всё нормально, без такого бага!

    Как это исправить?
  2. Prado Challenge Everything


    Offline
    • Admin
    Message Count:
    3,191
    Likes Received:
    786
    My version of phpFox:
    3.0.0
    Открываем блокнот,вписываем туда следующее:

    php_value mbstring.http_input pass
    php_value mbstring.http_output pass
    php_value mbstring.encoding_translation 0
    php_value default_charset UTF-8
    php_value mbstring.internal_encoding UTF-8
    php_value mbstring.language Russian
    AddDefaultCharset UTF-8


    Сохраняем как .htaccess и закидываем в корневую директорию сайта.
    Готово.

    Вариант №2:
    Для работы этого способа понадобиться модуль php - MBString
    Заменить modifier.truncate.php на этот:
    PHP:
    <?php
    /**
     * Smarty plugin
     * @package Smarty
     * @subpackage plugins
     */


    /**
     * Smarty truncate modifier plugin
     *
     * Type:     modifier<br>
     * Name:     truncate<br>
     * Purpose:  Truncate a string to a certain length if necessary,
     *           optionally splitting in the middle of a word, and
     *           appending the $etc string or inserting $etc into the middle.
     * @link http://smarty.php.net/manual/en/language.modifier.truncate.php
     *          truncate (Smarty online manual)
     * @author   Monte Ohrt <monte at ohrt dot com>
     * @param string
     * @param integer
     * @param string
     * @param boolean
     * @param boolean
     * @return string
     */
    function smarty_modifier_truncate($string$length 80$etc '...'$break_words false$middle false)
    {
        
    /*
        if ($length == 0)
            return '';

        if (strlen($string) > $length) 
        {
            $length -= strlen($etc);
            if (!$break_words && !$middle) 
            {
                $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
            }
            if(!$middle) 
            {
                return substr($string, 0, $length).$etc;
            } 
             else 
             {
                return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
             }
        } 
         else 
         {*/
            
    return $string;
         
    //}
    }

    /* vim: set expandtab: */

    ?>
    или этот:
    PHP:
    <?php
    /**
     * Smarty plugin
     * @package Smarty
     * @subpackage plugins
     */

    /**
     * Smarty truncate modifier plugin
     *
     * Type:     modifier<br>
     * Name:     truncate<br>
     * Purpose:  Truncate a string to a certain length if necessary,
     *           optionally splitting in the middle of a word, and
     *           appending the $etc string or inserting $etc into the middle.
     * @link http://smarty.php.net/manual/en/language.modifier.truncate.php
     *          truncate (Smarty online manual)
     * @author   Monte Ohrt <monte at ohrt dot com>
     * @param string
     * @param integer
     * @param string
     * @param boolean
     * @param boolean
     * @return string
     */
    function smarty_modifier_truncate($string$length 80$etc '...',
                                      
    $break_words false$middle false)
    {
        if (
    $length == 0)
            return 
    '';

        if (
    strlen($string) > $length) {
            
    $length -= min($lengthstrlen($etc));
            if (!
    $break_words && !$middle) {
                
    $string preg_replace('/\s+?(\S+)?$/'''substr($string0$length+1));
            }
            if(!
    $middle) {
                
    //return substr($string, 0, $length) . $etc;
                
    return utf8_str_limit($string$length$etc);
            } else {
                return 
    substr($string0$length/2) . $etc substr($string, -$length/2);
            }
        } else {
            return 
    $string;
        }
    }


    /**
     * Обрезает текст в кодировке UTF-8 до заданной длины,
     * причём последнее слово показывается целиком, а не обрывается на середине.
     * Html сущности корректно обрабатываются.
     *
     * @param    string   $s           текст в кодировке UTF-8
     * @param    int      $maxlength   ограничение длины текста
     * @param    string   $continue    завершающая строка, которая будет вставлена после текста, если он обрежется
     * @param    string   &$is_cutted  текст был обрезан?
     * @return   string
     *
     * @license  http://creativecommons.org/licenses/by-nc-sa/3.0/
     * @author   Nasibullin Rinat <n a s i b u l l i n  at starlink ru>
     * @charset  ANSI
     * @version  3.3.3
     */
    function utf8_str_limit($s$maxlength 256$continue "\xe2\x80\xa6", &$is_cutted null#"\xe2\x80\xa6" = "&hellip;"
    {
        
    $is_cutted false;
        if (
    $continue === null$continue "\xe2\x80\xa6";

        
    #оптимизация скорости:
        #{{{
        
    if (strlen($s) <= $maxlength) return $s;
        
    $s2 str_replace("\r\n"'?'$s);
        
    $s2 preg_replace('/&(?> [a-zA-Z][a-zA-Z\d]+
                                | \#(?> \d{1,4}
                                      | x[\da-fA-F]{2,4}
                                    )
                              );  # html сущности (&lt; &gt; &amp; &quot;)
                            /sx'
    '?'$s2);
        
    #utf8_decode() converts characters that are not in ISO-8859-1 to '?', which, for the purpose of counting, is quite alright.
        
    if (strlen($s2) <= $maxlength || strlen(utf8_decode($s2)) <= $maxlength) return $s;
        
    #}}}

        
    preg_match_all('/(?> \r\n   # переносы строк
                           | &(?> [a-zA-Z][a-zA-Z\d]+
                                | \#(?> \d{1,4}
                                      | x[\da-fA-F]{2,4}
                                    )
                              );  # html сущности (&lt; &gt; &amp; &quot;)
                           | [\x09\x0A\x0D\x20-\x7E]           # ASCII
                           | [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
                           |  \xE0[\xA0-\xBF][\x80-\xBF]       # excluding overlongs
                           | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
                           |  \xED[\x80-\x9F][\x80-\xBF]       # excluding surrogates
                           |  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
                           | [\xF1-\xF3][\x80-\xBF]{3}         # planes 4-15
                           |  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
                         )
                        /sx'
    $s$m);
        
    #d($m);
        
    if (count($m[0]) <= $maxlength) return $s;
        
    $is_cutted true;
        
    $left implode(''array_slice($m[0], 0$maxlength));
        
    #из диапазона ASCII исключаем буквы, цифры, закрывающие парные символы [a-zA-Z\d)}\];]
        #нельзя вырезать в конце строки символ ";", т.к. он используются в сущностях &xxx;
        
    $left2 rtrim($left"\x00..\x28\x2A..\x2F\x3A\x3C\x40\x5C\x5E..\x60\x7C\x7E\x7F");
        if (
    strlen($left) !== strlen($left2)) return $left2 $continue;

        
    #добавляем остаток к обрезанному слову
        
    $right implode(''array_slice($m[0], $maxlength));
        
    preg_match('/^(?: [a-zA-Z\d\)\]\}\-\.]  #английские буквы или цифры, закрывающие парные символы, дефис для составных слов, дата, IP-адреса, URL типа www.ya.ru!
                        | \xe2\x80[\x9d\x99]|\xc2\xbb|\xe2\x80\x9c  #закрывающие кавычки
                        | \xc3[\xa4\xa7\xb1\xb6\xbc\x84\x87\x91\x96\x9c]|\xc4[\x9f\xb1\x9e\xb0]|\xc5[\x9f\x9e]  #турецкие
                        | \xd0[\x90-\xbf\x81]|\xd1[\x80-\x8f\x91]   #русские буквы
                        | \xd2[\x96\x97\xa2\xa3\xae\xaf\xba\xbb]|\xd3[\x98\x99\xa8\xa9]  #татарские
                      )+
                    /sx'
    $right$m);
        
    #d($m);
        
    $right = isset($m[0]) ? rtrim($m[0], '.-') : '';
        
    $s2 $left $right;
        if (
    strlen($s2) !== strlen($s)) $s2 .= $continue;
        return 
    $s2;
    }

    ?>
    можно попробовать так:
    truncate:55:"...":false}</a></div>

    false - обрезает по ближайшему пробелу
    true - обрезает четко по символам

    надо ставить false

    а лучше реализовать это:
    Кириллические символы в utf-8 представлены в виде 2-х байт, некоторые системные и латиница - 1 байт. обрезая строку по количеству байт, можно получить в конце не букву, а только часть буквы.
    Надо при обрезании удалять в конце строки символ 0x0D, либо обрезать строку по количеству символов а не байт.
  3. bigboobs Novice member


    Offline
    Message Count:
    49
    Likes Received:
    0
    Тема актуальная. У меня версия 3.19. Тоже возникает подобный баг и тоже только в "друзьях".

    Вышеперечисленные способы не помогли.

    Такая же проблема с письмами отправляемыми пользователям. В графе "Тема письма" тоже встречаются знаки вопроса. Но эту тему можно решить примерно таким образом:
    $subject = "=?utf-8?B?" . base64_encode($subject) . "?=";

    Кде что стоит поправить? Либо если не сложно укажите на переменную и файл где стоит править - а я дальше сам.
  4. Gooos абырвалГ


    Offline
    • Admin
    Message Count:
    2,435
    Likes Received:
    645
    My version of SE:
    3.20
    В друзьях:

    в user_friends.tpl строка 131

    PHP:
    {$friends[friend_loop]->user_displayname|truncate:30:"...":true|chunk_split:12:"<wbr>*"}  
    Заменяем на:
    PHP:
    {$friends[friend_loop]->user_displayname|truncate:30:"...":true}
    Или просто отрезать -
    PHP:
    |chunk_split:12:"<wbr>*"
    В статусе:

    В файле misc_js.php
    Находим эту строчку и ставим перед ней // (То есть закоментируем её)
    PHP:
    // $user_status = chunkHTML_split(substr($user_status, 0, 100), 12, "<wbr>*");
  5. bigboobs Novice member


    Offline
    Message Count:
    49
    Likes Received:
    0
    Помогло, спасибо.

    Осталась та же проблема в модулях:

    - Последние посетившие сайт
    - Новые пользователи
    - Самые дружные пользователи

    В расширенном поиске та же проблема.

    Порывшись в home.tpl было найдено несколько строчек типа:

    PHP:
    <a href='{$url->url_create("profile",$logins[login_loop]->user_info.user_username)}'>{$logins[login_loop]->user_displayname|regex_replace:"/'/":"'"|truncate:15:"...":true}</a>
    (строчка немного видоизменена. видимо форум не пропускает некоторые символы)

    Они отвечают за вывод имени пользователя. Видимо менять надо что-то в этих строчках. Хелп плиз.
  6. Gooos абырвалГ


    Offline
    • Admin
    Message Count:
    2,435
    Likes Received:
    645
    My version of SE:
    3.20
    PHP:
    truncate:15:"...":true
    менять значение 15 на более большое методом проб (например 30) ;)

    А так-же можно попробовать это:

    false - обрезает по ближайшему пробелу
    true - обрезает четко по символам ;)
  7. bigboobs Novice member


    Offline
    Message Count:
    49
    Likes Received:
    0
    Уважаемый Gooos, не совсем Вас понял. Мне просто нужно чтобы имена пользователей выводились без спецсимволов, а не урезать как-либо. Простите за тупость, если не въехвал в Вашу мысль.
  8. Gooos абырвалГ


    Offline
    • Admin
    Message Count:
    2,435
    Likes Received:
    645
    My version of SE:
    3.20
    Решения у меня нет, т.к. нет такой проблемы, но можно:
    Попробовать сделать тоже с
    PHP:
    <wbr>
    в файлах:
    class_user.js
    core-min.js
  9. bigboobs Novice member


    Offline
    Message Count:
    49
    Likes Received:
    0
    Проблема по прежнему актуальна:

    Описание: Имя и фамилия пользователя при выводе в боковых окошках "Последние посетившие сайт", "Новые пользователи", "Самые дружные пользователи" - отображаются со спецсимволами (знаками вопроса).

    Как решить сам пока не допер к сожалению. Подсказки помогли исправить эту ошибку в разделе "Мои друзья". В боковых окошках "Последние посетившие сайт", "Новые пользователи", "Самые дружные пользователи" - проблема не решена.

    Need Help !
  10. Johan Novice member


    Offline
    Message Count:
    2
    Likes Received:
    0
    Gooos, поменял на 30, все заработало

Share This Page

All rights reserved SocEngine.ru ©