Алексей Шумаев

Алексей Шумаев

С нами с 30 ноября -0001; Место в рейтинге пользователей: #24
Володя
01 сентября 2017, 09:53
4
+3
Тема очень обширна и возможны разные варианты. Можно использовать различные сборщики, например тут Василий описал детально сборку с помощью gulp. Кто то использует minifyx.

Могу поделиться своим решением на основе html-compressor.

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

Способ не идеален, так как требует обработки страницы на стадии рендера и это конечно минус, но задержки не так велики. Пакет находится в стадии тестирования, но результаты примерно такие



я ни кого не призываю использовать этот пакет, просто делюсь способом оптимизации.

ps. кстати данный пакет подключен и тут s6200.h3.modhost.pro/6/12010.html
но там нет оптимизации картинок потому результат не 100…

Василий Наумкин
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 работают через общую систему уведомлений сайта.
Василий Столейков
26 января 2015, 12:12
1
0
Точно, я забыл. Я использовал для этого плагин. Вот мой вариант плагина:
<?php
$currentSiteGroup = $modx->getOption("multisite_site_group");
if(empty($currentSiteGroup)) return;
$currentContext = $modx->context->get("key");
$currentContextSettings = $modx->getCollection('modContextSetting', array('key' => "multisite_site_group", "value" => $currentSiteGroup));
foreach($currentContextSettings as $currentContextSetting)
{
    $contextKey = $currentContextSetting->get('context_key');
    if($contextKey!="mgr" && $contextKey!=$currentContext)
    {
        if($user)
        {
            if($modx->event->name=="OnWebLogout")
            {
                $modx->user->removeSessionContext($contextKey);
            }
            else if($modx->event->name=="OnWebLogin")
            {
                $modx->user->addSessionContext($contextKey);
                $_SESSION['modx.'.$contextKey.'.session.cookie.lifetime']=$attributes["lifetime"];
            }
        }
    }
}
Галки на системных событиях: OnWebLogin и OnWebLogout
Василий Наумкин
28 января 2014, 14:18
4
0
Я выставляю пользователю переменную в поле extended профиля, а потом проверяю её при загрузке им страницы.

Если есть — перезагружаю его права.
$extended = $modx->user->Profile->get('extended')) {
if (!empty($extended['updateGroups'])) {
	unset($_SESSION['modx.user.'.$modx->user->id.'.userGroupNames']);
	$extended['updateGroups'] = 0;
	$modx->user->Profile->set('extended', $extended);
	$modx->user->Profile->save();
	
	$ctxQuery = $modx->newQuery('modContext');
	$ctxQuery->select($modx->getSelectColumns('modContext', '', '', array('key')));
	if ($ctxQuery->prepare() && $ctxQuery->stmt->execute()) {
		if ($contexts = $ctxQuery->stmt->fetchAll(PDO::FETCH_COLUMN)) {
			$serialized = serialize($contexts);
			$modx->exec("UPDATE {$modx->getTableName('modUser')} SET {$modx->escape('session_stale')} = {$modx->quote($serialized)}");
		}
	}
}
Василий Наумкин
27 мая 2013, 06:37
2
0
Оттого, что vendor в таблице msProductData — это и есть число.

Если хочешь выводить имена производителей — есть 2 способа.
Первый, побыстрее: нужно создать дополнительное поле (или ТВ параметр) и сохранять туда плагином это имя. Ну а потом фильтровать по этому полю.

Второй, погибче: выбирать и выдавать данные собственным сниппетом. Его нужно указать параметру через двоеточие, вот так:
&includeMSList=`vendor:extra_filter_vendor`

Вот кож сниппет extra_filter_vendor, для вывода производителей товаров:
$ids = $scriptProperties['ids'];
$param = $scriptProperties['param'];
if (empty($ids) || empty($param)) {return false;}

$q = $modx->newQuery('msVendor');
$q->leftJoin('msProductData', 'Data', 'Data.vendor = msVendor.id');
$q->select('Data.id,msVendor.name');
$q->where(array('Data.id:IN' => $ids));

if ($q->prepare() && $q->stmt->execute()) {
	$res = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
	$arr = array(
		'name' => 'Производитель'
		,'type' => 'text'
		,'values' => array()
	);
	foreach ($res as $v) {
		$arr['values'][$v['name']][] = $v['id'];
	}
	return json_encode($arr);
}

Таким образом можно выдать любую информацию в фильтр.