Тонкости и трюки

Собственная маршрутизация в MODX

Есть очень частый вопрос "а как вывести то-то по такой-то ссылке?". И речь здесь не о заморозке uri, а о собственном маршруте нахождения страницы по указанному адресу, типа такого. То есть, речь идёт о маршрутизации, или, в народе - роутинге.

MODX отлично работает с дружественными url и представляет кучу настроек для их функционирования, а там, где настроек не хватает, он даёт нам замечательный инструмент для описания собственной логики - системные плагины по событию OnPageNotFound.

Как следует из названия, событие это возникает, когда MODX не смог найти страницу по запрошенному адресу, и в этот момент мы можем перехватить запрос и вывести что-то своё. Если же мы ничего не перехватываем, то выводится 404 not found.

Читать далее

AjaxSnippet и аякс пагинация

Вызываем AjaxSnippet на странице


[[!AjaxSnippet?
    &snippet=`pdoPage`
    &element=`msProducts`
    &tpl=`tpl.msProducts.row`
    &limit=`3`
    &parents=`4`
    &page=`[[!geturi]]` 
    &wrapper=`tpl.ajax`
]]
Читать далее

Уникальное поле профиля пользователя

Добрый день,

плагин, позволяет сделать уникальным любое поле в профиле пользователя, не прибегая к каким-либо изменениям ядра.Только системное событие OnBeforeUserFormSave. Работает соответственно так же и в бекенде.

В примере стоит имя пользователя, пример рассчитан на работу с Hybrid Auth — т.е даже если будет совпадение по имени, профиль автоматически создастся при первом входе, но при сохранении возникнет ошибка.

Читать далее

Sendex - отправка рассылки при публикации ресурса

Небольшой плагин для Sendex — отправка рассылки при публикации ресурса.

Создаем новый плагин, вставляем код, ставим галочку напротив события OnDocPublished, меняем id-шники в начале кода на свои и радуемся.

Читать далее

Переключение контекстов мультиязычного сайта

Написал 2 инструкции для простого переключения контекстов в классической ситуации нескольких языковых версий.

Директории

Плагин для ситуации, когда домен один, а языковые версии отличаются префиксом в адресе: mysite.com/ru/page.html и mysite.com/en/page.html.

То есть, условия такие: - Все контексты на одном домене, и у них отличается base_url

  • Используются friendly urls
  • base_url может не совпадать с именем контекста

Идея заключается в выборке всех контекстов и сравнения их базового адреса с запросом. Создавать директории и копировать index.php не нужно.

Читать далее

Очистка старых сессий в MODX

Есть давнишний вопрос про большую таблицу modx_session, лично у меня она занимает 1.1 гигабайт и содержит около 500 000 записей. С одной стороны - не напрягает, а с другой непонятно, почему она понемногу растёт?

Таблица состоит из 3х колонок: идентификатор, время изменения и собственно данные сессии. У меня самая старая сессия от 30 октября 2013 года, то есть менялась она 3 месяца назад.

В настройках же установлена session_gc_maxlifetime = 604800, то есть старые сессии должны удаляться через 7 дней. По умолчанию, все сессии хранятся в БД, значит настройки хостинга и стандартный сборщик мусора тут не помогут - это должен делать сам MODX. Поправка - см. обновление в конце заметки.

Читать далее

HybridAuth Авторизация в контексте mgr

Небольшая заметка о том как авторизировать определенных пользователей в контексте mgr без ввода логина и пароля.

Используется

  • MODX Revo [2.2.10-pl]

  • HybridAuth [0.8.5-pl]

Читать далее

Выбор первых картинок из контента

Вариант с использованием properties.

Используется в плейсхолдере например так

<img   src="[[+properties.first_img_src.0]]" >

Плагин нужно выставить для события OnBeforeDocFormSave

Читать далее

Динамический title страницы - радуем поисковики

Недавно заметил, что в webmaster.yandex.ru у меня очень много одинаковых заголовков страниц. И если на SEO как таковое мне откровенно начхать, то некрасивый вывод сайта в результатах поиска не радует.

Решил немного поэксперементировать в этом направлении, в результате чего получился довольно простой сниппет.

Что умеет:

  • Если есть longtitle — он используется вместо pagetitle (можно указать другое поле)

  • Затем добавляются родители страницы, используя pdoCrumbs

  • Если на странице есть пагинация — добавляет «стр. n из nn»

  • Результаты работы кэшируются, с учетом параметров url

Дмуаю, вы сможете еще самостоятельно добавить чего-нибудь в этот сниппет.

Читать далее

Авторизация в админке с фронтенда

Разбираю старые плагины на bezumkin.ru, и наткнулся на небольшой lifehack — вроде еще не публиковал.

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

Это делается очень просто:


if ($modx->event->name == 'OnWebPageInit') {
    if (!$modx->user->hasSessionContext('mgr') && $modx->user->isMember('Administrator')) {
        $modx->user->addSessionContext('mgr');
    }
}

Всего 5 строк, и в админку можно входить с фронтенда через HybridAuth.

Читать далее

Вывод категорий с присоединением товара

Вот многие сравнивают pdoTools с другими сниппетами, забывая, что сравнивать можно не только скорость, но и возможности.

Например, он может выбрать все категории товаров, на разных уровнях, а потом присоединить к каждой по одному товару, со всеми свойствами и картинкой.

В итоге выходит вот такой листинг раздела товаров:

Конечно, вызов сниппета довольно сложный, и местами похож на извращение, но работает.

Читать далее

Плоское меню из категорий товаров

Возникла задачка: выбрать все категории товаров и вывести их списком в одном месте. Этакое «плоское меню».

6 блоков, по 2 категории в каждом, итого 12 небольших меню. При этом, конечно, категории товаров находятся на разной глубине, и даже вложены друг в друга.

Ни один стандартный сниппет так не сделает, поэтому пришлось написать свой.

Читать далее
inetlover
Александр Наумов
27.09.2022 22:16
Василий, спасибо тебе большое! Обалдеть, как круто!
Сергей Лелеко
26.09.2022 10:22
Тоже задействовал! Прекрасная функция!
inetlover
Александр Наумов
19.09.2022 11:56
Компонента Sidebar у Bootstrap нет, значит нужны только стили из Bootstrap-Vue @import &#39;~boot...
bezumkin
Василий Наумкин
13.08.2022 14:41
неужели, все глобальное, так просто можно взять и сделать Да, именно так. Мелкие затыки, конечно ж...
bezumkin
Василий Наумкин
13.08.2022 11:18
Killed говорит, что сервер прибивает задачу, скорее всего у провайдера есть какие-то лимиты по нагру...
bezumkin
Василий Наумкин
11.08.2022 18:46
Класс!! Рад, что тебе нравится! нужно добавить @click=&quot;showCart = true&quot; в: Спасибо, попра...
bezumkin
Василий Наумкин
09.08.2022 14:27
На здоровье!
inetlover
Александр Наумов
30.07.2022 22:58
Василий, спасибо большое! Первый вариант помог, не было вот этой настройки: php_value[sys_temp_dir].
bezumkin
Василий Наумкин
06.07.2022 17:06
Базовый Vue, базовый ES 6: импорт-экспорт модулей, вот это всё. Если что-то будет непонятно - просто...
bezumkin
Василий Наумкин
06.07.2022 14:19
Спасибо, что читаешь!