Подарок в зависимости от цены заказа

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

transinffo
transinffo
Репутация: 3
Сообщения: 9
Зарегистрирован: 02.09.2017
С нами: 6 лет 6 месяцев

Сообщение #1 transinffo » 20.09.2017, 14:41

Всем привет.
ТЗ:
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>


korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #2 korshunov » 20.09.2017, 16:45

Насколько можно понять, то покупатель может набрать в корзину много товаров на большую сумму и выбрать подарок. Потом на странице корзины удалить основные товары и купить один подарок по нулевой цене. И еще есть много подобных вариаций.

Подозреваю также, что даже не слишком сообразительный покупатель сумеет легко положить в корзину два (или несколько) подарков.
Если дадите ссылочку на сайт с реализацией, могу попробовать...

transinffo писал(а):3. Если покупатель не купил подарок на странице категории и идет на страницу товара передадим get параметр gift на страницу товара.
Он может перейти кликнув по фото либо по названию товара: \design\stok_1\html\tiny_products.tpl

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

transinffo
transinffo
Репутация: 3
Сообщения: 9
Зарегистрирован: 02.09.2017
С нами: 6 лет 6 месяцев

Сообщение #3 transinffo » 20.09.2017, 18:42

korshunov писал(а):Очень легкомысленный подход.
Я новичок, поэтому сделал на своем уровне знаний. А как бы вы реализовали ? Буду благодарен за подсказку.
Кстати ,если покупатель выберет себе хоть 10 подарков, ему все равно пришлют 1, так что ничего страшного в этом нет.

Добавлено спустя 54 минуты 12 секунд:
Уберем подарочные категории из верхнего и нижнего меню.

1. Верхнее \design\stok_1\html\menu-greedy.tpl:

Код: Выделить всё

            {elseif $c->visible}
                {if !$c->min_gift}
               <li class="{if $level>=3 && $sub_count>$sub_MAX}hidden {/if}{if in_array($category->id, $c->children)}selected{/if}">
                  <a href="catalog/{$c->url}">
                     {$c->name|truncate:30:'...'|escape}
                     {if $c->products_count}<span>({$c->products_count})</span>{/if}
                     {if strtotime($c->created) >= strtotime('-1 months')}<label title='Добавлен в каталог недавно'>NEW</label>{/if}
                  </a>
               </li>
               {/if}
            {/if}

добавил условие {if !$c->min_gift} , то есть выводим только категории с пустым полем min_gift

2. Нижнее: design\stok_1\html\index.tpl

Код: Выделить всё

                  <ul class="row list-inline">
                     {assign var="count" value=0}
                     {function name=categories_footer}
                     {if $categories}
                        {foreach $categories as $c}
                        {if $c->visible && $count <15}
                           {$count = $count + 1}
                                     {if !$c->min_gift}
                               <li class="col-xs-12 col-sm-12 col-md-4 col-lg-6 col-xl-4 p-r-1 f-right-open"><a href="catalog/{$c->url}" data-category="{$c->id}">{$c->name|escape}</a></li>
                             {/if}
                                {/if}
                        {/foreach}
                     {/if}
                     {/function}
                     {categories_footer categories=$categories}
                  </ul>


Добавка та же что и в п.1

OkayCMS M
Администратор
Аватара
OkayCMS M
Администратор
Репутация: 216
Сообщения: 1627
Зарегистрирован: 12.11.2015
С нами: 8 лет 4 месяца
Сайт Skype

Сообщение #4 OkayCMS » 20.09.2017, 20:38

Неплохо как для новичка. Своеобразно, но неплохо.

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #5 korshunov » 21.09.2017, 06:34

transinffo писал(а):Я новичок, поэтому сделал на своем уровне знаний. А как бы вы реализовали ?

Я бы при каждом изменении в корзине делал проверку на предмет наличия подарка (подарков), и по результатам проверки, если надо, предпринимал дополнительные действия по исправлению корзины: удаление лишних подарков (если более одного), удалял подарок, не соответствующий стоимости заказа.
Кроме того, проверять-исправлять подарки надо и при приеме заказа.
Кроме того, проверять-исправлять подарки надо и в админке при редактировании заказа (или хотя бы предупреждать админа о несоответствующем подарке).
Кроме того, max_gift я бы вообще убрал. Достаточно оставить условия "подарки с суммой заказа от 5000", "подарки с суммой заказа от 10000". И если под условия подходят несколько категорий, показывать несколько ссылок на подходящие категории подарка.

Если количество разных подарков не слишком большое, можно использовать ОДНУ категорию подарков, в админке для каждого подарка заполнять отдельное поле порога для применимости подарка. На странице подарков выводить для каждого товара этот порог. И ссылку на эту категорию показывать всегда, только кнопки "В корзину" скрывать в соответствующих случаях.

Еще можно подарки выводить не отдельной категорией, а на странице корзины.


Название раздела: Полезные решения для OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Полезные решения для OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 25 гостей