Различные единицы измерения
Как обычно начинаем с базы: добавим в таблицу вариантов поле, где будем хранить единицы измерения.
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.
Добрый день, не понятна проблема, можно более подробно описать.Опишите в полной последовательности ваши действия, какой список вариантов выбираешь и что с ценой происходит?
можете сбросить ссылку на страницу (продукт) где не срабатывает
в коде написанно все правильно, возможно, где-то допущенна ошибка.
Для корзины и заказа это соответственно $purchase->variant->unit.