Webamator Blog

Обучаем Virtuemart грамоте
MENU
Home » Дизайн » Обучаем Virtuemart грамоте

Обучаем Virtuemart грамоте

Немного оффтопа. Я не люблю Virtuemart, да и вообще Джумлу не люблю. Грустно промолчу об отсутсвии у нее какой-либо гибкости и скажу о самом главном недостатке: раздутость и монструозность. Зачем делать на Джумле блоги? – ведь есть сотни заточенных под это дело блоговых движков. Зачем делать на Джумле магазины? – ведь есть сотни заточенных под интернет-коммерцию решений. Но жизнь вносит свои коррективы – если заказчик говорит “хочу Джумлу”, то приходится делать на Джумле… О неповоротливости такого решения когда-нибудь в следующий раз, а сегодня хочу поделиться способом, который “вылечит” один из недостатков магазина на связке Joomla+Virtuemart.

Речь пойдет о пресловутой корзине, которая в Virtuemart выводит “4 товары” и “5 товары”, хотя правильно должно быть “4 товара” и “5 товаров“, т.е. будем учить англоязычный скрипт русскоязычной грамоте. Весьма странно что никто не сделал этого прежде – неужели всех джумловодов устраивает элементарная неграмотность?

Нет, ну по правилам английского языка там все верно – у них 1 item но 4 items. И 5 items, и 64 items, и даже 286 items. Но при переводе 1 к 1 мы в итоге имеем то что имеем (с) – 1 товар, но 4 товары, 5 товары, 64 товары, 286 товары и т.д. На многих магазинах которые я встречал, проблема решается “в лоб” – т.е. сначала вебмастер выводит слово “товары” а после него число. Получается “товары: 4″ (соответственно “товары: 5″, “товары: 64″ и т.д.). Если вас устраивает подобное решение, дальше можете не читать.

Если нет – предлагаю пойти своим путем. Как там говорится – нормальные герои всегда идут в обход? Вот и мы обойдем ту проблему, которую нам оставили локализаторы. Мы просто поменяем “родную” функцию Virtuemart на нашу собственную, которая будет уметь склонять существительные во множественном числе. Страшно? Это вы еще януковича вблизи не видели ;) – вот там действительно страшно…

Итак, для начала можем погуглить/поинтересоваться на разных вебмастерских форумах – как делать правильные окончания для существительных на PHP. Подобных функций достаточно много, и у меня была даже своя собственная. Но наиболее универсальным мне показалась решение от мембера с нулледа под ником venetu, вариант для Virtuemart ниже:

function true_end($chislo,$n1,$n2,$n5){
    $chislo=(int)$chislo;
    $ch=substr($chislo,-1);
    if ($ch==1){
        if (strlen($chislo)>1) $result=substr($chislo,-2,1)==1?$n5:$n1;
        else $result=$n1;
    }else if($ch>1&&$ch<5){
        if (strlen($chislo)>1) $result=substr($chislo,-2,1)==1?$n5:$n2;
        else $result=$n2;
    }else{
        $result=$n5;
    }
    return $result;
}
$total_products = $amount ." ". true_end($amount, 'товар','товара','товаров');

Ее-то и нужно вставить вместо стандартной от Virtuemart, которая находится в файле /administrator/components/com_virtuemart/html/shop.basket_short.php и выглядит вот так:

if ($amount > 1) {
	$total_products = $amount ." ". $VM_LANG->_('PHPSHOP_PRODUCTS_LBL');
}
else {
	$total_products = $amount ." ". $VM_LANG->_('PHPSHOP_PRODUCT_LBL');
}

чтобы легче было сориентироваться – она начинается сразу же после строки

if(!$empty_cart) {

(строка №120 для версии Virtuemart 1.1.6)

Вот и все, теперь ваш интернет-магазин стал гораздо умнее ;)

Popularity: 17%

Добавлено 17 февраля 2011
Рубрика: Дизайн, Сайтостроителю
Метки: , ,

Если данный пост показался вам полезным или интересным, нажмите на одну из кнопок ниже - от vkontakte, facebook, tweeter или google+, чтобы о нем узнали ваши друзья. Спасибо!

Также рекомендую публикации, похожие на "Обучаем Virtuemart грамоте"

Блокировка доставки по городам в WooCommerce.

Когда-то я уже писал об ограничении штатов США в WooCommerce. Но похожая задача может возникнуть не только на уровне штатов, но и на уровне отдельных округов или городов [...]

Лицензия Webasyst со скидкой от 25% до 100%

Сегодня решил поделиться хорошей новостью с теми, кому нужна официальная лицензия Webasyst со скидкой. Лицензия полностью официальная, т.е. вы получаете полноценную поддержку от разработчиков, доступ ко всем обновлениям [...]

Последние новости для Joomla! – кастомизация

В данном посте я хочу рассказать о возможности CMS Joomla, о которой почему-то мало где упоминается, и которая тем не менее позволят работать с данным движком более гибкой [...]

О цене товаров в интернет магазинах

За последние пару месяцев среди заказчиков интернет магазинов заметил некую странную тенденцию – цену на товары просят указывать не в рублях, а в странных непонятных иероглифах… Естественно что [...]

13 комментариев

  • Алексей пишет:

    Огромное спасибо!
    Очень помогло!

    P.S.
    Сам замечал, что некоторые магазины на Virtuemart, вообще не заморачиваются на эту тему.

    4 товары – :D

    • t3s пишет:

      честно – я очень рад, что мои мысли кому-то приносят пользу

      в Virtuemart-е очень много недостатков – и пока что я показал как избавиться лишь от одного из них

      • Борис пишет:

        спасибо за интересную статью, буду пользоватся :)
        не могли бы вы поподробнее расписать “множество решений для интернет-магазинов”, на ваш взгляд самых удачных, спасибо.

  • Руслан пишет:

    “t3s”- Вы меня просто спасли, 4 дня копался !-( уже хотел бросить все к … !
    Огромнейшее, приогромнейшее человеческое Спасибо Вам.

    • t3s пишет:

      надо было бросать
      поверьте – чтобы получился качественный магазин, нужен движок качественного магазина…

  • Руслан пишет:

    хотелось бы, больше таких уроков-на примере с исправлением проблем !-)
    Вам бы цены небыло!!!
    С уважением

  • Сергей пишет:

    Спасибо за совет.
    Какой движок для магазина посоветуете?

    • t3s пишет:

      Если честно, то никакой не хочу советовать – просто не хочу навязывать свое субьективное мнение. Думаю здесь вполне может быть оправдан выбор в стиле “берите то с чем имеете опыт работы”
      Лично мне нравится престашоп из бесплатных, вебасист из коммерческих (у обоих в качестве шаблонизатора Smarty – а это значит что некоторые нестандартные вещи можно реализовать на уровне шаблона, т.е. без доп. модулей)

  • Omni пишет:

    Спасибо за реализацию. Реально сэкономил время.

    Немного адаптировал:

    в administrator\components\com_virtuemart\languages\common\russian.php
    добавляем переменную:
    ‘PHPSHOP_PRODUCT2_LBL’ => ‘товарa’,
    две другие приводим в соответствие:
    ‘PHPSHOP_PRODUCTS_LBL’ => ‘товаров’,
    ‘PHPSHOP_PRODUCT_LBL’ => ‘товар’,

    в administrator\components\com_virtuemart\html\shop.basket_short.php
    вот этот кусок
    if ($amount > 1) {
    $total_products = $amount .” “. $VM_LANG->_(‘PHPSHOP_PRODUCTS_LBL’);
    }
    else {
    $total_products = $amount .” “. $VM_LANG->_(‘PHPSHOP_PRODUCT_LBL’);
    }

    полностью меняем на:
    $amount=(int)$amount;
    $ch=substr($amount,-1);
    if ($ch==1){
    if (strlen($amount)>1) $total_products=substr($amount,-2,1)==1?$amount .” “. $VM_LANG->_(‘PHPSHOP_PRODUCTS_LBL’):$amount .” “. $VM_LANG->_(‘PHPSHOP_PRODUCT_LBL’);
    else $total_products = $amount .” “. $VM_LANG->_(‘PHPSHOP_PRODUCT_LBL’);
    }else if($ch>1&&$ch1) $total_products=substr($amount,-2,1)==1?$amount .” “. $VM_LANG->_(‘PHPSHOP_PRODUCTS_LBL’):$amount .” “. $VM_LANG->_(‘PHPSHOP_PRODUCT2_LBL’);
    else $total_products = $amount .” “. $VM_LANG->_(‘PHPSHOP_PRODUCT2_LBL’);;
    }else{
    $total_products = $amount .” “. $VM_LANG->_(‘PHPSHOP_PRODUCTS_LBL’);;
    }

    Ещё раз спасибо!

    • t3s пишет:

      пожалуйста
      только обратите внимание что в вашем примере в последнем условии дважды стоит точка с запятой – поправьте в своем магазине

  • Alex_ gordon пишет:

    вот вариантик по проще

    function sklonenie($n, $forms) {
    return $n%10==1&&$n%100!=11?$forms[0]:($n%10>=2&&$n%10<=4&&($n%100=20)?$forms[1]:$forms[2]);
    }

    $total_products = $amount .” “. sklonenie($amount , array(‘товар’, ‘товара’, ‘товаров’) ) ;

    принцип работы тот же, автор – beagler.ру

13 комментариев


RSS feed for comments on this post.

Leave a comment