кракозябры в MarketPlace

Компонент MarketPlace 1.4.6 стал в последнее время настолько популярен, что многие сайты используют его, но до ума доводить никто не старается, что собственно наносит свой отпечаток на качество отображения Русскоязычных объявлений.  Очень много сайтов я наблюдал в сети, на которых встречаются своего рода проблемы с сокращением самим компонентом наименования объявления или его содержания, в результате чего в месте сокращения появляется загадочная кракозябра. Все грешат на хостинг провайдеров, мол мучайте службу поддержки, а нужно всего то навсего нужно заглянуть в дебри и исправить одну функцию, чтобы полностью наладить  сокращение русскоязычных объявлений MarketPlace.

 

Для тех, кто возможно не представляет что собственно я хочу исправлять, то возможно вам напомнить вот такой вот скриншот, думаю с этим сталкивались многие и многие еще не решили данную проблему, либо вовсе забили.

Для начала давайте разберемся с модулем Последние 5 фотообъявлений. Как мы видим, наша загадочная кракозябра имеет место быть в месте где сокращается наименование объявление и за ней следует три точки ... Сначала я грешил на то, что какой-то элемент кода или базы данных сохранен не в той кодировке, но просмотрев и протестировав все ручками понял что с этим все нормально. Затем я пробовал изменять количество символов, которые система отображает, а потом сокращает слово. Например вместо 27 символов ставил 28, крякозабры сразу пропадали при сокращении одних, но появлялись в других, таким образом от перемены мест ничего не изменялось.

В общем, решение данной проблемы было найдено путем подмены стандартного оператора языка php на внутриджумловский, что повлияло на корректное отображения данных.

Исправляем отображение 5 последних объявлений с фото:

1. Открываем файл /components/com_marketplace/recent5.php. Доходим до 155 строки и видим следующий код:

echo "category&adid=$mes->id&Itemid=$Itemid").">";
if ( strlen($mes->ad_headline)>30){
echo substr( $mes->ad_headline, 0, 27)."...";
}
else {
echo $mes->ad_headline;
}
echo "";

Даже мне, человеку не искушенному в php ясно, что данная функция сокращает наименование объявления в случае если оно более 30 символов до 27 и ставит ... в конце.

Тут в коде появится нашей проблеме ну просто негде, поэтому я предположил что вся проблема заключается в некорректной обработке substr русских символов, мол ну не родные они для меня, вот и появляется всяках фигня на конце.

Для того чтобы все отображалось как надо, нужно будет подправить 157 строку и привести ее к виду JString::substr

echo "category&adid=$mes->id&Itemid=$Itemid").">";
if ( strlen($mes->ad_headline)>30){
echo JString::substr( $mes->ad_headline, 0, 29)."...";
}
else {
echo $mes->ad_headline;
}
echo "";

JString - это своего рода джумловская обработка строк, которая не знает проблем с UTF-8. Таким образом все у меня стало на свои места в модуле отображения последних 5 объявлений с фото.

Для исправления отображения левых символов в содержании объявления, нужно аналогично подправить файл show_category, я например сделал так (703 строка если редактировать через Notepad ++), если у вас еще нет Notepad ++ то обязательно скачайте {phocadownload view=file|id=15|target=b}

Находим следующий код в районе 703 строки

echo "";
echo "".$row->ad_headline."
";
echo "";
$af_text = htmlspecialchars (substr($row->ad_text, 0, 100)."...");
echo $af_text;
echo "";
echo "";
И редактируем его так:
 
echo "";
echo "".$row->ad_headline."
";
echo "";
$af_text = htmlspecialchars (JString::substr($row->ad_text, 0, 100)."...");
echo $af_text;
echo "";
echo "";
т.е. $af_text = htmlspecialchars (JString::substr($row->ad_text, 0, 100)."..."); как раз и приводит к тому что при сокращении объявления не появляется пустого квадратика.
 
Для исправления отображения левых символов в списке результатов поиска нужно ручками аналогично подправить файл list.php в районе 503 строки:
echo "";
echo "".$row->ad_headline."
";
echo "";
$af_text = htmlspecialchars (substr($row->ad_text, 0, 100)."...");
echo $af_text;
echo "";
echo "";

меняем на:

echo "";
echo "".$row->ad_headline."
";
echo "";
$af_text = htmlspecialchars (JString::substr($row->ad_text, 0, 100)."...");
echo $af_text;
echo "";
echo "";

После того как я все это проделал, все стало отображаться без каких либо проблем. Если у вас возникли затруднения, то вы всегда можете извлечь нужные вам файлы из моей сборки MarketPlace 1.4.6 Русский пак 

Таким образом, я свою доску объявлений к корректному отображению привел, чего и вам желаю.

Добавить комментарий

Вы можете оставить комментарий авторизовавшись через любую из представленных социальных сетей ниже:

                 


Защитный код
Обновить