Константин Ильин

Константин Ильин

С нами с 10 февраля 2014; Место в рейтинге пользователей: #149
Андрей Шевяков
28 июля 2023, 11:26
3
+3
1) Создать плагин versions
<?php
switch($modx->event->name){
	case "pdoToolsOnFenomInit":
		$fenom->addModifier('versions', function($input){
			if(isset($input)) 
				return $input.'?v='.filemtime(MODX_BASE_PATH.$input);
		});		
		break;
}

2) Вешаем на событие pdoToolsOnFenomInit


3) Вызываем файлики так:
<link rel="stylesheet" href="{'/assets/templates/shop/styles/style.css' | versions}">
<script src="{'/assets/templates/shop/js/script.js' | versions}"></script>

У кого-то подсмотрел не помню точно. Но легко гуглится, сможете найти.
Пользуюсь много лет, ни разу не подвел.
Prihod
14 марта 2023, 20:13
1
0
выполни в консоли Modx код

$name = 'msimportexport';
$corePath = MODX_CORE_PATH."components/{$name }/"
$assetsPath = MODX_ASSETS_PATH. "components/{$name }/"

$modx->removeExtensionPackage($name);

if($namespace = $modx->getObject('modNamespace',array('name'=>$name))) {
	$namespace->remove();
}

 $modx->cacheManager->deleteTree($corePath, array('deleteTop' => true, 'extensions' => ''));
 $modx->cacheManager->deleteTree($assetsPath, array('deleteTop' => true, 'extensions' => ''));
Также если остался плагин дополнения то его удали вручную
Артур Шевченко
03 февраля 2023, 11:04
3
+3
Прям из коробки нельзя, надо немного поправить JS. Вот это
if (config.history) {
                if (typeof(jQuery().sticky) == 'undefined') {
                    $.getScript(config['assetsUrl'] + 'js/lib/jquery.sticky.min.js', function () {
                        pdoPage.initialize(config);
                    });
                    return;
                }
                pdoPage.stickyPagination(config);
            }
            else {
                $(config.pagination).hide();
            }
Заменить на это
$(document).on('click', config['link'], function (e) {
                e.preventDefault();
                var href = $(this).prop('href');
                var key = config['pageVarKey'];
                var match = href.match(new RegExp(key + '=(\\d+)'));
                var page = !match ? 1 : match[1];

                if (pdoPage.keys[key] != page) {
                    $(config['more']).find('button').attr('disabled', false);
                    if (config.history) {
                        if (page == 1) {
                            pdoPage.Hash.remove(key);
                        } else {
                            pdoPage.Hash.add(key, page);
                        }
                    }
                    $this.loadPage(href, config);
                }
            });

            if (config.history) {
                if (typeof(jQuery().sticky) == 'undefined') {
                    $.getScript(config['assetsUrl'] + 'js/lib/jquery.sticky.min.js', function () {
                        pdoPage.initialize(config);
                    });
                    return;
                }
                pdoPage.stickyPagination(config);

                $(window).on('popstate', function (e) {
                    if (e.originalEvent.state && e.originalEvent.state['pdoPage']) {
                        $this.loadPage(e.originalEvent.state['pdoPage'], config);
                    }
                });

                history.replaceState({pdoPage: window.location.href}, '');
            }
И в pdoPage параметру ajaxMode установить значение button.
Николай Савин
12 декабря 2022, 15:46
2
+3
Вам нужно создать плагин на событие msOnGetProductPrice

Пример кода такой
/** @var modX $modx */
/** @var msProduct $product */
if ($modx->event->name == 'msOnGetProductPrice') {
    $userGroups = $modx->user->getUserGroups();
    $sale_group = 4;
    //  $sale_price - цена со скидкой.  Придумайте откуда ее взять.  Отдельное поле или процент от общей цены
    $sale_price = 100;

    if (in_array($id_group, $userGroups)) {
        $modx->event->returnedValues['price'] = $sale_price
    }
}

Здесь по коду проверяем в каких группах состоит клиент. Если среди них есть скидочная группа — то подменяем price на нужное вам число
Артур Шевченко
15 ноября 2022, 11:42
1
+1
Можно проще
$this->modx->user = $this->modx->getobject('modUser', 1); // здесь  любой пользователь из группы Администратор
$this->modx->runProcessor('resource/update', $data);
Игорь Терентьев
06 декабря 2019, 15:02
1
+1
Лучше вот так сделать, иначе могут быть проблемы при добавлении большого кол-ва товаров:
gist.github.com/ig0r74/359ad8a5f231a8dc6e0dd7a1b17ec430
vectorserver
05 июля 2019, 12:53
5
+6
Я думаю это лешнее, сейчас использую lazyload от www.modpagespeed.com/doc/filter-lazyload-images
Устанавливаем сей модуль www.modpagespeed.com/
В .htaccess прописываем
<IfModule pagespeed_module>
    ModPagespeed on
    ModPagespeedCriticalImagesBeaconEnabled false
    #Ленивая загрузка плюшек
    ModPagespeedEnableFilters lazyload_images
</IfModule>
Вот мой готовый вариант .htaccess
<IfModule pagespeed_module>
    ModPagespeed on

    # lazyload_images , inline_preview_images и inline_images используют маяк для сбора информации
    # о переписанной странице, чтобы оптимизировать процесс перезаписи. Маяк - это POST запрос,
    # отправленный обратно с помощью JavaScript, вставленного на страницу фильтром.
    # Использование этого маяка включено по умолчанию, но его можно отключить с помощью:
    ModPagespeedCriticalImagesBeaconEnabled false
    ##Ленивая загрузка плюшек
    ModPagespeedEnableFilters lazyload_images
    #Запись даннных в local_storage
    ModPagespeedEnableFilters local_storage_cache
    #Закинем все стили в head
    ModPagespeedEnableFilters move_css_to_head
    #Склеим стили по группам и сожмем
    ModPagespeedEnableFilters combine_css
    ModPagespeedEnableFilters rewrite_css
    ModPagespeedEnableFilters rewrite_style_attributes
    #Спрайты в БГ
    ModPagespeedEnableFilters sprite_images
    #Сожмем JS
    ModPagespeedEnableFilters rewrite_javascript
    ModPagespeedUseExperimentalJsMinifier on
    ModPagespeedEnableFilters canonicalize_javascript_libraries

    #Оптимизируем JPEG
    ModPagespeedEnableFilters convert_jpeg_to_progressive
    #Почистим лишние пробелы и комменты
    ModPagespeedEnableFilters collapse_whitespace
    ModPagespeedEnableFilters remove_comments
</IfModule>
Плюсы: не нужны всякие MiniFX, не нужно лазить постоянно по чанкам прописывать атрибуты к картинкам, нет левых JS
Андрей Степаненко
04 февраля 2019, 09:59
4
+1
Источник как обычно google.
Пару ссылок
https://metanit.com/web/extjs/12.3.php
https://ilyaut.ru/extjs/
https://modx.ws/extjs-urok-ext-js-script-modx-revolution
http://bustep.ru/modx/extjs/

Вообще есть типо официальная документация, но как всегда мне лень её читать, по этому ищу по случаю, когда что то надо.

Так как всяческих приемов очень много как можно сделать, все пишут как хотят. На то он и JS там сложно чтото стандартизировать.

Но можно выделить такие направления для изучения в js как: события, переопределения любых функций, классов, методов в общем того что в php работает иначе. Когда понимаешь как они устроены то намного легче работать с ExtJs. Ну а за все это отвечает javascript, так что надо в первую очередь его изучать.

Как бы я уже прекрасно понимаю как работает даже тот же VueJs (так как реализовал на нем интернет-магазин в связке с minishop2 через RESTfull), да простые приложения легко пишутся, но капни в насправлении Хранилища, и тут засада начинается не меньше чем с ExtJs. И кстати по документации тоже не очень просто найти что то сложное. VueJs хорош но я наверное не стал бы его использовать для той же админки modx.
Максим Кузнецов
13 марта 2018, 02:11
2
+5
1. Подключается любая библиотека для работы с куками (например)
2. В js создается событие на изменение всех или только нужных вам фильтров, в котором будет запоминаться их состояние, примерно таким образом:

$(document).on('change', '.filter-class', function(e) {
	//В примере все состояния фильтров хранятся в одной переменной куков 'filters_condition' в json-формате
	var filters_condition = $.cookie('filters_condition');
			
	//Смотрим, существует ли она уже, чтобы не затирать другие значения
	if (typeof filters_condition !== 'undefined' && filters_condition !== null) {
		var params = filters_condition != "" ? $.parseJSON(filters_condition) : {};
	}
	else {
		var params = {};
	}
	
	var filter_condition;
			
	if ($(this).is(':checked')) {
		filter_condition = 'checked';
	}
	else {
		filter_condition = 'not_checked';
	}

	//Уникальный атрибут, по которому будет находиться фильтр, в моем случае - name
	//Если есть риск существования одинаковых значений инпутов/селекторов в разных формах, то можно переназначить на id
	params[$(this).attr('name')] = current_condition;
		
	$.cookie('filters_condition', JSON.stringify(params));
});

3. В чанках, отображающие фильтры в mFilter2 перехватываем нужные данные в куках, после чего выставляем результат:

{var $filters_condition = $.cookie['filters_condition'] | fromJSON}

//$filter_key - переменная чанка mFilter2, содержащая name фильтра
{var $filter_condition = $filters_condition[$filter_key]}

//...
//В нужном месте инпута/селектора выводим состояние:
{$filter_condition == 'checked' ? 'checked' : ''}

Пример демонстрационный, для наибольшей наглядности. То же состояние $filters_condition в шаблоне лучше единожды распарсить из JSON-a, после чего записывать в плейсхолдер, чтобы в последствии данные дергать уже из него.
Павел Гвоздь
08 декабря 2016, 21:12
2
+2
define('MODX_API_MODE', true);
do {
    $dir = dirname(!empty($file) ? dirname($file) : __FILE__);
    $file = $dir . '/index.php';
    $i = isset($i) ? --$i : 10;
} while ($i && !file_exists($file));
if (file_exists($file)) {
    require_once $file;
}
$modx->getService('error', 'error.modError');
$modx->getRequest();
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');
$modx->error->message = null;
$modx->lexicon->load('default');

$output = $modx->lexicon('failure');
$response = $modx->runProcessor('resource/emptyrecyclebin');
if (!empty($response->response) && $response->response['success']) {
    $output = $modx->lexicon('success');
}
exit($output);

:) Нет же, я проверил — с процессором работает, поэтому решил реализовать через процессор.