[modVkMarket] 1.0.0-beta

Всем привет, уважаемое сообщество. Как и обещал представляю вам компонент для синхронизации товаров minishop2 с маркетом VKontakte.
Возможности:
  • Первичная синхронизация всех товаров с маркетом
  • Продолжение синхронизации при прерывании
  • Вывод всех товаров из маркета с лайками и просмотрами
  • Полная очистка маркета
  • Создание товара в VK, при создании нового товара minishop2
  • Обновление товара при сохранении ресурса
  • Удаление товаров из маркета при очистке корзины

Немного скриншотов:

Список товаров из маркета в админке



Процесс удаления всех товаров



Процесс синхронизации магазина



Теперь перейдем к особенностям.
На текущий момент синхронизация занимает достаточно длительное время ~1 секунда на 1 товар. Это связано с ограничением количества запросов к VK API. По этой же причине выгружается только одна фотография (главная для товара).

Если у вас нет ограничения на время выполнения скрипта, в настройках можно указать количество товаров для синхронизации за итерацию, точно так же для удаления.
Текущие (базовые) лимиты выставлены на основе тестов на http://modhost.pro.

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

Для первичной настройки компонента в админке необходимо указать параметры приложения ВК и токен.
Процесс создания приложения и получения токена выглядит примерно так:
  • Создаем приложение в Вк.
  • Указываем название, выбираем тип приложения Standalone.
  • Не забываем включить приложение, изменив селект Состоятние и сохраняем изменения.
  • Переходим в настройки и копируем ID приложения. Заменяем {APPID} в строке
    https://oauth.vk.com/authorize?client_id={APPID}&scope=market,photos,offline&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.21&response_type=token
    на наш ID приложения и вставляем в строку браузера.
  • В появившемся окне нажимаем разрешить.
  • Получаем строку следущего вида
    https://oauth.vk.com/blank.html#access_token=349252841f7c58495d...&expires_in=0&user_id=111
    копируем access_token.
  • Теперь открываем наш сайт. Переходим в Системные настройки / modVkMarket и прописываем нужные параметры.



group_id — Идентификатор вашей группы в VK. Узнать его можно на статистике вашей группы:



И конечно, не забывайте включать сам маркет в настройках группы:



В дальнейших планах:
  • Добавить загрузку всех фото товара
  • Добавить возможность синхронизации не только minishop2, но и просто ресурсов
  • Добавить поиск и сортировку по товарам в админке
  • И некоторые другие фишки :)
Компонент, как и обещал платный, стоимость 990 рублей.
Компонент в modstore.pro
P.S. После окончательных доработок стоимость будет повышаться. За инструкцию по созданию приложения спасибо Павлу Карелину (нагло стырена с docs.modx.pro без его ведома :))
Лев Вербицкий
15 февраля 2016, 15:34
modx.pro
3
2 837
+13

Комментарии: 14

Павел Карелин
17 февраля 2016, 10:29
0
За инструкцию по созданию приложения спасибо Павлу Карелину (нагло стырена с docs.modx.pro без его ведома :))
Да всегда пжалста)))
    Лев Вербицкий
    17 февраля 2016, 12:48
    +2
    Модерация пройдена!) Компонент в маркете — modstore.pro/packages/import-and-export/modvkmarket
      mekirile
      17 февраля 2016, 15:58
      0
      *del
        Wassi Wassinen
        29 февраля 2016, 16:33
        0
        Отписался в ТП. Не увидел возможности ограничивать выборку товаров по родителю — это очень важно. И второе — разные категории товаров (родители) для разных групп. Часто бывает так, что у магазина несколько групп для разных категорий товаров. Было бы здорово это реализовать.

        Заранее благодарен!
          Андрей
          22 октября 2016, 19:04
          0
          Интересует такие моменты:
          1. В настройках: modvkmarket_market_category_id — что сюда писать?
          2. В настройках: modvkmarket_shop_type — только ли default или есть друге значения?
          3. Ест ли возможность выборочной синхронизации в маркетом — как писали выше, например по родителю и т.д.?
            Дмитрий Стрельников
            12 декабря 2017, 19:56
            0
            Что-то с ключами напутал, видимо. не могу скачать компонент в маркете. что подскажете?
            {«error»:«invalid_client»,«error_description»:«client_id is incorrect»}
              Юрий
              05 мая 2018, 10:57
              0
              Сообщите пожалуйста что с данным компонентом? не могу найти никакой информации о судьбе компонента. Купил пачкой несколько компонентов полгода-год назад, настроить понадобилось сейчас. делаю по инструкции, но в итоге та же ошибка:
              {«error»:«invalid_request»,«error_description»:«Security Error»}
                Алексей Андреев
                24 мая 2018, 23:45
                0
                Какие планы по развитию компонента?
                Поставил на тестовый хостинг, вроде работает, выгружает. Буду покупать для одного сайта.
                Хотелось бы настройки соответствий для полей, типа описание в ВК-магазине = description или introtext на выбор.
                Можно ли реализовать разбивку на категории при импорте?
                  Андрей Степаненко
                  07 февраля 2019, 16:19
                  0
                  У тебя получается задание прерывается сразу как завершается время исполнения скрипта.
                  Посмотри реализацию scannerModx, там аналогичный механизм через консоль, только когда происходит остановка, прерывание не происходит, открывается новая итерация.
                  И цикл завершится только когда появится сообщение в регистре.
                  Достаточно простой механизм.

                  Часть кода на JS
                  scannerSystem: function () {
                  
                          var grid = this
                          var el = this.getEl()
                          var scannerSystemCallback = function (btn) {
                  
                  
                              if (btn === 'yes') {
                  
                                  var scannerConsole = MODx.load({
                                      xtype: 'modx-console'
                                      , register: scannerMODX.config.register
                                      , topic: scannerMODX.config.topic
                                      , remove_read: scannerMODX.config.remove_read
                                      , show_filename: 0
                                      , listeners: {
                                          'shutdown': {
                                              fn: function () {
                                                  /* do code here when you close the console */
                                              }, scope: this
                                          }
                                      }
                                  })
                                  scannerConsole.show(Ext.getBody())
                  
                                  MODx.Ajax.request({
                                      url: scannerMODX.config['connector_url']
                                      , params: {
                                          stage: 'new_session',
                                          action: 'mgr/filesystem/scannersystem',
                                          register: scannerMODX.config.register,
                                          topic: scannerMODX.config.topic,
                                          remove_read: scannerMODX.config.remove_read,
                                      }
                                      , listeners: {
                                          'success': {
                                              fn: function (response) {
                                                  if (response.object.stage !== undefined) {
                                                      grid.scannerSystemCheck(el, response.object.stage)
                                                  } else {
                                                      el.unmask()
                                                      grid.refresh()
                                                  }
                  
                                              }, scope: this
                                          },
                                          'failure': {
                                              fn: function (response) {
                                                  //console.fireEvent('complete');
                                              }, scope: this
                                          },
                                      }
                                  })
                  
                              }
                          }
                  
                          Ext.MessageBox.show({
                              title: _('scannermodx_filesystem_btn_scannersystem'),
                              msg: _('scannermodx_filesystem_confirm'),
                              width: 300,
                              buttons: Ext.MessageBox.YESNO,
                              fn: scannerSystemCallback,
                              icon: Ext.MessageBox.QUESTION
                          })
                          return true
                      },
                  
                      scannerSystemCheck: function (el, stage) {
                          var grid = el
                          MODx.Ajax.request({
                              url: this.config.url,
                              params: {
                                  stage: stage,
                                  action: 'mgr/filesystem/scannersystem',
                                  register: scannerMODX.config.register,
                                  topic: scannerMODX.config.topic,
                                  remove_read: scannerMODX.config.remove_read,
                              },
                              listeners: {
                                  success: {
                                      fn: function (response) {
                  
                                          if (response.object.stage !== undefined) {
                                              this.scannerSystemCheck(grid, response.object.stage)
                                          } else {
                                              grid.unmask()
                                              this.refresh()
                                          }
                  
                                      }, scope: this
                                  }, failure: {
                                      fn: function ® {
                                          grid.unmask()
                                      }, scope: this
                                  }
                                  , cancel: {
                                      fn: function ® {
                                          grid.unmask()
                                      }, scope: this
                                  }
                              }
                          })
                      },
                    Лев Вербицкий
                    07 февраля 2019, 16:52
                    0
                    Задачи идут партиями, если вы поставили большую партию и уперлись во время выполнения — будет ошибка да. Ставьте маленькие порции товаров и все будет ок.
                      Андрей Степаненко
                      07 февраля 2019, 16:54
                      0
                      Да это не предложение сделать) Это решение, на всяки случай)
                    Кирилл Спеваков
                    12 апреля 2020, 12:06
                    0
                    Добрый день!
                    Случайно расширение функционала на магазин в фейсбуке и гугл мерчант не планируются?
                      Сергей
                      27 мая 2020, 19:25
                      0
                      На данным момент у компонента появилась ошибка, товары дублируются. Если поставить выгрузку по 1 товару, то он так и будет 1 товар грузить несколько раз. В логах

                      [2020-05-27 19:21:53] (ERROR @ /var/www/user/data/www/site.ru/core.site/xpdo/om/xpdoobject.class.php : 1452) Error 23000 executing statement:
                      INSERT INTO `pr_modvkmarket_sync` (`object_id`, `market_id`, `processed`) VALUES ('104022', 3503425, 1)
                      Array
                      (
                          [0] => 23000
                          [1] => 1062
                          [2] => Duplicate entry '104022' for key 'object_id'
                      )
                      Куда копать и искать ошибку? В ТП написать не могу, покупал очень давно.
                        ifx
                        ifx
                        12 июля 2020, 18:21
                        0
                        vk сменил метод получения токена, новый мануал будет? а то куплена версия 16 июня 2019г, перестала работать…
                          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                          14