9 часов назад
Совершенно другой уровень разработки.
Теперь придется переучиваться.
Нужен новый туториал для разработки на новом подходе.
Нужна новая документац...
mmxApp - разработка новых composer дополнений 3
Вчера в 12:57
Данная ошибка в логе никак не связана с проверкой доступа по модификатору pasraccess.
Можете написать в ТГ в профиле.
[PayAndSee] - Версия 2.0 55
20 апреля 2024, 16:08
Смотрите ошибки в консоли браузера.
[СДЕЛАЙ САМ] SendIt и MiniShop2 - заказ в 1 клик - быстро, просто и бесплатно. 59
20 апреля 2024, 15:47
{set $data = id_ресурса | resource : 'название_тв_migx' | fromJSON}
{foreach $data as $item}
{$item.name}
...
Получение tv поля ресурса 5
19 апреля 2024, 12:48
Постараюсь в свободное время это сделать, спасибо за предложение
[FetchIt] - Полноценная замена AjaxForm без зависимостей 59
19 апреля 2024, 11:49
Самое лучшее решение в данной ситуации — это сделать отдельный файл для работы с этим API, например:
/assets/components/mycomponent/api.phpну или про...
[JSON] Как вывести страницу в формате JSON? 2
18 апреля 2024, 21:54
Не отображаются добавленные поля в редактировании пользователя.
Добавил одно поле в «общую информацию», для другого создал вкладку, в ней ещё вкладку...
ExtraFields. Дополнительные поля для ресурса (modResource) и пользователя (modUserProfile). 31
18 апреля 2024, 17:01
попробуйте убрать exit(true);
Как в плагине поменять статус заказа minishop2? 9
Не за что.
Если писать все самому с нуля, то делается примерно так:
— создаете требуемую html-форму
— при submit-e отправляете с помощью ajax-a данные на ваш action.php, который уже будет взаимодействовать с бэк-логикой
— обрабатываете данные (валидация, допустимая длина символов и тд)
— в зависимости от результата возвращаете ответ и выводите через js
— если все ОК, то регистрируете/авторизовываете/редактируете через те же процессоры
Резюмируя:
— если хотите научиться как сейчас модно-молодежно, то приобретите Office и ковыряйтесь в нем.
— если хотите быстро-удобно-безопасно, то тот же вариант
— если хотите бесплатно или поностальгировать о давно-ушедших 00-ых, то Login или какой-нибудь велосипед из той же оперы
Расшифровка:
— суффикс _all нужен исключительно для наглядности, вы можете заменить содержимое for и id на любое другое уникальное для фильтров данной категории значение.
— в name передается название псевдонима фильтра. Если псевдоним отсутствует, указывается значение из filters (resource|parent)
— в value ничего не указывается, он остается пустым (чтобы при нажатии функция mFilter2 сбросила значение требуемого фильтра)
— обработка гет-параметра ($.get.category) нужна для проставления checked-состояния при первой загрузке страницы
1. Подключаете любую js-библиотеку, взаимодействующую с get-параметрами или написать свои функции для их получения и изменения. Например, такие:
2. Добавляете в нужном месте кнопку сброса:
Суть: поскольку используется radio-инпут, достаточно передавать в value пустое значение, чтобы сбросить гет-параметр.
Пример реализации.
В рамках ms2gallery из коробки ничего похожего нет, поэтому или править исходники, дописывая нужный обработчик, или сторонний компонент, который будет выцеплять уже загруженные к ресурсу изображения и обрабатывать их с последующим сохранением в отдельную директорию (т.е. писать все с нуля).
Шаг 1.
Создается мультиселект-tv-поле (tv1) для страниц услуг, в котором выводятся все категории (в формате pagetitle==id)
Шаг 2.
Все страницы услуг создаются в едином разделе (во «всех услугах» или каком-то скрытом, например)
Шаг 3.
Создается тв-поле «id подходящих услуг» для категорий с услугами (tv2).
Это нужно для того, чтобы отображения списка подходящих услуг в категории происходила быстрее (не тратя время на where IN для каждой услуги).
Шаг 4.
Вешется плагин на создание/изменение страниц услуги, при котором в tv2 всех выбранных категории из tv1 переносился id сохраненной услуги.
Шаг 5.
Теперь нужно позаботимся о том, чтобы страницы услуг были доступны внутри любой из подходящих категорий. При помощи кастомной маршрутизации на событие OnPageNotFound вешаем подходящий вам паттерн.
Предположим, что все услуги имеют следующий вид ссылок:
Тогда логика будет примерно такая:
— срабатывает событие OnPageNotFound
— превращаем запрошенную ссылку в массив
— если длина массива == 3, а первый элемент в нем == 'services', то работаем дальше
— ищем страницу вида /services/(category_name)
— если находим, то ищем услугу с alias == (service_name)
— если находим и её, то из объекта найденной категории получаем значение tv2 и ищем в нем id услуги
— если есть совпадение, то делаем sendForward, иначе отпускаем плагин на 404.
Шаг 5.
Выводим список подходящих услуг в категории по принципу &resources=`[[*tv2]]`. В чанке вызова формируем ссылку на услуги примерно таким образом:
$_modx->resource.parent | url лучше сформировать вне вызова сниппета и передать готовый результат уже в него, чтобы не плодить кучу одинаковых запросов
Хлебные кроши.
Тут все просто, если у нас сгенерирована виртуальная страница через sendForward, то в плагине передаем в неё какой-либо свой плейсхолдер. Дальше от него в шаблоне формируются if-условия. В случае с хлебными крошками можно просто выводить их до «родителя» и дописывать текущую страницу в последнем пункте.
Карта сайта и СЕО
Тут у вас есть, условно, 2 важных момента:
1. Канонический url, во избежании дублей (link rel=«canonical»).
Можно указать или родной url ресурса (там, где они физически хранятся), или создать еще одно tv-поля для страниц услуги «основная категория» и формировать адрес в зависимости от неё.
В случае, если был выбран второй вариант, доступность услуг по «физическому» адресу нужно перекрыть (опять же, в шаблоне услуг можно проверять наличие плейсхолдера из плагина, и при его отсутствии создавать редирект).
2. Карта сайта.
Если с каноническим url был выбран вариант «физического адреса», то с картой не нужно проводить дополнительных манипуляций. В противном случае, физические адреса из вызова pdoSitemap-a нужно исключить и дополнительно сгенерировать виртуальные ссылки. (для минимализации времени генерации результата я бы разбил sitemap на 2 раздела (основные страницы и страницы услуг).
При создании ресурсов определенных шаблонов (категория услуги и страница услуги) в первом контексте, на событие OnDocFormSave и $mode == 'new', создавать аналогичные ресурсы с тем же названием в двух остальных контекстах. Код плагина будет примерно похож на данный.
Таким образом, можно или в автоматическом режиме в том же плагине проставлять id связанных ресурсов в тв-поля «основного», или ограничиться полным соответствием поля pagetitle для сопоставимых рубрик, и выводить «сопутствующие» рубрики уже по нему.
1. Создаешь страницу «Дневники» (/diary/), в которой будут храниться дневники всех пользователей. Лучше сделать страницу коллекцией, чтобы админка не захламлялась.
2. Создаешь плагин, который при регистрации пользователя нужной группы создает раздел с тикетами в странице из шага 1. Код плагина будет примерно таким.
3. Для шаблона разделов с дневниками и страниц с записями (тикеты) закрываешь просмотр всем, кроме администратора и автора:
4. Закрываем страницы от индексации, sitemap-a и прочее СЕО.
Плюсы: все дневники пользователей и записи разделены как в админке, так и во фронтэнде. Решение достаточно простое и, фактически, ограничивается возможностями дополнений из коробки.
Минусы: плодятся множество страниц. При большом объеме пользователей и их хорошей активности, объем БД и нагрузка на процессоры, связанные с работой ресурсов MODX-a (очистка кэша, генерация дерева и тд) будет выше, чем от самостоятельной таблицы.
Способ 2:
1. Создаешь раздел тикетов «Дневники» (/diary/). Все тикеты всех пользователей добавляются в данный раздел.
2. В шаблоне из пункта 1 совершаешь проверку пользователей по такому принципу:
3. Аналогично закрываем страницу тикета, sitemap, СЕО и тд и тп.
Плюсы: меньше разделов тикетов и глубина вложенности страниц, чем в пункте 1.
Минусы: не так удобно смотреть записи из админки.
Способ 3:
1-N. Написать свою таблицу с нужными полями, свою маршрутизацию запросов и вообще все с нуля.
Плюсы: самое быстрая итоговая скорость, минимально отягощающая работу самого MODX-a.
Минусы: реализация займет гораздо больше времени, а требования к навыкам намного выше.
После этого вы сможете загружать файлы к тикетам из админки.
По поводу msGetOrder — честно говоря, без понятия. Насколько я вижу, сниппет msGetOrder, из коробки вызывается только при отправлении письма менеджеру или пользователю.
Что же до вашего участка кода… Не совсем улавливаю, для чего вы изменяете коробочный сниппет для вашей задачи. Скорее всего, её можно решить изящнее, например с помощью того же fenom-a.