пʼятницю, 12 травня 2017 р.

jQuery Autocomplete и модальное окно Bootstrap

Проблема - настроенный автокомплит работает, отправляет запросы на сервер, но выпадающий список не рисуется.

Оказывается, всё работает, но <UL> со списком значений рисуется за пределами модального окна бутстрапа.

Решение - нужно в настройках автокомплита указать, к какому родительскому элементу прикрепить этот список:

<div class="form-group options-form-group">
  <label>Опции</label>
  <input id="options-autocomplete" type="text" name="option_id" class="form-control">
</div>
<script>
  $('#options-autocomplete').autocomplete({
    appendTo: ".options-form-group"
  });
</script>

четвер, 5 січня 2017 р.

Настройка временной зоны веб-сервера XAMPP

1. Настройка Апача

Добавить строчку в файл httpd.conf:
(Имена доступных временных зон можно подсмотреть по адресу http://php.net/manual/en/timezones.php)
Примечание: если вы работаете в php версии выше 5.4.0, то этот пункт можно опустить, так как переменная окружения TZ больше не используется при угадывании временной зоны.
# D:\xampp\apache\conf\httpd.conf
SetEnv TZ Europe/Kiev

2. Настройка PHP

В файле php.ini найти строку date.timezone, раскомментировать (убрать точку с запятой в начале строки) и вписать свою временную зону:
# D:\xampp\php\php.ini
date.timezone = "Europe/Kiev"

3. Настройка MySQL

Добавить строчку в файле my.ini
# D:\xampp\mysql\bin\my.ini
default-time-zone = "Europe/Kiev"

После всех изменений перезагрузить Апач и MySQL.

понеділок, 26 грудня 2016 р.

Обновляем цены в интернет-магазине на Okay-CMS



Встроенный функционал Okay-CMS позволяет импортировать товары из файла, но совсем не заточен под простое обновление цен. Бывают ситуации, когда из прайс-листа нужно обновить только те цены, которые уже есть на сайте и пропустить все остальные. Стандартный же функционал заставляет нас заполнять поле с названием товара, и постарается его создать, если не найдет такой в базе данных по артикулу или названию товара.

Кроме того, меня лично не устраивает что на обновление каждого товара система делает как минимум 2 запроса - SELECT его из базы, а потом UPDATE. Все шаред-хостинги, которые я видел (да-да, меня жаба давит на VPS а шареда вполне хватает) имели ограничение на количество запросов к бд что-то в пределах 3-4 тыс. операций в час. То есть в час мы можем обновить максимум 2000 товаров.

Попробуем решить все эти проблемы сразу, создав отдельный модуль обновления цен товаров.

середу, 14 грудня 2016 р.

Убираем оплату Яндекс.Деньги в библиотеке Y.CMS для OpenCart2

Ситуация у моего клиента: он установил себе на магазин библиотеку Y.CMS для OpenCart2 и вовсю ей пользуется, но попросил отключить функционал оплаты Яндекс.деньгами. В самой библиотеке кошелек не настроен, тем не менее такой вариант оплаты при оформлении заказа всё равно выводится. Как отключить штатными средствами я не нашел, поэтому немного поковырялся в коде.
Создание списка доступных методов оплаты в Opencart происходит в шаблоне
catalog\view\theme\ваша_тема\template\checkout\checkout.tpl
Там идёт ajax-запрос к контроллеру
catalog\controller\checkout\checkout.php
Который перебирает все подключенные модели оплаты, и создаёт из них список доступных методов оплаты. Находим модель нашей библиотеки и в самое начало метода ставим return false;
/* catalog\model\payment\yamodule.php */
class ModelPaymentYamodule extends Model {
  public function getMethod($address, $total) 
  {
    return false;
    $this->load->language('payment/yamodule');
    ...
  }
}

середу, 8 червня 2016 р.

Как добавить заказ в один клик для интернет-магазина на Okay-CMS (форк Simpla)

Идём в админку и добавим новый способ доставки "Купить в 1 клик", то же самое добавим в способ оплаты.

Открываем phpMyAdmin и смотрим, под каким id добавились эти записи в таблицах `s_delivery` и `s_payment_methods`. У меня - 9 и 14 соотвественно. Запомним эти значения.

Открываем `product.tpl` в нашем дизайне и добавим весь код где-то под кнопкой добавления в корзину.

Важно!!! Вставлять только после закрывающего тега <form></form>, иначе получится вложенная форма, которую браузер проигнорирует.

Можно было бы сделать всплывающее окно с помощью Modal от Bootstrap, но в моём шаблоне получилась бы форма, вложенная одна в другую. А Fancybox создает отдельный <div> в самом низу страницы.
{* Кнопка "купить в 1 клик" *}
<a href="#oneClick" class="fn-openform btn btn-success btn-sm">
  <i class="fa fa-thumbs-up"></i> купить в 1 клик
</a>
{* Модальное окно *}
<div id="oneClick" style="display: none;">
  <form action="/{$lang_link}cart" method="post">
    <input type="hidden" name="checkout" value="1">
    <input id="oneClickAmount" type="hidden" name="amounts[]" value="1">
    {* в value запишем id метода доставки *}
    <input type="hidden" name="delivery_id" value="9">
    {* в value запишем id метода оплаты *}
    <input type="hidden" name="payment_method_id" value="14">
    <input type="hidden" name="name" value="OneClick Client">
    {* указать email ящик, на который будут уходить подтверждения покупки *}
    <input type="hidden" name="email" value="null@null.com">
    <input type="hidden" name="address" value="">
    <input type="hidden" name="comment" value="">
    <h4 class="title">{$product->name|escape|rtrim}</h4>
    <div class="input-group">
      <input type="tel" class="form-control oneform" name="phone" placeholder="Укажите номер телефона" required>
      <span class="input-group-btn">
        <button type="submit" name="enter" value="1" class="btn btn-default">Купить!</button>
      </span>
    </div>
  </form>
</div>
{literal}
  <script>
    $(".fn-openform").fancybox({
      helpers : {
        overlay : {
          locked : false
        }
      },
      closeBtn: false,
      fitToView: false,
      minHeight: "0",
      minWidth: "350",
    });
    $(".fn-openform").click(function() {
      amount = $('form.fn-variants').find('[name=amount]').val();
      variant_id = $('form.fn-variants').find('[name=variant]').find(':selected').val();
      $('#oneClickAmount').attr('name', 'amounts['+ variant_id +']');
      $('#oneClickAmount').val(amount);
    });

  </script>
{/literal}

Как вы можете видеть, у пользователя не спрашивается email (это многих покупателей отпугивает, как выяснилось). Можно было бы сломать проверку на обязательное поле email при формировании заказа, но я пошел более простым путём - создал на своём домене лишний ящик, и настроил чтобы все входящие письма сразу же удалялись. Ну или можно указать ящик менеджера, который будет обрабатывать заказы. На ваше усмотрение.

четвер, 26 травня 2016 р.

Twitter Bootstrap вывод блоков в виде «плитки»

Для того, чтобы вывести блоки Bootstrap в виде адаптивной плитки (её еще называют «METRO-интерфейс», есть разные решения, даже разработаны специальные библиотеки:


середу, 25 травня 2016 р.

Выбор количества товаров на странице в Simpla





Заказчик попросил меня доработать функционал Simpla, добавив в шаблон вывода списка товаров возможность выбрать количество товаров на странице. Оказалось, для этого почти ничего делать не нужно было, весь функционал уже готов.

вівторок, 24 травня 2016 р.

Smarty-функция для вывода карусели товаров



В самом шаблоне Smarty можно создавать примитивные функции, которые помогут настроить внешний вид какого-либо стандартного виджета, которые можно будет вызывать одной строчкой, передавая данные для вывода и нужные параметры.

пʼятницю, 20 травня 2016 р.

Очистка системы от продуктов Adobe



В очередной раз в ходе моих экспериментов похерились все установленные программы от Adobe: Photoshop, Illustrator, Indesign (вполне себе лицензионные, уж будьте покойны :) Решил попробовать триальную версию Adobe Design CC и вот сижу бью себя по рукам. Переустановить старый добрый Adobe CS 5.5 Design Premium никак не получается - установщик распаковывается и тишина.

Начнём же эксперименты!

вівторок, 17 травня 2016 р.

Добавление картинки к блогу в Simpla





Блог без картинки - это прошлый век. Добавим же её! Нам нужно будет внести некоторые изменения как в сам шаблон, так и в админку. Поэтому при обновлении Simpla на новую версию скорее всего всё похерится. Селяви.

Сначала я думал воспользоваться нативным хранением картинок для товаров, но после решил отказаться от этой мысли. Во-первых, заглавная картинка для блога нам нужна всего одна и возможность хранить сразу несколько для одной страницы блога явно избыточна. Но хуже всего то, что в таблице s_images картинки привязаны к товару product_id. Я решил, что добавлять еще одно поле blog_id - это нарушать "нормальность" этой таблицы, и решил пойти другим, более "топорным", но простым путём - добавить в таблицу s_blog поле image, в котором и буду хранить путь к картинке.