man

man

Был в сети 15 декабря 2018, 19:20
Заказы не принимаю
Володя
Володя
в связанных комбиках слушать select и выставлять в зависимые комбики нужный параметр.
listeners: {
  select: {
    fn: function (r) {
       this.handleChange();
    },
    scope: this
    }
}
Если связей много то можно навесить общую функцию и в ней выставлять нужные поля.

handleChange: function (change) {
        var f = this.fp.getForm();
        var _field1 = f.findField('field1');
        var _field2 = f.findField('field2');

        _field2.baseParams.param = _field1.getValue();
	//перегрузить стор
        _field2.store.load();
    }
Ганин Роман
Ганин Роман
Да, MODX, в принципе, всё равно, как вы его «вертите» — из последнего:
lavkaschastya.com/
www.schastye.com/
React, нестандартные наборы товаров, вёрстка любой сложности. Хочу ещё попробовать полностью отказаться от MODX-шаблонизатора, но подходящего проекта пока не было.
Сергей
Сергей
Тщательно пережевав это modx.pro/help/7693/#comment-53831, решил свой вопрос — Как вывести два фото к каждому товару на странице категории:
в шаблоне категории вызываю список товаров так:
[[!pdoPage?
	&element=`msProducts`
	&loadModels=`gallery`
	&leftJoin=`{
		"360x270": {"class":"msProductFile","alias":"360x270", "on": "360x270.product_id = msProduct.id AND 360x270.path LIKE '%/360x270/' AND 360x270.rank=0"}
		,"360x270x1": {"class":"msProductFile","alias":"360x270x1", "on": "360x270x1.product_id = msProduct.id AND 360x270x1.path LIKE '%/360x270/' AND 360x270x1.rank=1"}
	}`
	&select=`{
		"msProduct":"*"
		,"360x270":"360x270.url as 360x270"
		,"360x270x1":"360x270x1.url as 360x270x1"
	}`
]]
и в чанке tpl.msProducts.row.php вывожу ДВА фото товара так:
<img src="[[+360x270:default=`[[++assets_url]]components/minishop2/img/web/ms2_small.png`]]">
<img src="[[+360x270x1:default=`[[++assets_url]]components/minishop2/img/web/ms2_small.png`]]">
Количество запросов снизилось вдвое, время загрузки страницы упало в полтора раза.
Извините, если кому наступил на мозоль, разжевав досконально, я знаю, что тут это не приветствуется...)))
Илья Уткин
Илья Уткин
Когда мы делаем
$user->joinGroup('Group','Role2');
MODX делает несколько запросов в базу данных.

Если упрощённо, то сначала определяет ID группы по её имени (из таблицы modx_membergroup_names), потом — ID роли (таблица modx_user_group_roles). Когда ID-шники определены, происходит создание новой записи в таблице modx_member_groups.

После этого сбрасываются значения параметров сессии:
unset($_SESSION["modx.user.{$this->get('id')}.userGroupNames"],
      $_SESSION["modx.user.{$this->get('id')}.userGroups"]);

Для удаления пользователя из группы точно так же нужно найти ID-шник группы по её имени и удалить соответствующую запись из таблицы modx_member_groups.

В итоге запись
$user->leaveGroup('Group');
$user->joinGroup('Group','Role2');
сгенерирует минимум 5 запросов к базе данных.

Если где-то ранее у нас уже определены ID-шники ролей и групп, то можно внести изменения вручную:
$group_member_arr = array(
  'member' => $user->get('id'),
  'user_group' => $group_id,
);
if (!$member = $modx->getObject('modUserGroupMember', $group_member_arr) {
  $member = $modx->newObject('modUserGroupMember', $group_member_arr);
}
$member->set('role', $role_id);
$member->save();

unset($_SESSION["modx.user.{$this->get('id')}.userGroupNames"],
      $_SESSION["modx.user.{$this->get('id')}.userGroups"]);

Но через год-полтора будет сложно понять, что тут происходит.

Так что решение о том, какой из способов выбрать, каждый принимает сам.
Василий Наумкин
Василий Наумкин
Гораздо проще и лучше просто вызвать свой скрипт после default.js от ms2 и перезаписать там объект miniShop2.Message:
miniShop2.Message = {
	success: function() {},
	error: function() {},
	info: function() {},
};

В
modstore.pro, например, сделано вообще вот так:
miniShop2.Message = App.utils.Message;
Поэтому все уведомления от ms2 работают через общую систему уведомлений сайта.
Дмитрий Храмов
Дмитрий Храмов
Да, уже разобрался. Выложу свое решение, малоли поможет кому.
Плагин дублирует опции товара из опций товара из другого контекста у которых совпадает alias. Используется minishop 2.4.11, начиная опции идут исключительно массивами.
Вешается на OnDocFormSave
<?php
if ($modx->event->name=="OnDocFormSave" and $resource->get('class_key') == 'msProduct')
{
    $id = $resource->get('id');
    $alias = $resource->get('alias');
    $res = $modx->getObject('msProduct', $id);
    
    if ($res->get('context_key') != 'web'){
    $options = $resource->loadData()->get('options');
    $res2 = $modx->getObject('msProduct', array('context_key' => 'web', 'alias' => $alias));
    
// daily prices    
    $tvv = $res->get('price_oct_day');
    
        if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_oct_day');
            $options['price_oct_day'] = $tvv2;
        }
        
    $tvv = $res->get('price_nov_day');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_nov_day');
            $options['price_nov_day'] = $tvv2;
        }
    
        $tvv = $res->get('price_dec_day');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_dec_day');
            $options['price_dec_day'] = $tvv2;
        }
    
            $tvv = $res->get('price_jan_day');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_jan_day');
            $options['price_jan_day'] = $tvv2;
        }
        
        $tvv = $res->get('price_feb_day');
        if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_feb_day');
            $options['price_feb_day'] = $tvv2;
        }
        
        $tvv = $res->get('price_mar_day');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_mar_day');
            $options['price_mar_day'] = $tvv2;
        }
        
        $tvv = $res->get('price_apr_day');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_apr_day');
            $options['price_apr_day'] = $tvv2;
        }
//monthly prices       
        $tvv = $res->get('price_oct_mon');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_oct_mon');
            $options['price_oct_mon'] = $tvv2;
        }
        
        $tvv = $res->get('price_nov_mon');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_nov_mon');
            $options['price_nov_mon'] = $tvv2;
        }
        
        $tvv = $res->get('price_dec_mon');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_dec_mon');
            $options['price_dec_mon'] = $tvv2;
        }
        
        $tvv = $res->get('price_jan_mon');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_jan_mon');
            $options['price_jan_mon'] = $tvv2;
        }
        
        $tvv = $res->get('price_feb_mon');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_feb_mon');
            $options['price_feb_mon'] = $tvv2;
        }
        
            $tvv = $res->get('price_mar_mon');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_mar_mon');
            $options['price_mar_mon'] = $tvv2;
        }
        
        $tvv = $res->get('price_apr_mon');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('price_apr_mon');
            $options['price_apr_mon'] = $tvv2;
        }
// other options
        $tvv = $res->get('beach_dist');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('beach_dist');
            $options['beach_dist'] = $tvv2;
        }
        $tvv = $res->get('bedrooms');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('bedrooms');
            $options['bedrooms'] = $tvv2;
        }
        $tvv = $res->get('ac');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('ac');
            $options['ac'] = $tvv2;
        }
        $tvv = $res->get('kitchen');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('kitchen');
            $options['kitchen'] = $tvv2;
        }
        $tvv = $res->get('balcony');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('balcony');
            $options['balcony'] = $tvv2;
        }
        $tvv = $res->get('room_type');
            if ( empty($tvv) )
        {
            $tvv2 = $res2->get('room_type');
            $options['room_type'] = $tvv2;
        }


    $res->set('options', $options);
    $res->save();
    }
    
}