ТЗ:
1. okaycms 2.1 lite шаблон stok.
2. На странице оформления заказа должна быть ссылка на категорию подарков. Категория зависит от суммы заказа.
Например: подарки с суммой заказа 0-5000, подарки с суммой заказа 5000-10000,подарки с суммой заказа 10000-20000
В каждой категории несколько подарков с ценой 0 и наличием на складе. Выбрать можно один любой подарок.
3. Категорий подарков нет в меню, они доступны только при переходе со страницы оформления заказа.
Решение:
1. Если у товара 0 на складе и цена 0, в корзине появляется "предзаказ". Сделаем чтобы если товар есть на складе, но с нулевой ценой, было сообщение "подарок". Файл: \design\stok_1\html\cart_purchases.tpl
Код: Выделить всё
{* Название товара *}
<div class="col-xs-12 col-sm-10 col-md-10 col-lg-5 title text-xs-left">
<a class="text-bold color" href="/{$lang_link}products/{$purchase->product->url}">{$purchase->product->name|escape}{if $purchase->variant->name|escape} ({$purchase->variant->name|escape}){/if}</a>
{if $purchase->variant->name|escape}
<br /><b class="text-md">{$purchase->variant->name|escape}</b>
{/if}
{if $purchase->variant->stock == 0 && $purchase->variant->price == 0}
<label class="btn-info btn-sm btn-danger text-caps">{$lang->product_pre_order}</label>
{/if}
{if $purchase->variant->stock != 0 && $purchase->variant->price == 0}
<label class="btn-info btn-sm btn-danger text-caps">{$lang->product_gift}</label>
{/if}
</div>
Добавим языковую переменную product_gift:
\design\stok_1\lang\ru.php
Код: Выделить всё
$lang['product_gift'] = "Подарок";
2. Добавим в админпанель в категории два новых текстовых поля для задания нижней и верхней границы диапазона суммы заказа.
Для начала добавим в таблицу бд ok_categories новые поля min_gift и max_gift целого типа.
а) \backend\core\CategoryAdmin.php добавим вначале:
Код: Выделить всё
$category->min_gift = $this->request->post('min_gift', 'integer');
$category->max_gift = $this->request->post('max_gift', 'integer');
б) \api\Categories.php добавим почти в конце min_gift и max_gift:
Код: Выделить всё
$query = $this->db->placehold("SELECT
c.id,
c.parent_id,
c.url,
c.image,
c.visible,
c.position,
c.level_depth,
c.yandex_name,
c.last_modify,
c.min_gift,
c.max_gift,
в) Добавим поля в шаблон \backend\design\html\category.tpl получилось так:
Код: Выделить всё
<div class="row">
<div class="col-xs-12 col-lg-6 col-md-10">
<div class="">
<div class="input-group">
<span class="input-group-addon">URL</span>
<input name="url" class="fn_meta_field form-control fn_url {if $category->id}fn_disabled{/if}" {if $category->id}readonly=""{/if} type="text" value="{$category->url|escape}" />
<input type="checkbox" id="block_translit" class="hidden" value="1" {if $category->id}checked=""{/if}>
<span class="input-group-addon fn_disable_url">
{if $category->id}
<i class="fa fa-lock"></i>
{else}
<i class="fa fa-lock fa-unlock"></i>
{/if}
</span>
</div>
</div>
</div>
<div class="float"><input name="min_gift" type="text" value="{if $category->min_gift}{$category->min_gift}{/if}" class="form-gift" placeholder="мин"></div>
<div class="float"><input name="max_gift" type="text" value="{if $category->max_gift}{$category->max_gift}{/if}"class="form-gift" placeholder="макс"></div>
</div>
г) Стиль подправим так \backend\design\css\reboot.css:
Код: Выделить всё
.float{float:left;}
.form-gift {
background-color: #ffffff;
background-image: none;
border: 1px solid #ccc;
-webkit-appearance: none;
color: #2c2c2c;
outline: 0;
height: 35px;
padding: 6px 12px;
line-height: normal;
font-size: 14px;
font-weight: normal;
vertical-align: middle;
min-height: 35px;
-webkit-transition: all 0.12s ease;
transition: all 0.12s ease;
-webkit-box-shadow: none;
box-shadow: none;
border-radius: 2px;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
-webkit-transition: background 0.2s linear 0s;
transition: background 0.2s linear 0s;
display: block;
width: 95%;
position: relative;
}
Проверим страницу категории в админке - поля есть и сохраняют данные в бд.
Добавлено спустя 17 минут 51 секунду:
Теперь нужно вывести картинку подарка со ссылкой на категорию подарка, которая соответствует сумме заказа.
1. \api\Cart.php получился такой код (мой код между //roman's code ), пояснения в комментариях:
Код: Выделить всё
foreach($items as $variant_id=>$item) {
$purchase = null;
if(!empty($products[$item->variant->product_id])) {
$purchase = new stdClass();
$purchase->product = $products[$item->variant->product_id];
$purchase->variant = $item->variant;
$purchase->amount = $item->amount;
$cart->purchases[] = $purchase;
$cart->total_price += $item->variant->price*$item->amount;
$cart->total_products += $item->amount;
}
}
//roman's code
$categories = $this->categories->get_categories_tree();
//формируем ассоц. массив array с ключами:id,min_gif,max_gift,image если категория активна и заполнено поле min_gift
foreach ($categories as $value)
if($value->min_gift && $value->visible)
{$array[] = array(id => $value->id, min_gift => $value->min_gift, max_gift => $value->max_gift, image => $value->image);}
//переберем массив категорий: если сумма заказа $cart->total_price между min_gif и max_gift выходим запоминая ид и адрес фото категории
for($i=0;$i<count($array);$i++)
if($cart->total_price > $array[$i]['min_gift'] && $cart->total_price < $array[$i]['max_gift'])
{$gift_cat_id = $array[$i]['id'];$img = $array[$i]['image'];break;}
//передадим переменные в шаблон cart.tpl
$this->design->assign('img', $img);
$this->design->assign('url', $categories[$i]->url);
$this->design->assign('gift_cat_id', $gift_cat_id);
//roman's code
2. \design\stok_1\html\cart.tpl вначале добавил такое:
Код: Выделить всё
{if $gift_cat_id && $smarty.cookies.dar!=1}
<div class="gift">
<div>
<a href="catalog/{$url}?gift=1" target="_blank">
<img alt="gift" src="{if $img}{$img|resize:300:120:false:$config->resized_categories_dir}{/if}">
<b>Выбрать подарок.</b>
</a>
<span>Получите подарок в зависимости от суммы заказа (перейдите по ссылке, выберите подарок и положите его в корзину).</span>
</div>
</div>
{/if}
<div class="container">
Проверка условия: если есть категория подарков с диапазоном, в котором умещается сумма заказа и нет куки dar(то есть еще не выбран подарок) выводим картинку-ссылку.
3. Добавим такой javascript в \design\stok_1\html\scripts.tpl:
Код: Выделить всё
/* функция получения get запроса */
function get(key)
{
var s = window.location.search;
s = s.match(new RegExp(key + '=([^&=]+)'));
return s ? s[1] : false;
}
/* если есть gift в get запросе, создаем куку dar для всех страниц длиной 1 час */
function check_gift()
{
var date = new Date(new Date().getTime() + 3600 * 1000);
if(get('gift'))document.cookie='dar=1;path=/;expires=' + date.toUTCString();
}
Добавлено спустя 30 минут 12 секунд:
Купить подарок можно на странице категории и в самой странице товара. Сделаем чтобы при нажатии "в корзину" она исчезала - выбрал один подарок и хватит.
1. Страница категории подарка \design\stok_1\html\tiny_products.tpl
Код: Выделить всё
{* Кнопка добавления в корзину *}
{if $product->variant->stock > 0}
<button onclick="check_gift()" class="{if $smarty.get.gift==1 && $smarty.cookies.dar==1}none {/if}btn ico-btn_cart fn-is_stock {if $product->variant->stock < 1}hidden-xs-up{/if}" title="{$lang->tiny_products_add_cart}" data-language="tiny_products_add_cart" type="submit"></button>
{/if}
Тоже самое для страницы товара (подарка) \design\stok_1\html\product.tpl:
Код: Выделить всё
{* Кнопка добавления в корзину *}
<button onclick="check_gift()" class="{if $smarty.get.gift==1 && $smarty.cookies.dar==1}none {/if}fn-is_stock btn btn-success ico-btn_2cart{if $product->variant->stock < 1} hidden-xs-up{/if}" type="submit" data-language="product_add_cart">{*$lang->product_add_cart*}Купить сейчас</button>
</div>
При первом нажатии на иконку "купить" проверка есть ли get параметр gift(только если перешли из корзины), если есть, то создаем на час куку dar.
Если уже есть и get параметр gift и кука добавим к классу кнопки "none", то есть уберем кнопку.
2. Добавим стили здесь: \design\stok_1\css\style.css
Код: Выделить всё
.none{display:none;}
.gift{background-color:#00b5a4;color:#fff;padding:1em;margin:1em;font-size:1.2em;}
.gift a{color:#fff;text-decoration-color:#fff;}
3. Если покупатель не купил подарок на странице категории и идет на страницу товара передадим get параметр gift на страницу товара.
Он может перейти кликнув по фото либо по названию товара: \design\stok_1\html\tiny_products.tpl
Код: Выделить всё
{* Название товара *}
<h3 class="card-title m-a-0 p-x-sm" data-product="{$product->id}">
<a onclick="if(get('gift'))this.href=this.href+'?gift=1'" href="/{$lang_link}products/{$product->url}">{$product->name|strip_tags|truncate:45:'...'}{if $product->brand}<i>{$product->brand|escape}</i>{/if}</a>
</h3>
и в этом же файле выше:
Код: Выделить всё
{* Изображение товара *}
<div class="card-image image m-b-sm">
{if $product->image->filename} <img class="fn-img" src="{$product->image->filename|resize:180:150}" alt="{$product->name|escape}" title="{$product->name|escape}"/>
{else} <img class="fn-img" src="design/{$settings->theme}/images/staticSheets/no_image.png" style="width:80px;" alt=""/>{/if}
{if $product->special} <img class="card-spec" src='files/special/{$product->special}' alt='{$product->sp_img}'/>{/if}
<a onclick="if(get('gift'))this.href=this.href+'?gift=1'" class="fn-zoom over-all" href="{if $smarty.get.module=="ComparisonView"}{$product->image->filename|resize:800:600:w}{else}{$lang_link}products/{$product->url}{/if}"></a>
</div>
Добавлено спустя 14 минут 57 секунд:
Если покупатель пришел по ссылке из корзины за подарком кликнул "купить", потом в модальном окне выбрал "продолжить покупки", страница не перезагружается и получается он опять может купить еще один подарок. Сделаем, чтобы при выборе "продолжить покупки" страница перезагрузилась.
1. \design\stok_1\html\modals.tpl дабавим window.location.reload():
Код: Выделить всё
<div class="btn btn-lg btn-info pull-md-right m-b-sm" onclick="window.location.reload();$(this).parents('.modal').fadeOut(); return false;">Продолжить покупки</div>