Хак VM-3. Вывод полей из раздела "Габариты/Вес"

denism300

Постоялец
Регистрация
10 Май 2014
Сообщения
129
Реакции
4
Всем известно, что изначально из вкладки Габариты/Вес выводилось только "Количества товара в упаковке".
Я решил исправить данный недостаток. В итоге получилось такое решение:
1. В файле ваш_сайт\templates\ваш_шаблон\html\com_virtuemart\productdetails\default.php необходимо удалить следующий кусок кода:
PHP:
// Product Packaging
$product_packaging = '';
    if ($this->product->product_box) {
    ?>
        <div class="product-box">
        <?php
            echo vmText::_('COM_VIRTUEMART_PRODUCT_UNITS_IN_BOX') .$this->product->product_box;
        ?>
        </div>
<?php } // Product Packaging END ?>

2. Далее, переходим в папку ваш_сайт\templates\ваш_шаблон\html\com_virtuemart\sublayouts и создаем там файл с названием productparams.php, копируем в него нижепредставленный код:
PHP:
<?php
/**
* sublayout products
*/

defined('_JEXEC') or die('Restricted access');

$product = $viewData['product'];

/* переведем единицы измерения на русский язык */

function translateUnits($en_units) {
    switch($en_units) {
        case 'M':
            echo 'м';
            break;
        case 'CM':
            echo 'см';
            break;
        case 'MM':
            echo 'мм';
            break;
        case 'YD':
            echo 'ярд';
            break;
        case 'FT':
            echo 'фут';
            break;
        case 'IN':
            echo 'дюйм';
            break;
        case 'KG':
            echo 'кг';
            break;
        case 'G':
            echo 'г';
            break;
        case 'MG':
            echo 'мг';
            break;
        case 'LB':
            echo 'фунт';
            break;
        case 'OZ':
            echo 'унция';
            break;
        case '1 100G':
            echo '100 г';
            break;
        case 'SM':
            echo 'м<sup>2</sup>';
            break;
        case 'CUBM':
            echo 'м<sup>3</sup>';
            break;
        case 'L':
            echo 'л';
            break;
        case '1 100ML':
            echo 'мл';
            break;
      
        default:
            echo ' ';
            break;
    }
}
?>
<div class="product-parametrs">
    <span class="title"><?php echo JText::_('COM_VIRTUEMART_PRODUCT_PARAM_TITLE') ?></span>
    <table class="product-param">
        <tbody>
            <?php //Длина товара
            if ($product->product_length != 0) { ?>
                <tr class="product-param-tr">
                    <td class="product-param-name-td">
                        <span><?php echo JText::_('COM_VIRTUEMART_PRODUCT_LENGTH') ?></span>
                    </td>
                    <td class="product-param-value-td">
                        <?php echo round($product->product_length, 2)  //Выводим длину ?>
                        <?php translateUnits($product->product_lwh_uom)  //Выводим единицу измерения ?>
                    </td>
                </tr>
            <?php }
  
            //Ширина товара
            if ($product->product_width != 0) { ?>
                <tr class="product-param-tr">
                    <td class="product-param-name-td">
                        <span><?php echo JText::_('COM_VIRTUEMART_PRODUCT_WIDTH') ?></span>
                    </td>
                    <td class="product-param-value-td">
                        <?php echo round($product->product_width, 2)  //Выводим ширину ?>
                        <?php translateUnits($product->product_lwh_uom)  //Выводим единицу измерения ?>
                    </td>
                </tr>
            <?php }
  
            //Высота товара
            if ($product->product_height!=0) { ?>
                <tr class="product-param-tr">
                    <td class="product-param-name-td">
                        <span><?php echo JText::_('COM_VIRTUEMART_PRODUCT_HEIGHT') ?></span>
                    </td>
                    <td class="product-param-value-td">
                        <?php echo round($product->product_height, 2)  //Выводим высоту ?>
                        <?php translateUnits($product->product_lwh_uom)  //Выводим единицу измерения ?>
                    </td>
                </tr>
            <?php }
  
            //Вес товара
            if ($product->product_weight != 0) { ?>
                <tr class="product-param-tr">
                    <td class="product-param-name-td">
                        <span><?php echo JText::_('COM_VIRTUEMART_PRODUCT_WEIGHT') ?></span>
                    </td>
                    <td class="product-param-value-td">
                        <?php echo round($product->product_weight, 2)  //Выводим вес ?>
                        <?php translateUnits($product->product_weight_uom)  //Выводим единицу измерения ?>
                    </td>
                </tr>
            <?php }
              
            //Объем упаковки
            if ($product->product_packaging !=0) { ?>
                <tr class="product-param-tr">
                    <td class="product-param-name-td">
                        <span><?php echo JText::_('COM_VIRTUEMART_PRODUCT_PACKAGING') ?></span>
                    </td>
                    <td class="product-param-value-td">
                        <?php echo round($product->product_packaging, 2) //Выводим объем упаковки ?>
                        <?php translateUnits($product->product_unit) //Выводим единицы измерения ?>
                    </td>
                </tr>
            <?php }
              
            //Количество в упаковке
            $product_packaging = '';
            if ($product->product_box) { ?>
                <tr class="product-param-tr">
                    <td class="product-param-name-td">
                        <span><?php echo JText::_('COM_VIRTUEMART_PRODUCT_UNITS_IN_BOX') ?></span>
                    </td>
                    <td class="product-param-value-td">
                        <?php echo $product->product_box //Выводим количество в упаковке ?>
                        <?php echo ' шт' ?>
                    </td>
                </tr>
            <?php } // Product Packaging END ?>
        </tbody>
    </table>
</div>

3. В файле ваш_сайт\templates\ваш_шаблон\html\com_virtuemart\productdetails\default.php в то место, где хотим вывести поля "Габариты\Вес" вставляем строку:
PHP:
<?php echo shopFunctionsF::renderVmSubLayout('productparams',array('product'=>$this->product,'position'=>'newtab')); ?>

из плюсов данного решения:
1. Можно вывести в любом удобном месте карточки товара
2. Реализовано округление до сотых. Теперь не выводятся четыре нуля после точки.
3. Реализован перевод единиц измерения на русский язык. Корявенько, конечно, но ничего умнее не придумал. Тому, кто предложит способ сократить функцию - буду благодарен
4. Т.к. пункты 2 и 3 реализованы без вмешательства в код VM и БД, то при обновлении изменения не будут утеряны.

На выходе у меня получилось так:
7a2a92aa1695.png
 
добавление собственных значений единиц измерения:

/administrator/components/com_virtuemart/helpers/shopfunctions.php
в районе 329 строки есть такой код:

Код:
$weight_unit_default = array(
          'PCS' => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_KG')
        , '100G' => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_100G')
        , 'м'   => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_M')
        , 'SM'   => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_SM')
        , 'CUBM'   => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_CUBM')
        , 'L'   => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_L')
        , '100ML'   => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_100ML')
        );

в него добавляем
Код:
Код:
'шт'   => vmText::_ ('шт')
только не забыть поставить "запятую", у меня получилось так.
Код:
Код:
$weight_unit_default = array(
            'шт'   => vmText::_ ('шт')
        , 'PCS' => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_KG')
        , '100G' => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_100G')
        , 'м'   => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_M')
        , 'SM'   => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_SM')
        , 'CUBM'   => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_CUBM')
        , 'L'   => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_L')
        , '100ML'   => vmText::_ ('COM_VIRTUEMART_UNIT_SYMBOL_100ML')
        );
При обновлении VM изменения сотрутся. Придется добавлять заново!
 
Не очень удобный вариант. Куда проще в этом случае либо переопределять имеющиеся единицы измерения в те, что нужно. Например, м3, если не используются, можно определить как шт. Но сделать это следует в шаблоне. Тогда изменения не затрутся обновлением.

А кто-нибудь знает как вывести единицы измерения в списке товаров? Цена там выводится в каждом товаре, а вот единицу измерения к цене если поставить, тоже в код лезть, чтобы потом затёрлись изменения? Или есть более щадящий метод?
 
А кто-нибудь знает как вывести единицы измерения в списке товаров? Цена там выводится в каждом товаре, а вот единицу измерения к цене если поставить, тоже в код лезть, чтобы потом затёрлись изменения? Или есть более щадящий метод?

Я как-то для своего проекта делал Для просмотра ссылки Войди или Зарегистрируйся, если, конечно, мы об одном и том же говорим.
 
Подскажите как сделать фильтрацию товара по данным из "Габариты/Вес"?
Из того, что я встречал - придётся делать это настраиваемыми полями и по ним фильтровать, например с помощью Custom Filters .
То есть заполнять габариты в другом месте.
 
Подскажите как сделать фильтрацию товара по данным из "Габариты/Вес"?
ну либо писать плагин, либо искать готовый. были где-то фильтры для VM
<-------------- добавлено через 7679 сек. -------------->
Из того, что я встречал - придётся делать это настраиваемыми полями и по ним фильтровать, например с помощью Custom Filters .
То есть заполнять габариты в другом месте.
я не сталкивался с такой задачей.
но, если так, то вариант один - писать свой модуль
 
Подскажите как сделать фильтрацию товара по данным из "Габариты/Вес"?
<-------------- добавлено через 9855 сек. -------------->
Из того, что я встречал - придётся делать это настраиваемыми полями и по ним фильтровать, например с помощью Custom Filters .
То есть заполнять габариты в другом месте.
подскажите как автоматизировать заполнение настраиваемых полей (что бы значения брались с "Габариты/Вес"?)
<-------------- добавлено через 496 сек. -------------->
пробовал залить эти значения в кастомные поля с помощью CSVI Pro, в карточке товара появляются соответствующие поля, но значения не присваеваются
gmkm9e
gmkmk4

<-------------- добавлено через 62 сек. -------------->
Для просмотра ссылки Войди или Зарегистрируйся
Для просмотра ссылки Войди или Зарегистрируйся
<-------------- добавлено через 1025 сек. -------------->
надыбал SQL запрос, но не могу в нём раздуплиться:
Код:
UPDATE rwvd8_virtuemart_customs, rwvd8_virtuemart_product_customfields, etrade_products
SET rwvd8_virtuemart_product_customfields.custom_value=etrade_products.tov_size
WHERE rwvd8_virtuemart_customs.custom_title='Размер'
AND rwvd8_virtuemart_product_customfields.virtuemart_custom_id= rwvd8_virtuemart_customs.virtuemart_custom_id
AND etrade_products.tov_id= rwvd8_virtuemart_product_customfields.virtuemart_product_id;;;
INSERT INTO rwvd8_virtuemart_product_customfields (virtuemart_product_id, virtuemart_custom_id, custom_value)
SELECT etrade_products.tov_id, (SELECT virtuemart_custom_id FROM rwvd8_virtuemart_customs WHERE custom_title='Размер' GROUP BY virtuemart_custom_id) as virtuemart_custom_id, etrade_products.tov_size
FROM etrade_products WHERE etrade_products.tov_id
NOT IN (SELECT virtuemart_product_id FROM rwvd8_virtuemart_product_customfields WHERE virtuemart_custom_id=(SELECT virtuemart_custom_id FROM rwvd8_virtuemart_customs WHERE custom_title='Размер' GROUP BY virtuemart_custom_id));;;
 
Назад
Сверху