Различные единицы измерения

Различные единицы измерения

Дата публикации:
Поделиться:

Как обычно начинаем с базы: добавим в таблицу вариантов поле, где будем хранить единицы измерения.

ALTER TABLE `s_variants` ADD `unit` VARCHAR( 50 ) NOT NULL AFTER `stock`

Теперь в файле api/Variants.php инициализируем наш список единиц - сразу посли объявления класса

class Variants extends Simpla
{

объявим переменную $units

    public $units = array(
        'кг' => array('килограмм', 'килограмм', 'килограмма'),
        'тн' => array('тонна', 'тонн', 'тонны'),
        'л' => array('литр', 'литров', 'литра'),
    );

В этом же файле поменяем в запросах набор полей в выборке (в двух местах)

v.name

меняем на 

v.unit, v.name

Теперь выведем наши переменные в шаблоны. Для этого в файлах simpla/ProductAdmin.php (в админке для редактирования карточки товара), simpla/view/ProductVeiw.php (для карточки в клиенте), simpla/view/CartVeiw.php (для склонения в корзине в клиентской части) и simpla/view/OrderVeiw.php (для заказа) перед вызовом шаблона в конце файлов

return $this->design->fetch

передадим наш массив единиц в шаблоны

$this->design->assign('units', $this->variants->units); 

Теперь отредактируем сами шаблоны. В редактировании карточки товара simpla/design/html/product.tpl заменим код вывода варианта

            <li class="variant_amount">    <input name="variants[stock][]"         type="text"   value="{if $variant->infinity || $variant->stock == ''}∞{else}{$variant->stock|escape}{/if}" />{$settings->units}</li>

на

            <li class="variant_amount">    <input name="variants[stock][]"         type="text"   value="{if $variant->infinity || $variant->stock == ''}∞{else}{$variant->stock|escape}{/if}" /> {if $units|count > 1}<select name="variants[unit][]" style="width: 40px;">{foreach $units as $key=>$unit}<option value="{$key}"{if $variant->unit == $key} selected{/if}>{$key}</option>{/foreach}</select>{else}{$settings->units}{/if}</li>

И далее в этом же файле (для новых вариантов)

			<li class="variant_amount"><input name="variants[stock][]" type="" value="∞" />{$settings->units}</li>

на

            <li class="variant_amount"><input name="variants[stock][]" type="" value="∞" /> {if $units|count > 1}<select name="variants[unit][]" style="width: 40px;">{foreach $units as $key=>$unit}<option value="{$key}">{$key}</option>{/foreach}</select>{else}{$settings->units}{/if}</li>

Функционал работает так, что если не задана принудительно единица измерения, то выводится та, что стоит в Симпле по-умолчанию (через настройки сайта).

Теперь осталось поправить шаблон продукта design/[ваш_шаблон]/html/product.tpl и корзины design/[ваш_шаблон]/html/cart.tpl. В корзине это выглядит так

    <td class="amount">
           <select name="amounts[{$purchase->variant->id}]" onchange="document.cart.submit();">
            {section name=amounts start=1 loop=$purchase->variant->stock+1 step=1}
                <option value="{$smarty.section.amounts.index}" {if $purchase->amount==$smarty.section.amounts.index}selected{/if}>{$smarty.section.amounts.index} {if $purchase->variant->unit}{$smarty.section.amounts.index|plural:$units[$purchase->variant->unit][0]:$units[$purchase->variant->unit][1]:$units[$purchase->variant->unit][2]}{else}{$settings->units}{/if}</option>
            {/section}
            </select>
        </td>

Думаю, что и с остальными разделами разберетесь по аналогии. Т.е. теперь наша единица хранится не просто $settings->units, а непосредственно в варианте товара $product->variant->unit (или просто $v->unit если смотреть на дефолтный шаблон), а для корзины и заказа это соответственно $purchase->variant->unit.

Буду признателен за отзывы и благодарности!

Отзывы

Оставьте отзыв
На него будут приходить уведомление при ответе. На сайте не публикуется

Модули из этой тематики