Cyrax_02
С нами с 04 августа 2013; Место в рейтинге пользователей: #2507 часов назад
А кто подскажет, как в форму Создания/Редактирования ресурса, через ms2Form, добавить возможность выбирать несоклько параметров в одном TV?
Ну то-ест...
Создание ресурсов из фронтенда сайта, зарегистрированными пользователями. 4
7 часов назад
если правильно понял то так
{set $rows = json_decode($_modx->resource.constructor_block, true)}
{foreach $r...
getImageList. Вывести вложенный migx на fenom 1
7 часов назад
Подскажите, если на странице будет две формы, они будут работать? К примеру reCaptchaV3 этого сделать не может, нужно через костыль в виде скрипта, ко...
YaSmartCaptcha - защитите ваши формы от спама умной капчей от Яндекс 5
Сегодня в 01:42
У вас есть баг при изменении кол-ва позиции в корзине
Помогите найти ошибку в шаблоне, теги 11
20 ноября 2024, 16:25
В сниппете rcv3_html достаточно отложить загрузку через setTimeout (хотя кто-то делает через onClick). Не думаю что мой вариант самый правильный и что...
reCaptcha v3 - отложенная загрузка 1
19 ноября 2024, 10:51
Решил свою проблему через имя пользователя, но хотелось бы через права пользователя «Неограниченные права»
<?php
/**
* Системное событие OnMan...
Редактирование контекста в мультидоменном сайте 1
19 ноября 2024, 09:09
Спасибо, тоже очень интерестное решение.
Помогите советом, по реализации платных одноразовых услуг на сайте. 4
18 ноября 2024, 14:19
miniShop2.Order.add('extfld_delivery_price','100', function() {
miniShop2.Order.getcost();
})
Это вот работает, но чтобы увид...
Не обновляются поля заказа ajax msOrder 3
18 ноября 2024, 10:11
Благодарю за ответы.
Обновил Minishop2 с 2.5.0-pl до 4.4.0-pl., заказы не приходят на почту 3
Именно поэтому, если в период между загрузкой страницы ресурса и сохранением ресурса сессия истечёт, то при сохранении ресурса (будет запрошена авторизация) в массиве $_SESSION значение discount_before установлено не будет.
Более того, если другой пользователь (с другой сессией) изменит значение скидки в период между загрузкой страницы ресурса и сохранением ресурса, то в OnDocFormRender будут получены старые значения (имевшие место в момент открытия страницы ресурса). Впрочем, в вашем случае, к проблемам это не приведёт, но во многих других задачах, где требуется обязательно получать актуальные на текущий момент значения, этот факт делает данный способ получения старых (исходных) значений неприменимым.
В массиве $_POST данные передаются именно в момент сохранения ресурса (скрипт сохранения вызывает коннектор путём отправки самостоятельного http-запроса к серверу).
Для получения старых (исходных) значений необходимо:
а) в OnBeforeDocFormSave — метод getTVValue()
б) в OnDocFormSave — только через ранее «запомненные» значения (например, через переменные сессии)
В любом случае, как я уже говорил, новых значений в POST-параметрах запроса не будет, если ресурс сохраняется из собственного кода. Кроме того, от версии к версии формат передаваемых в $_POST данных может меняться, поскольку эти данные предназначены исключительно для внутренних нужд modx (для коннекторов).
Навскидку могу предположить, что:
а) ты его «искал» в тот момент, когда у тебя плагин не был подписан на событие OnDocFormSave и (или) OnDocFormRender. Массив $data передаётся только обработчику OnBeforeDocFormSave
б) получить к нему доступ ты пытался в разделе case 'OnDocFormRender' или case 'OnDocFormSave' оператора switch. С массивом $data нужно работать в case 'OnBeforeDocFormSave'
Ещё раз по порядку:
1) Подписываешь плагин на событие OnBeforeDocFormSave
2) В плагине в разделе case 'OnBeforeDocFormSave' пишешь:
3) Загружаешь страницу (именно ту, которая вызывает плагин)
4) Смотришь логи modx: там увидишь все НОВЫЕ стандартные и ТВ-параметры, которые содержит массив $data. Также увидишь их ключи (как к ним обращаться).
События OnBefore...FormSave генерируются до физического сохранения новых значений и только в обработчиках этого события можно одновременно получить доступ и к старым значениям полей, и к новым. Именно для этого в OnBefore...FormSave и передаётся массив новых значений $data, которые будут физически сохранены после этого события.
P.S. У варианта OnBeforeDocFormSave + массив data + getTVValue пока не вижу никаких ограничений. Полная свобода.
В OnBeforeDocFormSave новые (сохраняемые) значения TV можно получить следующими способами:
1) Из массива $_POST (как указал Василий). Но этот вариант работает только при вызове коннекторов (сохранение ресурса в админке). Если процессор вызывается из собственного кода, то никаких параметров в запросе не будет.
2) Из массива data, который также передаётся плагину (не задокументирован). В этом массиве лежат все новые (сохраняемые) параметры — и стандартные, и ТВ. Ключ стандартного параметра = имени параметра, ключ ТВ = tvID.
В OnBeforeDocFormSave старые (исходные) значения TV можно получить методом getTVValue (извлекает данные непосредственно из БД).
Самый корректный вариант, имхо, — это OnBeforeDocFormSave + массив data + getTVValue.
github.com/modxcms/revolution/issues/9461
github.com/modxcms/revolution/issues/12260
Если я верно понял, в 2.3.3 должно быть исправлено…
OnDocFormPrerender => OnDocFormRender
OnBeforeDocFormSave => OnDocFormSave
OnBeforeSnipFormSave => OnSnipFormSave
OnBeforeSnipSave => OnSnipSave
и так со всеми событиями.
Что касается событий OnDocFormPrerender и OnDocFormRender, то сначала должно генерироваться событие OnDocFormPrerender, затем OnDocFormRender. Именно так написано в справке:
и именно такая последовательность вызовов реализована в методах классов:
(core/model/modx/modmanagercontroller.class.php) modManagerController::render() сначала вызывает метод firePreRenderEvents(), затем firePostRenderEvents().
Речь о render-событиях?
Поскольку последовательность вызовов, описанная в первом посте, имеет место со всеми render-процессорами, то сабжевая картина будет наблюдаться со всеми render-событиями (и с ресурсами, и со сниппетами, и с шаблонами и с TV и пр.). Другое дело — является ли эта логика вызовов корректной (запланированной) или ошибочной…
AutoRedirector — вариант №2 (без заморозки), при этом обновление сайта и настроек (когда запускается стандартный генератор uri) никак не отслеживает… со всеми вытекающими…
В результате в плагинах на OnDocFormDelete и OnResourceDelete можно использовать свойства «syncsite» (как в OnDocFormSave) и «deleteChildren»:
Свойство «syncsite» в плагинах может понадобиться, например, для очистки собственных разделов кэша, связанных с удаляемым ресурсом.
Возможны 3 варианта:
1.Замена стандартного генератора uri собственным. Реализуется перегрузкой одного из методов: modx::refreshURIs() либо modResource::getAliasPath(). При каждом вызове стандартного генератора фактически будет вызываться наш собственный генератор
Плюсы:
1) Не придётся отслеживать моменты, когда и для каких ресурсов нужно выполнить перегенерацию URI — этим будет заниматься modx
2) Внутри собственного генератора URI можно легко отслеживать изменение URI и вызывать соответствующие методы Редиректора
Минусы:
1) Перегрузка классов modx или modResource реализуется не совсем чисто и не надёжно (нужно решать проблему «подсовывания» своих классов в нужных местах и в нужные моменты времени). Если для перегрузки класса modx достаточно ручной корректировки одной строки кода в 4 файлах при каждой установке и обновлении modx, то подсовывание своего класса modResource остаётся проблемой.
2) Поскольку необходимость перегенерации URI определяет modx, то при изменении тех данных, которые используются собственным генератором uri, но не используются стандартным, — при изменении этих данных собственный генератор вызываться не будет
2.Собственный генератор URI наряду со стандартным (без использования заморозки). Собственный автоматический генератор замороженные uri не трогает (так же, как и стандартный)
Плюсы:
1) Не нужно ничего перегружать
2) Сохраняется стандартная логика modx: если uri заморожен, то автоматическая генерация его затронуть не должна. Заморозка предоставляет возможность некоторым ресурсам задавать uri вручную (отлично от тех, что генерируются автоматически) и быть уверенным, что никакая «автоматка» эти uri не тронет
Минусы. Необходимо отслеживать все изменения uri стандартным генератором, чтобы после его отработки запустить собственный генератор для тех же ресурсов.
Но в автоматическом режиме задача нерешаема по следующим причинам:
а) события на генерацию URI нет
б) метод modResource::save() не генерирует никаких событий.
(Для сравнения: у элементов (плагинов, сниппетов, чанков, шаблонов, tv) при выполнении метода {ELEMENT}::save() генерируются события OnBefore{ELEMENT}Save и On{ELEMENT}Save)
в) при изменении системных настроек, настроек контекста и типов контента тоже не генерируется никаких событий
Т.е. возможно отследить только обновление сайта (событие OnSiteRefresh) и изменение/сохранение ресурса (события OnBeforeDocFormSave и OnDocFormSave)
3.Собственный генератор URI наряду со стандартным (с использованием заморозки). Собственный автоматический генератор при генерации uri их замораживает.
Плюсы:
1) Не нужно ничего перегружать
2) Нет необходимости отслеживать моменты изменения uri стандартным генератором, т.к. стандартный генератор замороженные uri не трогает
Минусы:
1) Нарушается стандартная логика modx: если uri заморожен, то собственная автоматическая генерация его затронет (например, при сохранении ресурса). Т.е. для ресурсов не будет возможности задавать uri вручную.
2) Придётся самостоятельно отслеживать изменение тех данных, которые учитываются при работе собственного генератора.
Если собственный генератор учитывает системные настройки, настройки контекстов или настройки типов контента (последнее — уж обязательно), то эта задача опять-таки в автоматическом режиме нерешаема, т.к. нет событий, наступающих при изменении этих настроек.
==========================================================================
Мой выбор — вариант №2. Сохраняющий стандартную (корректную) логику работы с замороженными url
Только как автоматически и универсально отслеживать изменение url стандартным генератором?
modx выполняет перегенерацию uri в 5 случаях:
1) При сохранении и копировании ресурсов (процессоры "resource/update", "resource/duplicate" и "resource/updatefromgrid")
2) Обновление сайта ("Сайт — Обновить", процессор "system/clearcache") — принудительно обновляет uri всех ресурсов. До версии modx 2.3.x перегенерацию URI при обновлении сайта не выполнял.
3) При изменении системных настроек типов контента (content type): процессоры "system/contenttype/update" и "system/contenttype/updatefromgrid"
4) При изменении системных настроек дружественных URL: процессор "system/settings/update"
5) При создании или изменении настроек дружественных URL для контекстов: процессоры "context/settings/create", "context/settings/update" и "context/settings/updatefromgrid"
Firefox:
Chrome:
Ну да и ладно. Хрен с ним. Главное, причина локализована.
— плагин проверяет существование нужных файлов (если их нет, выводит сообщение в логи и ничего фатального не делает)
— modx продолжает выполнение собственного кода (отображает код элемента)
Риторический вопрос: позволяет ли текущая архитектура modx отобразить в админке содержимое элемента, если установлен Ace и папки assets не существует? Это я к тому, что текущее поведение modx не является единственно возможным и абсолютно верным. Технически возможна, например, более устойчивая реализация (дополнительные проверки существования файлов), когда при отсутствии папки assets modx нормально отобразит содержимое элемента при установленном Ace (или других плагинах), но без подсветки кода.
А текущее поведение modx следует принять как есть, не впадая в крайности типа "только так и должно быть" или "это фатальная проблема".
Этот вопрос полностью решается, например, заменой всех подключаемых в html файлов вызовом специального скрипта, которому в качестве параметра передаётся обратимый хэш с ключом от имени подключаемого файла. Делать это плагином в OnWebPagePrerender или OnWebPageComplete с помощью регулярки и только для неразработчиков.
А содержимое подключаемых скриптов и стилей (в том числе в составе html) можно обфусцировать так, чтобы имена переменных, констант и css-классов там тоже были минимизированы.
MODX_ASSETS_PATH и MODX_ASSETS_URL
Отображение правой панели (с кодом элемента/файла и пр.) — это базовый функционал modx, который не должен зависеть от дополнительно установленных компонентов (с корректным кодом) и наличия папки $modx->getOption('assets_path')
Т.е. если папка не существует, то код элемента должен нормально отображаться в правой панели, но без Ace. Мне должная логика работы видится именно такой.
Сейчас же (при установленном Ace с корректным кодом) modx'у для реализации собственного базового функционала (отображение кода элемента) требуется папка assets.
Как известно, папка «assets» является одним из способов идентификации используемой CMS. А когда известна используемая CMS, ломать сайты в разы проще. Иными словами, скрывая папку assets (при соблюдении прочих «маскировочных» мер), мы существенно снижаем риск взлома сайта.
(и в плагине, и в настройке «minifyx_cacheFolder» при установке компонента) корректнее брать
В остальных исходниках — всё нормально.