Совет: Для того, чтобы добавить этот товар в Вашу корзину Вы должны выбрать свойства товара на странице с его описанием

Это сообщение может появится в интернет-магазине VirtueMart на Joomla в случае использования подтоваров, плюс если у родительского товара есть свои свойства. Стоит попытаться положить подтовар в корзину и вы увидите это сообщение, а товар в корзину не попадет.У меня проблема решилась следующим образом:

  1. В фаиле /administrator/components/com_virtuemart/classes/ps_cart.php, в функции add() закомментировал строки (отличается в разных версиях VirtueMart, но найти по смыслу можно):
    if ( ($result["attribute_given"] == false && !empty( $result["advanced_attribute_list"] ))
     || ($multiple_products == 1 && ($result["custom_attribute_given"] == false && !empty( $result["custom_attribute_list"] ))) ) {
      $_REQUEST['flypage'] = ps_product::get_flypage($product_id);
      $GLOBALS['page'] = 'shop.product_details';
      $vmLogger->tip( $VM_LANG->_('PHPSHOP_CART_SELECT_ITEM',false) );
      return true;
    }
  2. Чтобы в списке товаров в корзине не вылезли свойства родительской позиции, во всех файлах php в папке /components/com_virtuemart/themes/default/templates/basket/ код:
    <?php echo $product['product_name'] . $product['product_attributes'] ?>

    заменил на:

    <?php
    $brPos = strpos($product['product_name'], "<br />");
    if ($brPos !== false) $product['product_name'] = substr($product['product_name'], 0, $brPos);
    echo $product['product_name'];
    ?>

Перехват вывода в Joomla

Бывает что на сайте, сделанном на Joomla, нужно сделать небольшие изменения, и при этом не хочется разбираться в дебрях стандартных и сторонних шаблонов. В этом случае может помочь перехват и частичная замена стандартного вывода. Для этого меняем в корне сайта файл index.php. В его конце нужно заменить код:

echo JResponse::toString($mainframe->getCfg('gzip'));

на:

$iBuffer = JResponse::toString($mainframe->getCfg('gzip'));
require_once ('intercept.php');
echo $iBuffer;

А в файле intercept.php как раз можно произвести необходимые замены в выводе, находящемся в данном случае в переменной $iBuffer.
Кстати этот подход можно применить практически к любому движку.

Как сделать 301 редирект (объединение страниц с www и без)

Для того чтобы объединить страницы сайта с www. и без, в глазах поисковика, и при этом не потерять имеющийся вес страниц, можно воспользоваться 301 редирект. Пример записи в фаиле .htaccess ниже (замените example.ru на свой домен):

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.ru
RewriteRule (.*) http://www.example.ru/$1 [R=301,L]

Можно и не использовать .htaccess, а сделать все на PHP. Пример:

if (substr($_SERVER['HTTP_HOST'],0,3)!='www') {
  header("HTTP/1.1 301 Moved Permanently");
  header("Location: http://www.".$_SERVER['HTTP_HOST'].str_replace('index.php','',$_SERVER['PHP_SELF']).($_SERVER['QUERY_STRING']?'?'.$_SERVER['QUERY_STRING']:''));
}

При использовании кода, указанного выше, домен с www становиться основным или каноническим.

Если у вас Bitrix 4 или ABO.CMS 3 и сервер MySQL 4

Если у вас старый Bitrix или ABO.CMS и сервер MySQL 4, будьте готовы к проблемам. Если ваш хостер из лучших побуждений обновит версию сервера MySQL до 5, ваши сайты могут перестать отрываться! У меня проблема возникла на сайте клиента с Bitrix 4.0.10 и на нескольких сайтах с ABO.CMS 3.3. Причина в несовместимости некоторых сложных SQL запросов. Например, запросы вида:

SELECT [...] FROM [таблица1], [таблица2] LEFT JOIN [таблица3] WHERE [...]

может ожидать крах. Преобразуйте их в:

SELECT [...] FROM [таблица1] JOIN [таблица2] LEFT JOIN [таблица3] WHERE [...]

Многие конфликтные запросы в ABO.CMS находятся в файле /mod/catalog/lib/class.Catalog.php

А чтобы узнать что конфликтует в Bitrix, измените в фаиле /bitrix/php_interface/dbconn.php значение переменной $DBDebug на true. Тогда при открытии сайта в браузере, вы увидите проблемный запрос.