Услуги О модуле Проекты Компания Демо Документация Скачать FAQ Заметки
BEXX: Интернет-магазин

Новости

Опубликовано обновление модуля до версии 1.1.5
Необходимы интересные шаблоны для интеграции в модуль. С вас шаблон, с меня бесплатная интеграция.

Все новости

Заметки

Как известно, лень двигатель прогресса. Когда каждый день появляется сотня-...
Технология управляемого кеша в 1С-Битрикс хороша, но практическое применени...
Примерно год назад в 1С-Битрикс в тогда еще новой версии 9.1 появился функц...

Все заметки

Обратите внимание:

Brand & business

Последние сообщения блогов


Грабим Яндекс.Маркет в Битрикс за 2 клика

Как известно, лень двигатель прогресса. Когда каждый день появляется сотня-другая новых интернет-магазинов, они невольно приходят к вопросу наполнения его качественным контентом, чтобы и фотки были, и описание, и вообще характеристики товаров и поподробней. Для большинства недостижимым идеалом качества описания товаров является Яндекс.Маркет и очень часто приходится встречать предложения о написании грабберов - скрипты, которые сами собирают информацию с сайта и желательно, чтобы сразу по прайсу в 10 тысяч позиций, всё автоматом и за день-другой. К сожалению или даже к счастью, в Яндекс.Маркете с такими халявщиками борется, например, анализируя слишком частые запросы и вставляя CAPTCHA на страницу.

Читать подробнее...

Результаты использования управляемого кеширования

Технология управляемого кеша в 1С-Битрикс хороша, но практическое применение ее показало плачевный результат.

Читать подробнее...

Практики управляемого (тегированного) кеша

Примерно год назад в 1С-Битрикс в тогда еще новой версии 9.1 появился функционал тегирования кеша. Функционал очень нужный и полезный, который оказался незаменим на высоконагруженных проектах для тонкой настройки сайта.

Читать подробнее...

Как идеи воплощаются в жизнь

Чуть больше двух лет назад в блогах на битриксе я высказывал идею по реализации рабочего стола в админке битрикса. Просто я пытался реализовать такую фичу, но понимал, что трудозатраты на ее реализацию будут впустую, ибо битрикс рано или поздно до этого допрет сам. Прошло 2 года - допер.

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

Архивы по разработке модуля

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

Читать подробнее...

Авторизация Facebook в битрикс

Постановка задачи: необходимо сделать на сайте авторизацию через Facebook Connect. Для пользователя должно выглядеть как просто кнопка facebook "войти". Реализуем программный функционал.

Я преднамеренно решил не использовать как отдельный компонент или тем более модуль. Просто дополнительный код в шаблон сайта - в рамках разрабатываемого проекта так проще.

Краткое описание реализации. Мы размещаем на своей странице сайта код кнопки + подключаем JS + описываем поведение кнопки. В шаблоне сайта мы размещаем код, который будет проверять данные пользователя из Facebook и авторизовывать его, если он уже есть в системе, либо регистрировать и авторизовывать его, если он нам "не известен". То есть фактически мы регистрируем в битриксе нового пользователя и сопоставляем его с пользователем Facebook по id. По сути, вот и всё. Теперь собственно техническая реализация. На странице сайта (любой отдельной, либо на всех через шаблон сайта или включаемых областей) размещаем стандартный код вызова кнопки авторизации Facebook. Выглядит это так:
Код
<?if ($USER->IsAuthorized()):?>
   Authorized
<?else:?>
   <fb:login-button perms="email,user_birthday"></fb:login-button>
   <div id="fb-root"></div>
   <script src="http://connect.facebook.net/ru_RU/all.js"></script>
   <script>
      FB.init({appId: '<?= FACEBOOK_APP_ID ?>', status: true, cookie: true, xfbml: true});
      <?if ($_GET['logout']=="yes"):?>
         FB.logout();
      <?else:?>
         FB.Event.subscribe('auth.login', function(response) {
            window.location.reload();
         });
      <?endif;?>
   </script>
<?endif;?>

Мы проверяем авторизацию пользователя в битриксе и показываем ему кнопку авторизации через Facebook, если авторизации нет. Если пользователь авторизован в битриксе, показываем ему текст "Authorized". Если пользователь на сайт уже заходил и был авторизован через Facebook, но его авторизация в битриксе кончилась, произойдет обновление страницы и пользователь авторизуется. Также обратите особое внимание, при выходе из авторизации битрикса ($_GET['logout']=="yes") необходимо осуществлять выход из авторизации Facebook на сайт. Выход не из самого Facebook, а только с нашего сайта - по сути стираем cookie. Если их не стереть, то при следующем обновлении страницы пользователь будет авторизован заново. На кнопке авторизации Facebook <fb:login-button perms="email,user_birthday"> мы в параметрах задаем, какие данные будем запрашивать, кроме минимальных. В данном случае мы хотели бы получить e-mail и дату рождения.

А теперь внутренняя часть кода, которую необходимо разместить в шаблон сайта в файл header.php , она небольшая, но лучше просматривать отдельно. Ключевые моменты:
Мы проверяем, что пользователь не авторизован и стоит cookie авторизации, при этом не выполняется процедура выхода.
Проверяем cookie и строим хэш из его параметров. Если хэш совпадает с подписью, то проверяем дальше. Ну а дальше в общем-то всё просто - у нас два варианта: либо пользователь новый, либо старый. Соответственно если новый - регистрируем в битриксе по данным из Facebook, генерируем ему пароль. А если старый, то просто авторизуем его. Для всех пользователей задействовано поле в таблице пользователей битрикса EXTERNAL_AUTH_ID - в нем хранится id пользователя в Facebook с префиксом "fb".

Данный функционал в принципе можно развивать до бесконечности, используя API Facebook'а. Можно практически всё.

Платежные документы в формате Excel

Иногда так бывает, что заказчику надо обязательно, чтобы документы заказа из интернет-магазина выводились не как HTML-страничка, а как Excel-документ. Он так привык, ему так удобнее, привычнее и спокойнее. Возможность для этого существует, ниже описывается как это сделать. Информация для разработчиков.

Начнем с того, что напомню, где происходит печать документов заказа. В каждом заказе есть кнопка "Печать документов", при нажатии на нее переходим на вот такую страницу.


Не все знают, что распечатывать можно сразу несколько документов, выделяя их в списке, удерживая ctrl. Так вот, наша задача сводится к тому, чтобы распечатываемый документ был в формате Excel, а не HTML, как это предлагается в стандартной реализации 1С-Битрикс.

Системные шаблоны печатных документов в битриксе расположены в папке /bitrix/modules/sale/reports/ (файлы инклюдят документы из /bitrix/modules/sale/ru/reports/), а пользовательские (дополнительные) размещаются в папке /bitrix/admin/reports/. Для эксперимента можете скопировать системный шаблон документа в пользовательскую папку, изменить его. В принципе, там в шаблонах всё понятно, документация на эту тему есть. В системных шаблонах factura.php и invoice.php (счет) в комментариях описаны используемые переменные. Как раз в качестве примера для изменения как раз и возьмем счет, был HTML, станет Excel, да еще в привычном формате как бы из 1С:Предприятие.

Очевидно, что для генерации документов Excel нам понадобится некая библиотека PHP, я использовал для этого PHPExcel - достаточно функциональная и с большим запасом на будущее. В моем проекте эта библиотека была размещена в /bitrix/php_interface/include/.

Кратко поясню как будут генерироваться документы теперь. Шаблон документа - это обычный PHP-скрипт, мы в нем сразу получаем переменные заказа и можем с ними оперировать как угодно, можно получить из базы дополнительные данные, например, некие свойства элементов ИБ. Затем берем существующий файл Excel с шаблоном документа и специальными маркерами, заменяем маркеры на нужные переменные и отдаем пользователю получившийся Excel-документ. В качестве маркеров я использовал простые конструкции #FIELD#, заменяются они простым str_replace. Но есть строки, которые одной переменной не опишешь, например, список товаров - там множество строк, их придется вставлять программно. Когда Excel-файл сгенерирован, отдаем его прямо скриптом, при этом заменяем заголовки страницы. В итоге пользователь получает Excel-файл на скачивание примерно вот такого вида:


Исходные коды можно скачать здесь. В архиве 2 файла: invoice.php и invoice.xls - их надо распаковать в /bitrix/admin/reports/ (создать папку, если нет). В файле invoice.php укажите свой путь до PHPExcel, если отличается. Отредактируйте invoice.xls как вам надо, замените реквизиты на свои, можете вставить любые другие данные, картинки в качестве логотипа.

Важное замечание - библиотека PHPExcel не работает при установленной настройке PHP mbstring.func_overload = 2 (должно быть значение 0).

Экспериментальный модуль "Нормальные шаблоны"

В настоящее время в модуле bexx.shop используется компоновка шаблонов целым файлом template.php, при этом header.php и footer.php используются для перехвата данных страниц с помощью буферизации PHP. Метод имеет массу недостатков, среди которых главный - необходимость использования подмены константы define("BX_BUFFER_USED", false); Буйным цветом недостатки всплыли при переходе на 1С-Битрикс версии 9.5.х, где появились новые рюшечки в панели администрирования. Собственно, после обновления системы, либо не показывается вообще ничего, либо панель показывается криво. Явно метод устарел, в этой связи были потрачены несколько драгоценных минут на создание более продвинутого костыля.

Новый костыль пока на этапе эксперимента и предлагается в виде отдельного модуля bexx.normal_template. Модуль крайне простой, логика работы примитивна. За основу был взят модуль компрессии 1С-Битрикс. В начале работы битрикса модуль начинает буферизацию, вконце модуль заканчивает буферизацию. В итоге имеем контент страницы. Далее просто вставляем контент в шаблон template.php, если он есть. Стандартные файлы header.php и footer.php необходимо оставить и сделать их пустыми. Ну или в header.php можно записать используемые функции для шаблона, например, генерация заголовка страницы или генерация каких-то html-блоков. Разумеется, модуль работает только для публичной части, отключается для AJAX-запросов. Так что нормально работает и AJAX с системными компонентами, с компонентами bexx.shop, корректно показывает отладочную информацию по компонентам и т.д. Скачать модуль можно здесь. Установка стандартная - распаковываем в /bitrix/modules/, устанавливаем через админку. Буду рад любому фидбэку от испытателей.

Важные замечания: в шаблоне template.php не будут работать отложенные функции, вместо них надо использвать нормальные.
вместо $APPLICATION->ShowMeta() следует использовать $APPLICATION->GetMeta()
вместо $APPLICATION->ShowPanel() следует использовать $APPLICATION->GetPanel();
и т.д.
Отложенные функции также могут использоваться в системных компнентах, например, bitrix:breadcrumb. Следует исключить этот компонент из шаблонов.

Модуль совместим с текущими шаблонами модуля bexx.shop. Не забудьте удалить define("BX_BUFFER_USED", false); из файла /bitrix/php_interface/dbconn.php, а также удалить буферизацию из header.php / footer.php, в них надо оставить только свои функции, если есть.

Модуль не совместим с модулем компрессии!

Roadmap по состоянию на август 2010

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

Читать подробнее...

Переезд на новый хостинг

Наконец-то руки дошли до смены хостера. Был Ру-Центр, теперь ТаймВеб. Причин для переезда несколько, главная из них - нехватка места и замороченность с покупкой нового. В Ру-Центре всего 3 тарифных плана, отличающихся по сути только используемым местом. Был тарифный план за 510 рублей/месяц, по нему предоставлялось 3 Гб места. Когда место кончилось, пришлось покупать такой же хостинг за те же 510 рублей с теми же 3 Гб места и объединять их, перераспределяя дисковое пространство - маразм какой-то. В итоге имеем 6 Гб за 1020 рублей в месяц. Теперь и 6 Гб кончилось, покупать третий хостинг уже как-то накладно, за 1530 рублей можно взять очень много разных других хостингов, где места будет куда больше 9 Гб. В общем, пришлось переехать на ТаймВеб - 825 рублей за 10 Гб - вполне сносно. Да, конечно если поискать, попробовать, можно найти и получше и подешевле и места побольше. Но не до поисков сейчас. По производительности серверов и качеству обслуживания примерно одинаково.

Ну и пользуясь случаем, не могу не упомянуть немецкий хостинг - hetzner.de, очень меня радуют их тарифы, например аренда выделенного сервера Intel® Core™ i7-920 Quadcore с 8 Гб памяти и 2х750 Гб дисками на борту всего за 50 евро в месяц, правда там еще установка +150 евро единоразово. До такого хостинга я со своими мелкими проектами еще не дорос, но всё впереди. Размещаем у них один очень большой проект клиента уже полгода, всем довольны, никаких сбоев и нареканий. Так что если у кого-то большие проекты, лучше туда, там цивилизация.

Сколько стоит магазин

Все клиенты задают массу вопросов, среди массы вопросов всегда есть вопрос о цене.

Читать подробнее...

Интеграция bexx.shop с 1С

Часто возникает у пользователей модуля bexx.shop проблема связки товарного каталога с 1С. Проблема заключается в том, что при выгрузке из 1С создается новый каталог товаров. А требуется выгрузка в старый каталог товаров, где уже есть все необходимые свойства.

Кратко поясню как происходит выгрузка из 1С. Каждый каталог товаров, раздел и товар в 1С имеет свой код вида "e0cc5fe1-16f2-11de-a406-001a4ba84b58". Этот код используется для идентификации всего и вся в Битриксе при последующих обновлениях. Если кодов таких нет в Битриксе, значит 1С будет не обновлять, а создавать новые записи. Так что вся задача сводится к тому, чтобы этот код указать у существующего инфоблока с каталогом товаров. Для этого вам надо получить просто этот код для инфоблока. Можно в 1С найти этот код, а можно и сделать выгрузку в Битрикс, чтобы она создала свой инфоблок - этот способ расписан по шагам ниже:
1. Делаем обычную выгрузку из 1С в Битрикс.
2. 1С создает свой каталог товаров, из него надо выцепить XML_ID (внешний код). Для этого можно выполнить в битриксе SQL-запрос вида "SELECT XML_ID FROM b_iblock WHERE ID=XXX", где XXX - это ID созданного 1С инфоблока. Копируем XML_ID.
3. Записываем XML_ID в старый инфоблок, можно тоже SQL-запросом.
4. Удаляем инфоблок, созданный 1С.
5. Повторяем выгрузку из 1С - данные должны выгрузиться в существующий инфоблок.

Это пока временное решение, в дальнейшем будут какие-то инструменты и расширенная интеграция с 1С.

1000+ скачиваний модуля

Вчера количество скачиваний модуля bexx.shop перевалило за 1000, а платежной системы QIWI около 400. Учитывая, что модуль раздается бесплатно с января, то получается, что в среднем ежедневно скачивают по 10 копий. Это позитив.
Из общения с пользователями модуля видно, что он свое назначение выполняет - предлагает дополнительный функционал, экономит время разработчика, поднимает на новый уровень интерфейс интернет-магазинов. И это позитив. Да, есть недоработки, глюки, ошибки, недостающий функционал и скудная документация, но всё это поправимо и будет дорабатываться в ближайшие дни.
Бесплатная раздача модуля оказалась достаточно прибыльным делом. Косвенно естественно. Классическая ситуация - человек скачал модуль, поставил на битрикс, ему понравилось, но ему захотелось доработок и переделок - обращается ко мне. В последнее время все проекты именно такие. Клиенту доработки обходятся дешевле, чем разработка такого же интернет-магазина с нуля, а мне выполнение задачи не занимает много сил, так как это просто доработки. К тому же часто клиенты заказывают такие доработки, которые потом можно оставить в модуле, тем самым его развивать. Так что бесплатный софт - это позитив. Разумеется, такой подход актуален при сложных решениях, которые требуют внедрения. Допустим, по поводу внедрения QIWI никто ко мне не обращался, потому что внедрять там нечего.
Кстати, о планах, что появится в ближайших обновлениях:
* Дополненный и исправленный интерфейс (все страницы)
* Существенно переработан фильтр товаров (произвольные свойства каталога товаров, а не только производители)
* Компонент для подбора аналогичных товаров (по сходным параметрам)
* Изменения на страницах разделов (представление иконок разделов, вместо товаров)
* Изменения панели сортировки товаров (можно будет установить свое количество товаров, установить свой вид отражения списка, изменен внешний вид)
* Возможность подписки на появление товара в наличии
* Полностью будет переработана система комментариев и рейтингов
* Версия для UTF-8 будет наконец нормальная

Также есть ряд экспериментальных функций, которые могут быть внедрены, если сохранится в них потребность. Например, подгрузка ранее использованных слов при заполнении ключевых слов. Если есть какие-то пожелания по модулю - пишите на info@bexx.ru

Автоматический ресайз картинок в 1С-Битрикс

Данным постом я начинаю серию публикаций, раскрывающих алгоритм работы некоторых частей модуля bexx.shop. Многие из опубликованных вещей не имеют отношения только к интернет-магазинам и будут полезны на любых типах других проектов. Начну с достаточно распространенной задачи ресайза картинок на сайте.

Понятное дело, что ресайзить картинки приходится практически всегда и везде, ведь нам хочется показать пользователю картинку и большого качества и маленькую в списках товаров и среднюю на странице товара - это уже как минимум 3 разных размера картинки, а реально их может быть гораздо больше. Что нам предлагает 1С-Битрикс - ресайз картинок при загрузке и при этом ресайзится картинка анонса или детальная. При этом саму исходную картинку мы теряем. А если нам надо отобразить тот же контент, но на другом сайте, где другой шаблон и другие размеры картинок? В пролете. При этом нам предлагается загружать отдельно картинку анонса и детального описания, но чаще всего это одна и та же картинка. В общем, стандартный вариант далек от совершенства. Делаем свой.

Постановка задачи:
1. Ресайз картинок должен быть максимально гибким. Мы должны иметь исходную картинку и создавать из нее сколько угодно различных малых изображений для применения на различных сайтах в любом виде.
2. Должна быть возможность наложения ватермарка.
3. Должна быть возможность кэширования ресайзов, разумеется, чтобы они не генерировались каждый раз при их вызове.

Как обычно, до нас уже всё сделано. Существуют различные библиотеки для работы с графикой, лично мне приглянулась phpThumb - простая, легкая, документированная, очень функциональная. Именно она может делать ресайзы любого размера, с любыми параметрами. Например, она умеет делать zoom-crop - это обрезание картинки до нужного размера с сохранением пропорций. Она же умеет накладывать ватермарки, подставлять фон на добавленных участках картинки и т.д.

Теперь нам надо применить эту библиотеку для наших картинок на сайте. Разместите файл где-то в недрах битрикса, например, в /bitrix/php_interface/includes/ . Есть замечательный файл /bitrix/php_interface/init.php (если нет, создайте), он подключается при каждом вызове страниц сайта, поэтому в нем можно определить пользовательские функции и классы. Именно в нем подключите phpThumb, допустим, include('/bitrix/php_interface/includes/phpThumb/phpThumb.class.php');

Всё, библиотека подключена, ее в принципе уже можно использовать для ресайза картинок. Там в документации по библиотеке есть уже один вариант использования путем вызова картинок через эту библиотеку, но это не наш метод. Мы дальше напишем некую удобную функцию, которая скрасит наши часы разработки. Назовем эту функцию MakeImage(), определим ее в том же файле init.php. Входные данные для этой функции путь или ID картинки, размер, время кэширования и дополнительные параметры. А на выходе будет путь до новой картинки.
Код
/**
* Генерация превьюшек для больших изображений
*
* @param string $src путь от корня сайта к исходной картинке
* @param int $size размер изображения (сторона квадрата в пикселях)
* @param int $lifeTime время жизни превьюшки в секундах (по дефолту месяц)
* @return string
*/
function MakeImage ($src, $size=87, $lifeTime = 2592000, $params = "") {
   if (!$lifeTime) $lifeTime = 2592000;
   if (!$size) $size = 87;
    if (is_numeric($src)) if ($src > 0) $src = CFile::GetPath($src);
   if (file_exists($_SERVER['DOCUMENT_ROOT'].$src)) {
        require_once($_SERVER['DOCUMENT_ROOT']."/bitrix/php_interface/includes/phpThumb/phpthumb.class.php"); // Подключаем и иннициализируем phpThumb
        $phpThumb = new phpThumb();
        $phpThumb->src = $src;
        $ext = end(explode(".", $src)); // Расширение файла картинки
        switch ($ext) {
            case "jpg": $phpThumb->f = "jpeg"; break;
            case "gif": $phpThumb->f = "gif"; break;
            case "png": $phpThumb->f = "png"; break;
            default: $phpThumb->f = "jpeg"; break;
        }
        $base_name = basename($src, ".".$ext); // Основное имя файла
        $phpThumb->w = $size;
        //$phpThumb->h = $size;
        $phpThumb->q = 90;
        $phpThumb->bg = "#ffffff";
        $phpThumb->far = true;
        $phpThumb->aoe = false;
        if (is_array($params)) {
           foreach ($params as $param=>$value) {
              $phpThumb->$param = $value;
           }
           $code = substr(md5(serialize($params)), 8, 16); // сократим суффикс с параметрами до 16 символов
        } else {
           $code = $phpThumb->w;
        }
        $target_file = $_SERVER['DOCUMENT_ROOT'].dirname($src)."/".$base_name."_thumb_".$code.".".$ext;
        if (file_exists($target_file) AND filesize($target_file)>0) {
            if (filemtime($target_file)+$lifeTime < time()) { // Файл есть, но старый
                $phpThumb->GenerateThumbnail();
                $success = $phpThumb->RenderToFile($target_file);
            } else { // Файл есть, новый, не генерируем
                $success = true;
            }
        } else { // Файла нет, генерируем
           if (file_exists($target_file) AND filesize($target_file)==0) @unlink($target_file); // удаление файла нулевой длины
            $phpThumb->GenerateThumbnail();
            $success = $phpThumb->RenderToFile($target_file);
        }
        if ($success) return substr($target_file, strlen($_SERVER['DOCUMENT_ROOT'])); else return false;
    } else {
        return false;
    }
}

Вот так выглядит функция у меня. Небольшие пояснения. Четвертый параметр $params - не обязательный и это массив, в котором определяются настройки для phpThumb, согласно его синтаксиса. Именно через этот массив можно задавать параметры для zoom-crop, сохранения пропорций, ватермарк и т.д. Хотя ватермарк лучше определять в самой функции. Сгенерированные превьюшки хранятся в той же папке, где и картинка-исходник, но к ним добавляется код - либо размер картинки, либо md5-хэш из параметров. Таким образом все превьюшки будут с уникальным именем, соответствующим определенным параметрам. Любое изменение параметров влечет перегенерацию картинки. При сохранении файлов превьюшек добавлена проверка на длину файла, иногда бывает, что на сервере кончается место, тогда файлы создаются, а данные в них не записываются, в итоге получается файл размером 0 байт и скрипт будет думать, что это и есть картинка, в итоге картинка не показывается. По умолчанию стоит кэш на 1 месяц (в секундах), но вы можете для удобства этот параметр поменять местами с четвертым, как показывает практика, кэш никогда специально не задается, а вот параметры часто меняются. Второй параметр - это ширина картинки с дефолтными параметрами. Удобно иногда просто указать ширину картинки, она проресайзится до нужного размера с сохранением пропорций и не заморачиваться с параметрами phpThumb.

Теперь пример использования. В типовых шаблонах компонентов битрикса вывод картинок выглядит следующим образом:
Код
<img src="<?=$item['DETAIL_PICTURE']['SRC']?>" />

При использовании нашей функции вывод можно сделать следующим образом:
Код
<img src="<?=MakeImage($item['DETAIL_PICTURE']['SRC'], 100)?>" />

Будет создана уменьшенная картинка 100 пикселей в ширину. Иногда вместо пути до картинки в битриксе идет ID, мол путь ищите сами, но это не беда, можно использовать и код, функция сама по коду найдет и ресайзит картинку.
Код
<img src="<?=MakeImage($item['DETAIL_PICTURE'], 100)?>" />

Также можете использовать стандартную функцию-обертку для показа картинок
Код
<?=ShowImage(MakeImage($item['DETAIL_PICTURE'], 100))?>


Практика показала, что такой способ удобен на большинстве проектов. Но возникают следующие сложности:
1. При удалении картинок их сгенерированные превьюшки не удаляются стандартными средствами, надо писать обработчик события, который проверит наличие превьюшек при удалении картинки и удалит их вместе с основной картинкой.
2. Та же проблема при смене параметров картинок - остаются неиспользуемые старые превьюшки.

Что касается нагрузки на сервер, то она может случиться, если вдруг резко начнут одновременно перегенерироваться сотни и тысячи картинок. Но это уже редкое стечение обстоятельств.

Возможности Google Analytics для интернет-магазинов

Для большого интернет-магазина важно отслеживать свою работу и постоянно находиться в режиме оптимизации. Интернет-магазин должен постоянно подстраиваться под клиента, угождать ему, подсовывать лучшие товары, сокращать его путь от входа до покупки, вообще всячески ублажать и радовать - они же денег приносят. В 1С-Битрикс для этих целей используется модуль веб-аналитики (statistic) - он предлагает сбор, анализ данных, построение графиков и отчетов. По функционалу модуль хорошо развит, а недавно некоторые элементы статистики по продажам появились в модуле интернет-магазина (sale). Но даже такой лидер отечественного рынка как 1С-Битрикс никогда не сможет сделать свои инструменты аналитики лучше, чем Google Analytics (GA). Учитывая, что 1С-Битрикс развивает и поддерживает свои системы аналитики, понятно, что GA им не интересно - это по сути конкурент их модуля. Пока еще рынок веб-разработок не сильно развит, 1С-Битрикс может успешно продавать свои редакции с модулем веб-аналитики, не часто клиенты предъявляют расширенные требования к анализу посещаемости сайта, достаточно просто числа посетителей за день.

На днях общался с клиентом по его интернет-магазину, он запросил интеграцию с Google Analytics. Он до 1С-Битрикс использовал другие скрипты для создания интернет-магазинов, в которых уже есть встроенная интеграция с Google Analytics, очень сильно удивлялся, почему в 1С-Битрикс нет такой интеграции - "Просто вводишь код и идет сбор данных". Но ведь это очевидно почему нет - Битриксу надо продавать модуль веб-аналитики, собственно только ради него часто покупают редакцию "Эксперт" (28900 р.), а не "Стандарт" (12900 р.). А если будет встроенная интеграция с GA, нафига тогда вообще модуль статистики и переплачивать почти втридорога?

Но не многие знают, что Google Analytics - это на самом деле очень мощный инструмент анализа жизни сайта. Это не просто сбор чисел сколько народу пришло, откуда и что посмотрело. Есть мощнейшая интеграция с электронной коммерцией для анализа совершенных заказов, учета стадий оформления заказов, сбор данных о покупаемых товарах, доставке и т.д. Именно про эту интеграцию Google Analytics мне и говорил клиент - он привык к ней, она давно есть на его старом сайте и он очень ей доволен. И именно поэтому в последних версиях битриксовского модуля интернет-магазина (sale) появилась статистика продаж - это реально востребованный функционал, некоторые партнеры 1С-Битрикс писали свои инструменты для такого анализа ранее.

В принципе модуля веб-аналитики в 1С-Битрикс хватает большинству пользователей. Но у модуля есть большая подстава - производительность. Модуль увеличивает время генерации страниц до 2 раз - это жопа. Так что выбор Google Analytics для использования в сборе статистики посещаемости и отчетах по продажах - хорошее решение. Осталось написать модуль для интеграции Google Analytics.

Тур по Google Analytics
Возможности Google Analytics

Когда покупка товаров превращается в пытку

Очень часто встречаются интернет-магазины, которым не нужны деньги, не нужны клиенты, они не хотят продавать товары. У таких интернет-магазинов кривая система покупки и они с ней ничего не делают. Кривая потому что корзина и оформление товара превращаются в пытку для пользователя. Простой пример, есть интернет-магазин, допустим, торгуют всякой мелочевкой, пусть даже электроникой. Обычно такой ассортимент очень разнообразен и различия товаров мало очевидны, часто только по внешнему виду отличаются. В таком интернет-магазине у клиента сразу возникают четыре главные проблемы:

  • Просто и быстро найти нужный товар
  • Просто и быстро купить
  • Просто и быстро получить/оплатить
  • Просто и быстро повторить первые три пункта через несколько дней или недель

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

Проблема "просто и быстро найти нужный товар" снимается путем использования логичной навигации, использованием фотографий товаров, краткого описания в списках товаров, случайные представления товаров, рекомендации. Все мы ходим в большие продуктовые супермаркеты, но мы не все видим как там всё логично организовано. Поэтому дальше всё будет рассматриваться именно на примере супермаркетов. Обратите внимание в следующий раз, например, на такие вещи.

Когда вы входите в магазине, то вам сразу предлагаются самые нужные товары. Например, орехи, овощи, фрукты россыпью. Почему сначала они? Потому что это самый популярный товар - их покупают очень многие и в супермаркеты приходят именно за ними, а половина других приобретаемых товаров покупается потом по ходу хождения по супермаркету. А за овощами очень часто можно найти мясо и молочку - это тоже популярные товары и часто именно за ними приходят. Поэтому они всегда в начале. Также и в интернет-магазинах должно быть. Самые популярные товары сначала, доступ к ним должен быть самым коротким и очевидным. Самые популярные тоавры и разделы сайта могут иметь свой баннер - это будет самый короткий путь до них, но баннер не всегда увидят, ведь он ротируется или вообще блокируется. Можно просто вывести список самых популярных разделов и товаров. Основной трафик будет именно на них с первой страницы.

Возвращаемся в супермаркет. Когда вы дойдете до холодильников с замороженным мясом, полуфабрикатами, то обязательно рядом найдете приправы и специи к мясу. Это ж очевидно, если человек берет некий товар, то наверняка ему понадобится какая-то мелочевка к нему. А если товар идет сразу с аксессуарами да по сниженной цене или с подарком - это самый хороший вариант. Так что все товары по возможности должны быть представлены вместе с аксессуарами. Допустим, зашли вы в раздел цифровых зеркальных фотоаппаратов - очевидно, что вам могут пригодиться объективы, карты памяти, чехлы, сумки, штативы, вспышки, аккумуляторы, салфетки для стекол, защитные пленки для экранов и прочая ерунда. Именно в этот момент эту мелочевку надо предлагать покупателю. Но она должны быть уместна. Не стоит предлагать объектив от камер Sony, если человек хочет купить фотоаппарат Canon, на который эти объективы не подойдут. Аксессуары и сопутствующие товары - это хороший метод увеличения среднего чека.

Идем дальше по супермаркету. Часто брэндовые товары сопровождаются различными вывесками, например, на холодильниках с йогуртами может висеть флаг Danone. Это привлечение внимания к товарам. Еще могут быть различные девушки-зазывалы, которые крутятся возле "нужных" товаров и рекомендуют именно их. В интернет-магазине можно использовать баннеры и рекомендации. Допустим, какие-то очень интересные товары можно рекламировать с помощью небольших баннеров или выделять их специальным образом - хиты продаж, выбор пользователей, рекомендуем и т.д. Выделение товаров из общей массы - это рекомендация для пользователей, а очень многие пользователи приходят в интернет-магазины именно выбирать, а не покупать. Помогите своим покупателям найти лучшие и самые интересные товары, они отблагодарят вас деньгами.

В продуктовых супермаркетах обычно всё логично. Ряды товаров не смешиваются и ассортимент меняется плавно. Допустим, если идут ряды холодных прилавков, то любой человек знает, что всегда там найдет то, что замораживается: мясо, рыба, молоко. Если идут полки сыра, то рядом будет майонез. Если идет полка с печеньем, то рядом будут конфеты. Но конфеты не будут рядом с пивом или бытовой химией. Также и в интернет-магазине разделение товаров должно быть понятным и логичным. Пользователь должен понимать где что находится. В интернет-магазине для этого должно использоваться меню по разделам. Оно строится в зависимости от ассортимента. Большой и разнородный ассортимент - меню может быть двух или даже трехуровневым. Небольшой ассортимент - можно обойтись одноуровневым меню. Не стоит разнородные товары объединять в общие группы, даже если этих товаров мало. Допустим, не стоит в магазине фотокамер объединять объективы с пленками для экранов в общую группу "аксессуары".

Товары до кучи найдутся всегда и надо подсовывать покупателю их в любой момент. Даже в последний - на кассе. Сейчас в супермаркетах на кассах всегда предлагается мелочевка: презервативы, жвачки, конфеты, сигареты, зажигалки. Их решаются купить, стоя в очереди. В интернет-магазинах надо предлагать аксессуары к товарам в корзине. Допустим, добавил я в корзину какую-то фотокамеру, там же в корзине мне должен предлагаться объектив для нее. Ведь я уже почти купил товар, скорее всего аксессуары для него меня очень интересуют.

Часто требуются консультации при выборе товаров, например, в магазине электроники мы всегда можем спросить консультанта о характеристиках товаров и сравнении моделей. Всё это может быть и в интернет-магазине, поэтому товар должен снабжаться максимально подробными характеристиками, должен быть механизм сравнения товаров. Некоторые товары обладают сложными характеристиками, о них в магазине расскажут консультанты, а в интернет-магазине справочник. Когда покупателю предоставляется максимально подробная информация о товаре, характеристиках, сравнении товаров у него укрепляется уверенность в своем выборе и он быстрее примет решение о покупке.

Теперь к проблеме "просто и быстро купить". Процесс покупки в супермаркете - это подсчет суммы товаров на кассе и оплата. Всё. Процесс покупки в интернет-магазине у всех по-разному, у многих есть регистрация, ввод кучи данных о себе, контактная информация, адрес доставки, выбор платежных систем и т.д. Это нереальный труд для покупателя. Пришел человек денег дать, а его грузят работой. Он уйдет! Поэтому первая покупка должна быть простой. Последующие покупки - еще проще. Нельзя требовать от покупателя обязательной регистрации на сайте при оформлении заказа. НЕЛЬЗЯ! Это выбор пользователя должен быть - хочет зарегистрируется, а захочет и не будет. Регистрация нужна лишь для его удобства - для сохранения своих данных для последующих покупок. При оформлении заказа человек должен вводить минимально необходимую информацию: кто заказчик, как связаться, куда доставить и как оплатит. Кто заказчик - достаточно e-mail. Нам же на самом деле без разницы кому продавать товар Васе или Лене. Куда доставить - город пользователя мы уже знаем по его IP, не надо лишний раз его утруждать вводом или выбором из списка. Конечно доставка может отличаться, поэтому выбор все равно должен быть. Все данные должны быть введены по умолчанию, возможно они устроят пользователя. А как делается во многих интернет-магазинах? Они требуют регистрацию, проверяют e-mail, требуют его подтверждения, заставляют вводить кучу данных с точностью до буквы и цифры. Да, им потом удобно обрабатывать такие заказы, но это неудобно покупателю.

Проблема "быстро и удобно получить/оплатить" обычно уже не относится к интернет-магазину как системе, тут уже работа предприятия. На сколько быстро возможно обработать платеж, как быстро работает доставка - это от сайта не зависит. Но на сайте должно быть разнообразие, человек должен иметь выбор методов оплаты и доставки, он должен сразу знать их хотя бы примерную стоимость, чтобы не было сюрпризов. Применение оплаты банковскими картами очень удобно, но у нас страна кривая, так что применять их можно очень не везде и очень не всегда.

И последняя проблема покупателей - возврат. Интернет-магазинов тысячи, но всегда есть фавориты - где уже покупал и понравилось. При условии выполнения первых трех правил ваш интернет-магазин станет фаворитом и покупатель будет возвращаться. Его надо в этом всячески поддерживать. Раз покупатель уже покупал, то интернет-магазин уже "знает" предпочтения, адрес доставки, выбранные платежные системы, интересы на сайте, старые заказы. Всё это должно учитываться при возвращении покупателя. Сначала предложите ему товары, похожие на те, что он уже покупал или аксессуары к тем, что он купил. Вероятнее всего именно за этим он пришел. При оформлении заказа учитывайте прошлые данные - они становятся данными по умолчанию для этого покупателя. Скорее всего оформление нового заказа для покупателя будет произведено всего в 1 нажатие кнопки.

Стимулируйте покупателя возвращаться именно к вам. В супермаркетах при больших или частых покупках дают карты скидок. Иногда их можно купить отдельно, чтобы получить скидку в будущем. В интернет-магазинах также надо поощрять покупателей - дайте им скидку за большой объем заказа, зачислите бонус на внутренний счет - это будет хорошим стимулом снова покупать товары у вас. Ну не пропадать же 100 рублям на сайте. Также привязывайте покупателя именно к вашему магазину, например, предложите ему подписаться на рассылку. Еще можно пользователю предложить подписаться на отдельные товары: получать уведомления об изменении цен, о новых отзывах. Это действительно интересно покупателю, ведь он сам подписался на интересующий его товар и снижение цены на нужный ему товар его очень порадует. А вместе с уведомлениями о его товаре всегда можно подпихнуть другие товары, которые его могут заинтересовать.

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