man

man

С нами с 04 января 2016; Место в рейтинге пользователей: #237
Володя
14 декабря 2017, 16:22
2
+1
в связанных комбиках слушать 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();
    }
Дмитрий Кондаков
20 ноября 2017, 18:51
1
0
Используй slick slider, там есть опция «rows»
Ганин Роман
18 октября 2017, 00:39
1
0
Да, MODX, в принципе, всё равно, как вы его «вертите» — из последнего:
lavkaschastya.com/
www.schastye.com/
React, нестандартные наборы товаров, вёрстка любой сложности. Хочу ещё попробовать полностью отказаться от MODX-шаблонизатора, но подходящего проекта пока не было.
Сергей
Сергей
01 сентября 2017, 00:14
9
0
Тщательно пережевав это 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`]]">
Количество запросов снизилось вдвое, время загрузки страницы упало в полтора раза.
Извините, если кому наступил на мозоль, разжевав досконально, я знаю, что тут это не приветствуется...)))
Илья Уткин
09 августа 2017, 18:34
1
+3
Когда мы делаем
$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"]);

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

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

В modstore.pro, например, сделано вообще вот так:
miniShop2.Message = App.utils.Message;
Поэтому все уведомления от ms2 работают через общую систему уведомлений сайта.
Воеводский Михаил
28 июня 2017, 12:06
1
+5
Павел, сделай домен dev.*, и будет тебе счастье. Если не ошибаюсь, по такой маске действуют ключи для разработчиков, за счет чего ты спокойно можешь загружать любые дополнения и изучать их.
Дмитрий Храмов
25 июня 2017, 01:49
1
0
Да, уже разобрался. Выложу свое решение, малоли поможет кому.
Плагин дублирует опции товара из опций товара из другого контекста у которых совпадает 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();
    }
    
}
DocentBF
16 июня 2017, 23:15
1
+2
Как вариант — повесить плагин на событие OnManagerPageBeforeRender, где добавить стили с помощью addHtml для соответствующих блоков вкладок.
Андрей
16 июня 2017, 07:51
2
+1
Там стандартные опции color, size задаются так
$product->set('color', array('черный', 'белый'));

А те опции которые создаешь сам так
$options = array(
	'option1' => array('value1', 'value2'),
	'option2' => array('value1', 'value2')
);

$product->set('options', $options);