epic

epic

С нами с 16 марта 2024; Место в рейтинге пользователей: #9550
Степан Прищепенко
27 марта 2019, 00:20
1
0
Приветствую, хороший компонент, но хотел отметить несколько вещей:
1. в папке модели должен быть metadata.mysql.php, хотя бы
с таким содержимым:
$xpdo_meta_map = array();
Иначе ловим ошибку.

2. В основном классе, метод инициализации есть, но не вызывается,
и там же pdo подключается, но не получает конфиг, следует
параметры в него не передашь, можно исправить вот так:

if ($this->pdoTools = $this->modx->getService('pdoTools')){
	  $this->pdoTools->setConfig($this->config, false);
	}
3. Ключ (хеш) конфигурации корзины, при ajax запросе передается,
но нинциализация не происходит, это значит как минимум pdo не получит конфиг из пункта 2.
Для этого инициализация может быть такой:

protected $initialized = false;
	public function initialize($config = array())
    {
        if ($this->initialized) return true;

        $this->config = array_merge($this->config, $config);

        if ($this->miniShop2 = $this->modx->getService('miniShop2')) {
            $this->miniShop2->initialize($this->ctx);
        }
        if ($this->pdoTools = $this->modx->getService('pdoTools')){
            $this->pdoTools->setConfig($this->config, false);
        }

        $this->initialized = true;
    }
А в handleRequest:

$tmp = $this->getSessionData();
    $tmp = is_array($tmp) ? $tmp : array();
    $this->initialize($tmp);
Ну и в сниппеты и плагины после успешной подгрузки класса:
$msMCD->initialize();
4. Чанк элемента в корзине содержит:
<input type="hidden" name="msmcd_id" value="{$item.id}">
Ошибкой было называть имя msmcd_id вместо id, так как это может сломать
работу других компонентов
, висящих на событиях изменения
товаров в корзине. Да и префикс msmcd_ не используется ни где.

5. При удалении товара вместо Cart.remove.response.success
нужно использовать:
miniShop2.Callbacks.add('Cart.remove.ajax.always', 'msmcd_remove', function(response) {
            var cur_responce = response.responseJSON || {}
            // console.log ("done args",cur_responce);
            // debugger;
            if (cur_responce && cur_responce.success){
                if ($('.ms2_product .msmcd-count').length) {
                    $(msMCDMiniCart.formId + k + ' ' + msMCDCount.msmcdCount).val(0);
                    $(msMCDMiniCart.formId + k + ' ' + msMCDCount.msmcdAction).val('cart/add');
                }

                var sendData = {
                    action: 'msmcd/chunk',
                    ctx: msMCDMiniCart.ctx
                };
                msMCDMiniCart.send(sendData);
            }
        });
Тогда будет правильно удалять товары.

Вроде после такого напильника, стало работать как нужно. Желаю творческих успехов!
Prihod
13 января 2017, 13:59
2
+1
1) т/к нужно для всех товаров не попавших в обновление поменять значение availability то возможно целесообразней использовать в качестве условия для получения всех товаров class_key == msProduct
2) т/к availability (из инфы от автора вопроса) для товара добавлено через систему плагинов minishop2 которую также в удобной форме реализует дополнение msFieldsManager то код примет следующий вид
<?php
/** @var modX $modx */
switch ($modx->event->name) {
    case 'msieOnCompleteImportProduct':

        // Получаем id всех импортированных товаров
        $currentIDs = explode(",", $modx->event->params['data']);

        // Получаем id ВСЕХ товаров в магазине
        $q = $modx->newQuery('msProduct', array('class_key' => 'msProduct'));
        $q->prepare();
        $q->stmt->execute();
        $oldIDs = $q->stmt->fetchAll(PDO::FETCH_COLUMN, 0);

        // Вычисляем id товаров которые есть на сайте, но нет в файле импорта
        $oldIDs = array_diff($oldIDs, $currentIDs);

        if (!empty($oldIDs)) {
            $oldIDs = implode(',', $oldIDs);
            $sql = "UPDATE {$modx->getTableName('msProductData')} SET availability = 0 WHERE id IN  ({$oldIDs});";
            $modx->exec($sql);
        }
        break;
}
Дмитрий Кондаков
13 января 2017, 12:40
3
+1
Создаете плагин на событие msieOnCompleteImportProduct:
<?php
/** @var modX $modx */
switch ($modx->event->name) {
	case 'msieOnCompleteImportProduct':

		// Получаем id всех импортированных товаров
		$currentIDs = explode(",", $modx->event->params['data']);

		// Получаем id ВСЕХ товаров в магазине
		$q = $modx->newQuery('msProduct', array('parent' => 7, 'template' => 8)); // тут свои условия
		$q->prepare();
		$q->stmt->execute();
		$oldIDs = $q->stmt->fetchAll(PDO::FETCH_COLUMN, 0);

		// Вычисляем id товаров которые есть на сайте, но нет в файле импорта
		$oldIDs = array_diff($oldIDs, $currentIDs);

		if ($toRemoveIDs) {
		  foreach ($toRemoveIDs as $cur) {
		    // и тут делаем с ними что угодно
		  }
		}
	break;
}
PS. на всякий случай сделайте бэкап БД перед тестированием плагина
Андрей
15 сентября 2016, 09:59
3
+1
$response = $modx->runProcessor('resource/create', array(
  'class_key' => 'msProduct',
  'pagetitle' => 'Товар',
  'parent' => 55,
  'template' => 11,
  'show_in_tree' => 1,

  //Данные
  'price' => 100,
  'old_price' => 0,
  'favorite' => 0,
  'popular' => 0,

  //стандартные опции товара
  'color' => array('Синий', 'Красный'),
  'size' => array('S', 'M'),
  'tags' => array('Тег1', 'Тег2'),

  //свои опции созданные в настройках
  'options-КЛЮЧ_ОПЦИИ' => array('значение1', 'значение2'),

  //TV - 10 это id TV
  'tv10' => 'Значение'
));
but1head
17 марта 2015, 12:36
3
0
if($resource->class_key == 'msProduct' && $modx->event->name == 'OnDocFormSave' && $mode == 'new'){
	$article = $resource->get('article');
	$alias = ($article == '' ? $id : $article);
	$resource->set('alias', $alias);
	$resource->save();
}
для товаров, подставляет артикул вместо алиаса