[miniShop2] 2.1.0-beta1: галерея и профиль покупателя

Продолжаю трудиться над новой версией miniShop2. Сегодня у нас готова масштабная переделка галереи и новый объект с профилем покупателя.

Профиль покупателя

Это новый объект msCustomerProfile, он служит для удобного хранения данных о покупателе. На данный момент он никак не управляется из админки, и является заготовкой на будущее.

В объекте следующие поля:
  • id — идентификатор пользователя, совпадает с id modUser и internalKey у modUserProfile.
  • account — внутренний счет покупателя. В будущем с него можно будет оплачивать покупки и зачислять бонусы.
  • spent — сумма денег, которую покупатель оставил в магазине за всё время.
  • createdon — дата создания профиля покупателя.
  • referrer_code — уникальный код юзера, по которому он может пригласить кого-то на сайт.
  • referrer_id — идентификатор пригласившего покупателя.

У объекта есть несколько очень интересных особенностей:
1. Он автоматически создаётся, при первом же запросе:
if ($profile = $modx->getObject('msCustomerProfile', $modx->user->id)) {
	print_r($profile->toArray());
}
Если профиль уже есть — он будет получен, если нет — создан и получен. Это сделано для удобного внедрения на уже работающие сайты, все покупатели будут обзаводиться профилями по мере надобности.

При таком автосоздании, конечно, проверяется наличие modUser с запрошенным id. То есть, несуществующему юзеру профиль не создадут. Проверять, есть ли у юзера профиль, без создания можно так:
return $modx->getCount('msCustomerProfile', 2)
	? 'Профиль есть!'
	: 'Профиль отсутствует';
2. Обновлённый плагин miniShop2 автоматически фиксирует всех, кто приходит по реферальным ссылкам. По умолчанию это:
http://sitename.ru/anypage.html?msfrom=referrer_code
То есть, если вы проинициализировали профили юзеров и начали раздавать реферальные ссылки, то после регистрации в новых профилях referrer_id будет прописан автоматически.

Более полно эти возможности будут реализованы позже, в отдельном дополнении msAffiliat msProfile.

3. Этот объект расширяется плагинами MS2, точно так же, как и msProductData.

Кто расширял таблицу товаров, должно быть, обращал внимание на то, что в массиве указываются ключи с именем объекта:
return array(
	'xpdo_meta_map' => array(
		'msProductData' => require_once dirname(__FILE__) .'/model/msproductdata.map.inc.php'
	)
	,'manager' => array(
		'msProductData' => MODX_ASSETS_URL . 'components/minishop2/plugins/pluginname/msproductdata.js'
	)
);
Очевидно, что теперь рядом можно указывать и msCustomerProfile.

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

Как только этот объект более-менее устаканится, я добавлю работу с ним в компонент Office.

Галерея

Тут изменений очень много, поэтому постараюсь писать покороче.

Самое главное изменение: новый загрузчик Plupload. За это мы все дружно говорим «спасибо!» Александру Рахимову, программисту Simple Dream, который ведёт отдельный компонент ms2Gallery.

Смена загрузчика решает следующие вопросы:
  • И кнопка загрузки и drug-n-drop работют через один механизм. Гораздо более компактный и аккуратный код.
  • Использование Flash только там, где он необходим. Больше не должно быть ошибки 401 при работе в Firefox через кнопку загрузки.
  • Возможность предварительного пережатия картинок на клиенте — регулируется в настройках источника файлов
  • Нормальная работа с параметрами источника файлов, и, как следствие, поддержка *.gif, по умолчанию.
Улучшил отображение ошибок — они накидываются в очередь и показываются после загрузки всех картинок, списком.

Точно также теперь обновляется таблица загруженных картинок — после загрузки всех файлов очереди. Нет лишних запросов после аплоада каждой картинки и раздражающего мигания превьюшек при этом.

В объект msProductFile добавлено JSON поле properties, в которое пишутся свойства загруженного файла: разрешение, вес и mime-тип. В чанках msGallery это должно выводиться как [[+properties.width]] и т.п. — но не проверял.

В тот же объект добавлено поле hash, в него сохраняется sha1 содержимого файла. Это, как вы уже догадались, защита от дубликатов.

В источнике файлов появился новый параметр imageNameType: он может быть hash или friendly. При включении friendly, имена для загружаемых файлов генерируются по правилам дружественных url.
Если на сайте установлен и настроен translit — имена файлов будут транслитерированы. Если используется yTranslit — переведены через Яндекс.
То есть, свершилась мечта многих СЕО-оптимизаторов — человекопонятные имена файлов в галерее.
По очевидным причинам, это распространяется только на новые файлы, старые останутся как есть.

Добавлено переименование файлов, включая их превьюшки. Это делается очень просто — прямо в галерее. На уровне API новую возможность реализует метод объекта msProductFile — rename($new_name).


Ну и наконец, процессор загрузки научился загружать файлы без админки. Делается это очень просто: нужно передать id товара и абсолютный путь file, чтобы его можно было прочитать через file_get_contents().

Вот пример загрузки файла test.png из корня сайта товару с id = 9:
<?php
$response = $modx->runProcessor('gallery/upload', array(
		'file' => MODX_BASE_PATH . 'test.png',
		'id' => 9
	),
	array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
);

if ($response->isError()) {
	print_r($response->getAllErrors());
}
else {
	print_r($response->response);
}
Процессор вернет массив с адресом загруженного изображения или с ошибками.

Заключение

Как я уже писал, эти бета-версии не выкладываются в репозиторий, ибо не ясно как это отразится на рабочих проектах.

Поэтому, вот ссылка на Яндекс.Диск — прошу установить, потестировать и прокомментировать.

Потестировали, спасибо. Следующая версия здесь.

Следующая заметка
[pdoTools] Версия 1.5.0: новый сниппет pdoUsers
Предыдущая заметка
[AdminPanel] Панель администратора на вашем сайте


Комментарии ()

  1. Наумов Алексей 22 августа 2013, 08:56 # 0
    Здорово!

    Только 1 штука не понравилась, почему метод getObject создает объект?.. Это с точки зрения архитектуры — плохо!

    getOrCreateObject этот метод должен называться. В общем неоднозначное и неявное поведение получилось. Да, удобно применять, но пока не прочитаешь документацию — функция делает то, что никак не сходится с ее названием!
    1. Василий Наумкин 22 августа 2013, 08:59 # 0
      Она возвращает тебе объект.

      Хочешь, создавай его сам, предварительно, через newObject — кто не даёт? Сделано так потому, что у всех пользователей есть modUserProfile, и программист не должен задумываться, есть ли у них msCustomerProfile.

      Запросил — получил, никаких проблем.

      P.S.
      Можно было бы при установке новой версии создавать всем профили, но может подвиснуть на больших сайтах.
    2. Мордынский Николай 23 августа 2013, 10:48 # 0
      Василий, после последнего обновления отвалились названия столбцов таблицы списка товаров в админке (кастомные).
      Сам столбец с значениями есть а названия нет.


      В структуре кастомных плагинов ничего не менялось?
      1. Василий Наумкин 23 августа 2013, 14:37 # 0
        Полагаю, у тебя кастомные записи в лексиконах пропали.

        Отчего — не знаю.
        1. Мордынский Николай 23 августа 2013, 16:17 # 0
          Спасибо.
          Писал кастомные лексиконы в product.ink и его при обновленнии затерло. ((
          1. Василий Наумкин 23 августа 2013, 21:58 # 0
            Ну так сам виноват.

            Надо через админку добавлять.
      2. Алексей Карташов 23 августа 2013, 14:32 # 0
        Во, процессоры для изображений — давно хотелось)
        Тут у меня вопрос — если у товара изображений ещё нет, то первое добавленное станет, собственно, главным изображением товара. Все остальные будут… мм… остальными) А можно ли через процессор как-то заменить главное изображение?
        1. Василий Наумкин 23 августа 2013, 14:36 # 0
          Да это же просто url в полях thumb и image у msProductData — меняй на любые, без процессоров.
          1. Алексей Карташов 23 августа 2013, 14:42 # 0
            Хм… xD
            Алёша, что ещё могу сказать))
        2. Загретдинов Адель 23 августа 2013, 23:07 # 0
          Отличное обновление! Пока багов не заметил, все работает на ура.

          P.S. Проблема с отображением превью в категориях, корзине и админке после переноса на хостинг не изменилась, так же остались стандартные картинки minishop2. Помогло просто загрузка нового изображения или перетаскивание одного на другое, если у Вас несколько изображений.

          Большое спасибо Василию!
          1. Богдан 24 августа 2013, 16:10 # 0
            Раз багов особо не замечено, наверно рискну обновится на рабочем проекте… очень порадовал новый функционал галереи (генерация названия файлов транслитом).

            Василий, подскажи пожалуйста, какие именно возможности планируются в msAffiliat?
            1. Василий Наумкин 24 августа 2013, 16:15 # 0
              Это всё еще вилами на воде, но я смотрю на Битрикс.

              В таких объемах, конечно, не потяну, но что-то похожее хочу попробовать сделать: пирамиду аффилиатов, разные планы и варианты выплат.
          2. Алексей Карташов 24 августа 2013, 16:35 # 0
            Снова баг с меню, как вот здесь.
            Только на этот раз я обновлялся, а не чистую установку делал. И всё-равно появились «неправильные» пункты меню. И при этом старые остались на месте.
            1. Алексей Карташов 24 августа 2013, 16:50 # 0
              А ещё при drag-n-drop сниппета 'msCart' в текстовую область, получается вот так:
              [[msCart? &tpl=`0` &parents=`0` &includeTVs=`0` &where=`0` &tvPrefix=`tv.` &includeContent=`0`]]
              Тоже самое с msOrder:
              [[msOrder? &tpl=`0` &parents=`0` &includeTVs=`0` &where=`0` &tvPrefix=`tv.` &includeContent=`0`]]
              1. Ayemme lyce 26 августа 2013, 18:57 # 0
                Василий, а почему не хранишь картинки товара в BLOB-ах?
                1. Василий Наумкин 26 августа 2013, 19:17 # 0
                  Сам подумай.

                  Как лучше отдавать статику, напрямую веб-сервером, или через Php+MySql?
                2. Daniel Gibson 26 августа 2013, 19:16 # 0
                  Thumbnails in msProducts.

                  After upgrading I'm having a problem getting custom defined thumbnail sizes to show up through tpl.msProducts.row

                  [[+thumb]] works but not my previously defined [[+640x480]]

                  Any ideas? Thanks,
                  1. Daniel Gibson 26 августа 2013, 19:49 # 0
                    Figured it out, I now have to use &includeThumbs in the msProduct call.
                    1. Василий Наумкин 26 августа 2013, 19:54 # 0
                      It is a good news for me =)
                  2. Михаил 30 октября 2013, 17:39 # 0
                    После обновления версии «в источнике файлов появился новый параметр imageNameType: он может быть hash или friendly», но это только в дефолтовом источнике файлов (MS2 Images). Как сделать, чтобы эти возможности появились и у других источников файлов, созданных раньше?
                    1. Василий Наумкин 30 октября 2013, 17:41 # 0
                      Взять и добавить новый параметр ручками.
                      1. Михаил 30 октября 2013, 17:45 # 0
                        блин… отдыхать надо все же… виноват :)
                    2. Clean 01 декабря 2013, 23:03 # 0
                      Обновлённый плагин miniShop2 автоматически фиксирует всех, кто приходит по реферальным ссылкам. По умолчанию это:
                      http://sitename.ru/anypage.html?msfrom=referrer_codeТо есть, если вы проинициализировали профили юзеров и начали раздавать реферальные ссылки, то после регистрации в новых профилях referrer_id будет прописан автоматически.
                      
                      Более полно эти возможности будут реализованы позже, в отдельном дополнении msAffiliat.
                      Василий, есть ли сроки по компоненту? Собственно вопрос к тому, что мне как раз понадобилась реферальная система, и я думаю что напишу свое решение, тем не менее интересно, есть ли развитие этого дополнения под Office?
                      1. Василий Наумкин 01 декабря 2013, 23:11 # 0
                        Нет, пока всё отложили в долгий ящик.
                        1. Clean 01 декабря 2013, 23:19 # 0
                          супер, значит еще и с пользой другим компонент запилю.
                          1. Василий Наумкин 01 декабря 2013, 23:59 # 0
                            Давай-давай, я только за!
                            1. Ilya Ev 02 декабря 2013, 09:04 # 0
                              Тоже понадобится вскоре.
                              Буду ждать с нетерпением)
                              1. Clean 03 декабря 2013, 00:53 # 0
                                А тебе что именно надо, просто рефералы или нечто большее?
                                Реализацию рефералов я уже в виде отдельного пакета сделал — по сути это практически копипаст вырезка из MS2, с той разницей что я сделал ряд проверок (например нельзя получить реферал от неактивного юзера), ну и там логика кое где по другому работает (например реферал выставляется только при регистрации нового юзера) итп.
                                Если надо могу выложить на gitHub.

                                А так, я пытаюсь сделать цивильный мини-биллинг, без явной завязки с MS2, но с поддержкой способов пополнения от туда, и API для оплаты товаров MS2.

                                1. Ilya Ev 03 декабря 2013, 08:34 # 0
                                  Если есть возможность выложить будет здорово, покопаюсь)

                                  А так в идеале нужно, Реферальная система с (мини учетка для рефералов):
                                  Статистикой посещений по реферальным ссылкам
                                  Статистика накопленных бонусов (% или фиксированная сумма от покупок в магазине)
                                  Выплаты и списания бонусов

                                  Вот примерно, так сказать минимальная база, можно еще напридумывать (дерево рефералов, разные планы накопления бонусов, бонус за активный трафик по ссылкам реферала и тд), но для базы и первых 3х пунктов будет уже достаточно, так сказать «работать можно» )
                        2. Николай 28 декабря 2013, 17:49 # 0
                          Я кажется нашел баг добавления изображений в галерею…
                          Передаем в скрипт массив с изображениями

                          foreach ($_POST['img'] as $v) {
                              copy($v, 'temp/'.basename ($v));
                          
                              $response = $modx->runProcessor('gallery/upload', array(
                                  'file' => MODX_BASE_PATH . 'temp/'.basename ($v),
                              	'id' => $newResource['id']
                          	),
                          	array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
                          );
                          
                          if ($response->isError()) {	print_r($response->getAllErrors());}
                          else {	print_r($response->response);}
                          }
                          Результатом этого в корне сайта создается папка с id товара, не в /assets/images/products а именно в корне
                          У меня на сайте используется 2 типа прервьюшек — 170x180 и 540x830
                          А в папке, что создается в корне сайта только 120x90 (у меня такого в помине нету)
                          Соответственно в карточке товара я вижу это:

                          А в админке я вижу это:

                          Ошибок при загрузке не было
                          dl.dropboxusercontent.com/u/27327087/err.log
                          1. Николай 28 декабря 2013, 17:58 # 0
                            В админке я невнимательный, там по страницам отображение…
                            Получается что импорт изображений идет всегда только с 120х90 и не учитывает что на сайте…

                            Думал это решит проблему — нет…
                            $condition = array('product_id' => $newResource['id'], 'parent' => 0, 'type' => 'image');
                            $files = $modx->getCollection('msProductFile', $condition);
                            foreach ($files as $file) {
                                $modx->removeCollection('msProductFile', array('parent' => $file->id));
                            	$file->generateThumbnails();
                            }
                            1. Василий Наумкин 28 декабря 2013, 18:44 # 0
                              А ты source указал товару?

                              Импорт идёт того файла, который ты загружаешь. А вот уже из него генерируются превьюшки, согласно настройкам источника файлов у этого ресурса.
                            2. Николай 28 декабря 2013, 18:44 # 0
                              Странно, если я в созданном товаре загружаю изображения из админской части — то все равно создается только 120х90… В любом другом товаре все прервьюшки нормально создаются… Может быть у меня добавление товара не верное?
                              $data['class_key'] = 'msProduct';
                              $data['context_key'] = 'web';
                              $data['parent'] = $_POST['cat'];
                              $data['template'] = '3';
                              $data['pagetitle'] = $_POST['nsmes'];
                              $data['content'] = $_POST['texts'];
                              $data['price'] = $_POST['prices'] * 32;
                              $data['color'] = explode("," , $_POST['color']);
                              $data['size'] = explode("," , $_POST['size']);
                              $data['published'] = '1';
                              
                              $response = $modx->runProcessor('resource/create', $data);
                              if ($response->isError()) {
                                  return $modx->error->failure($response->getMessage());
                              }
                              
                              $newResource = $response->response['object'];
                              1. Василий Наумкин 28 декабря 2013, 18:45 # 0
                                Неверное.

                                Источника файлов-то нет.
                            3. Виталий Греков 19 января 2014, 05:47 # 0
                              Испытываю проблемы в случаи, когда файл изображения указан на русском языке

                              к примеру:
                              золотая ложка.jpg
                              при загрузке в галерею товаров, название файла должно быть golden-spoon.jpg а выводит
                              golden-ложка.jpg
                              когда добавляю пробел перед точкой то получаю golden-spoon-.jpg
                              использую yTranslit

                              P.S. при написания комментария тег Bold вырезает.
                              1. Чикин Артур 19 января 2014, 08:19 # 0
                                P.S. при написания комментария тег Bold вырезает.
                                Да ладно? Ты уверен?
                                1. Виталий Греков 19 января 2014, 14:03 # 0
                                  проверка
                                  <b>проверка</b>
                                  наверное правильнее будет, не обрабатывает Jevix.
                                  1. Чикин Артур 19 января 2014, 14:21 # 0
                                    ну ведь я же как то пишу жирным текстом?!
                                    <b>ну ведь я же как то пишу жирным текстом?!</b>
                                    1. Виталий Греков 19 января 2014, 14:38 # 0
                                      сейчас смотрю и пишу в браузере FF отображает все нормально, но мой коммент так и виден не жирным
                                      вот все ок проверка а вот в CHROME вообще не видно, и настройки сбросил, пока не понял что и как
                                      1. Чикин Артур 19 января 2014, 14:41 # 0
                                        С хромом вообще сейчас какие то траблы:

                                        проф
                                        проф
                                        1. Виталий Греков 19 января 2014, 14:46 # 0
                                          спасибо!
                                2. Василий Наумкин 19 января 2014, 09:25 # 0
                                  Переводит Яндекс — к нему все вопросы.
                                  1. Виталий Греков 19 января 2014, 20:09 # 0
                                    получается он не понимает ложка.jpg
                                    а вот так понимает ложка .jpg
                                    с точкой не дружит. Спасибо за ответ.
                                Добавление новых комментариев отключено.