Максим Кузнецов

Максим Кузнецов

Был в сети 04 августа 2021, 21:51
Заказы принимаю
Добрый. Вы имеете ввиду с фронтэнда (в админке есть соответствующие переключатели)?

Тогда можно реализовать так (привожу простой пример-портянку, по-чистому выйдет довольно много изменений):
а) создаем 2 tv и присваиваем нужным шаблонам (их можно скрыть в админке) — ticket_pub_date и ticket_unpub_date

б) подключаем тв в вызов TicketForm и создаем необходимые формы в шаблоне (инпуты для даты, можно навесить маски с jquery, например
datetimepicker)

в) создаете плагин на событие OnDocFormSave, перехватывающий значение полей и вставляющих их в pub_date и unpub_date:
<?php
	if ($modx->event->name == 'OnDocFormSave') {
		$pub_value = $resource->getTVValue('ticket_pub_date');
		$unpub_value = $resource->getTVValue('ticket_unpub_date');
		
		if (strlen($pub_value) > 0) {
			$resource->set('pub_date',$pub_value);
		}
		if (strlen($unpub_value) > 0) {
			$resource->set('unpub_date',$unpub_value);
		}
		
		$resource->save();
	}
Плагином, скорее всего, на событие OnDocFormSave перехватывать значение, видоизменять и сохранять. Примерно вот так:

<?php
	if ($modx->event->name == 'OnDocFormSave') {
		$metro = $resource->getTVValue('metro');
		
		
		if (strlen($metro) > 0) {
			$newMetroValue = ... //видоизменяешь как тебе необходимо (разбиваешь массив и тд)
			
			$resource->setTVValue('metro', $newMetroValue);
		}
		
		$resource->save();
	}
Без конкретного примера — можно только сказать в общих чертах — кэшировать все, что можно +оптимизировать свои пхп-скрипты, чтобы было минимум запросов к бд.

Как правило, еще из основных «ошибкок» при написании сайта на модксе — вызов сниппетов в сниппете, излишние вложенности чанков и тд. Т.е. в таких вызовах — писать свои запросы заместо «готовых» решений — и сайт будет летать.)
Еще можно повесить плагин на событие OnUserFormSave или подобное, чтобы полностью исключить возможность изменения полей до не желаемого уровня (к примеру, допустимые поля в профиле меняются селектами в пределах определенных значений).
Оптимизация + хорошие характеристики сервера = справится.

Вообще, «300-600 тысяч», оторванных от функционала и способах его реализации = нагрузка только на серверную часть.
Лучше опишите, какой объем документов/ресурсов на сайте и основные процессы.
Попробовал изменить опции меню более «мягким» образом:

1) создаем плагин adminMenuFix и включаем его на событие OnManagerPageBeforeRender:
<?php
	$modx->controller->addHtml('<link rel="stylesheet" type="text/css" media="screen" href="../admin.css" />');
2) в корень сайта (или в любое желаемое место, но тогда в пункте 1 исправляем путь) создаем документ admin.css со стилем
#modx-navbar li:hover ul.modx-subnav {
-webkit-transition-delay: 5s !important;
transition-delay: 5s !important;
}
— меню появляется с указанной задержкой.

P.s. данный способ изменяет скорость появления ВСЕХ вертикальных выпадающих табов. Если необходимо изменить скорость у чего-то конкретного — завязывайте стили ксс на уникальных классах/id.
1. Можно сделать табы сделать на ajax-е (https://modx.pro/development/3139-foundations-of-ajax/) — проблема будет решена де-факто.

2. Глубоко не смотрел, но подозреваю, что дело в якоре Id=«mapexMap». Не знаю точной работы вашего сниппета карт, но, судя по куску:

<script type="text/javascript">
    ymaps.ready(function(){
        mapexMap = new ymaps.Map("mapexMap", {
            center: [57.886209618522,59.999624185547],
            zoom: 11
        });
        mapexMap.setType("yandex#map");
        var mapexMapControls = "mapTools".split(',');
        for(var i = 0; i < mapexMapControls.length; i++){
            mapexMap.controls.add(mapexMapControls[i]);
        }
        mapexMap.geoObjects.add(new ymaps.Placemark([57.920845758766,60.103013093254], {"iconContent":"\u0412\u0430\u0433\u043e\u043d\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 12","balloonContentBody":"","balloonContentHeader":"\u0412\u0430\u0433\u043e\u043d\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u0435\u0439 12"}, {"preset":"twirl#blueStretchyIcon"}));
mapexMap.geoObjects.add(new ymaps.Placemark([57.872675912701,59.95150535582], {"iconContent":"\u041e\u043a\u0442\u044f\u0431\u0440\u044c\u0441\u043a\u0438\u0439 \u043f\u0440. 22","balloonContentBody":"","balloonContentHeader":"\u041e\u043a\u0442\u044f\u0431\u0440\u044c\u0441\u043a\u0438\u0439 \u043f\u0440. 22"}, {"preset":"twirl#blueStretchyIcon"}));

        
        
        
    });
</script>

— который вызывается у вас 26 раз, то сниппет при помощи скрипта вставляет в контейнер с айди mapexMap модуль карты, но т.к. в html параметр id должен быть уникальным, то из-за специфики javascript'a он находит первое совпадение Id (первый контейнер) и вставляет туда результат. И так 26 раз.
Попробовал запустить этот сниппет на modx 2.3.2, вот как вызвалось:

(в шаблоне, обязательно ДО вызова pdoResources/getResources или ДО вызова самой переменной в шаблоне):
[[!HPCount]]
(в месте вызова):
{%hp-[[+id]]%}
— если в шаблоне самого документа, то + меняем на * соответственно.

Единственный нюанс — как-то странно кэшировались данные, в результате число просмотров, отличное от 0 появилось не сразу.
Я и не предлагал поменять магазин — этот модуль импорта из CSV, XML, XLS, XLSX универсален для всех ресурсов modx'a.
Просто необходимо отредактировать код так, чтобы при импорте создавался/обновлялся товар, а не документ (параметр class_key и, возможно, что-то еще по мелочам — можно сравнить с импортом в minishop из того же csv).

Не за что.)