<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>Блог Ильи Уткина</title>
       <link>https://www.ilyaut.ru/</link>
       <description></description>
    <language>ru</language>
<item>
       <title><![CDATA[Из-за чего возникает ошибка Could not load config]]></title>
       <link>https://www.ilyaut.ru/tips-and-tricks/iz-za-chego-voznikaet-oshibka-could-not-load-config/</link>
       <description><![CDATA[Иногда разработчики сталкиваются с ошибкой <strong>Could not load config</strong>, которая отображается в окне alert на странице. Эту ошибку выводит JavaScript пакета pdoTools при использовании pdoPage (везде, где есть пагинация).



Этот компонент работает через Ajax, и для того, чтобы на каждый Ajax-запрос система могла ответить, она должна знать набор параметров сниппета (tpl, parents и прочее). Но так как запрос приходит в виде Ajax, то сам шаблон страницы уже не парсится. Как узнать параметры? Эти параметры сниппет сохраняет в $_SESSION, а уже JavaScript, который ловит аякс-запрос, оттуда эти параметры «вытаскивает».



Вот <em>could not load config</em> означает, что <em>action.php</em> не нашёл параметры в сессии. Такое бывает, если сессия очищается, если меняется юзер, ну или что-то еще.



Так чт, если сделать в админке «Завершить все сеансы», то юзеры, у которых открыта страница фильтров или списка статей/товаров, будут видеть эту ошибку, пока не перезагрузят страницу.



В обычной ситуации такое может происходить после завершения импорта, например. В этом случае возможно скрипт импорта как-то на сессию пользователя влияет. Например, он может насильно авторизовывать админа, чтобы создать товары или что-то такое.
]]></description>
       <pubDate>Ср 16 авг 2023 13:24:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Создание API для авторизации пользователей в приложениях]]></title>
       <link>https://www.ilyaut.ru/tips-and-tricks/auth-api-for-third-party-apps/</link>
       <description><![CDATA[Иногда при создании приложений для Android и iPhone, а так же для использования в каких-то сторонних сервисах, может потребоваться сделать на сайте простенькое API для разграничения доступа.



Обычно схема этого API такая:



<ul><li>Пользователь вводит в приложении логин и пароль</li><li>Приложение делает запрос к сайту, передавая эти данные</li><li>Сайт проверяет, действительно ли есть пользователь с таким логином и правильно ли указан пароль</li><li>Если всё ок — сайт выдаёт в ответ токен</li><li>Приложение сохраняет этот токен у себя (на телефоне пользователя)</li><li>И при любых обращениях к сайту использует этот токен</li><li>Сайт получает токен и выдаёт контент, который доступен именно для этого пользователя</li></ul>]]></description>
       <pubDate>Вт 28 фев 2023 15:25:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Сниппет вывода TV параметров при условии их наличия]]></title>
       <link>https://www.ilyaut.ru/reposts/snippet-vyivoda-tv-parametrov-pri-uslovii-ix-nalichiya/</link>
       <description><![CDATA[пригодился для вывода <strong>списка параметров товара из TV</strong>

наименование TV берется из <strong>description</strong>

<strong>UPD:</strong> после долгих раздумий добавил в фильтр id категории
]]></description>
       <pubDate>Ср 21 дек 2022 08:27:19 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Решение проблемы "Добавление комментариев закрыто. MODx Revolution, компонент quip"]]></title>
       <link>https://www.ilyaut.ru/reposts/reshenie-problemyi-dobavlenie-kommentariev-zakryito-modx-revolution-komponent-quip/</link>
       <description><![CDATA[Сообщение от модуля Quip комментариев:

Добавление комментариев закрыто. MODx Revolution, компонент quip



Как решить проблему — 

Зайти в Сниппет: QuipReply(), вкладка параметры, разрешить редактирование, находим closeAfter поле, и вместо 14, пишем 99999999999. Сохранить набор параметров, Сохранить. Очистить кэш.



Повторяем толе самое для Сниппет: Quip ().

Теперь форма ввода комментариев не пропадет спустя 14 дней.



<blockquote>Источник: <a href="https://modx.pro/solutions/23099">modx.pro/solutions/23099</a></blockquote>]]></description>
       <pubDate>Ср 21 дек 2022 08:26:25 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Как сделать мультикатегории на MODX с TV-шкой]]></title>
       <link>https://www.ilyaut.ru/reposts/kak-sdelat-multikategorii-na-modx-s-tv-shkoj/</link>
       <description><![CDATA[Всем привет.

Недавно глубоко озадачился этим решением и в результате которого нехитрым (почти) способом можно сделать мультикатегории.

Подходит данное решение для сайтов у которых, наверное не более 5..10к товаров. На больших, думаю, будет тормозить, (не проверял) так что обратная связь приветствуется.
]]></description>
       <pubDate>Ср 21 дек 2022 08:25:47 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Remove Duplicates MODX]]></title>
       <link>https://www.ilyaut.ru/reposts/remove-duplicates-modx/</link>
       <description><![CDATA[Может кому пригодится.)

Компонент ищет дубликаты ресурсов, в разных контекстах! 

PS^ версия сыровата, JS накидал на коленке (эффекты и тп пока отсутствуют).



Есть два варианта обработки ресурсов:

<ul><li>Перемещение в корзину</li><li>Создание нового алиаса с прфиксом ID ресурса.

</li></ul>]]></description>
       <pubDate>Ср 21 дек 2022 08:24:55 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Возвращаем привычный вид страницы после установки пакета SEO Suite]]></title>
       <link>https://www.ilyaut.ru/reposts/vozvrashhaem-privyichnyij-vid-straniczyi-posle-ustanovki-paketa-seo-suite/</link>
       <description><![CDATA[Разработчик sterc, выпустивший два известных модуля для СЕО-шников: <strong>SEO Tab</strong> и <strong>SEO Pro</strong> — сделал новый пакет.

Называется он: <strong>SEO Suite</strong>. Данный пакет объединил в себе два выше указанных пакета + был полностью переписан весь код и добавлены новые плюшки.

Всё бы ничего, но как по мне он очень уж сильно меняет внешний вид страницы в админке. Стало неудобно =(

Поэтому не долго думая — вернул прежний вид, но при этом оставив новый функционал.


]]></description>
       <pubDate>Ср 21 дек 2022 08:24:05 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[&#91;СДЕЛАЙ САМ&#93; Ajax Регистрация, Авторизация, Сброс пароля, Редактирование профиля]]></title>
       <link>https://www.ilyaut.ru/reposts/sdelaj-sam-ajax-registracziya-avtorizacziya-sbros-parolya-redaktirovanie-profilya/</link>
       <description><![CDATA[<strong>Задача:</strong> сделать ajax регистрацию, авторизацию, сброс пароля и редактирование пользователя, используя минимум сторонних компонентов.

Почему минимум? Ну часть из тех компонентов, что реализуют подобный функционал, платная (Office, ajaxLogin) и бюджеты есть не всегда на них есть. Некоторые (ajaxLogin) в данный момент не доступны из-за смерти автора. Общий недостаток большинства компонентов это то, что они загружают дополнительные скрипты и стили, что порой приводит к необходимости дополнительно оптимизировать сайт. Компонент Login не работает по ajax. Однако это можно <a href="https://modx.pro/help/19551">обойти </a>, но runSnippet запустит много всего и не факт что это всё нужно в данный момент. Поэтому предлагаю своё решение. 

<strong>Нам понадобится:</strong>

1. AjaxForm;

2. FormIt;

3. <a href="https://github.com/ShevArtV/ajaxformfork">Этот репозиторий.</a>



<strong>Порядок действий:</strong>

1. Скопировать core/elements/snippets/ajaxidentification.class.php.

2. Создать в админке сниппеты 

2.1 AjaxIdentification (код лежит в core/elements/snippets/hooks/AjaxIdentification.php);

2.2 userExists (код лежит в core/elements/snippets/validators/userExists.php);

2.3 userNotExists (код лежит в core/elements/snippets/validators/userNotExists.php;

2.4 ActivateUser (код лежит в core/elements/snippets/ActivateUser.php) // этот можно вызывать прям из файла если хотите.

3. В вывоз AjaxForm в параметр hooks первым значением добавить AjaxIdentification, сюда же добавить параметр method ( register — регистрация, login — авторизация, forgot — восстановление доступа, update — обновление данных).

4. В js на событие <em>af_complete</em> добавить редирект на нужные страницы. Ссылки можно получать

из мета-тегов с именами типа loginSuccessUrl.

Всё. Далее немного потока сознания и пояснений.
]]></description>
       <pubDate>Ср 21 дек 2022 08:23:06 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Билдер SQL запросов для modx, minishop2 и TV]]></title>
       <link>https://www.ilyaut.ru/reposts/bilder-sql-zaprosov-dlya-modx-minishop2-i-tv/</link>
       <description><![CDATA[Всем привет, просили меня недавно сделать выгрузку со старого сайта на modx с более чем 200к товаров, т.к. я уже давно не работал с modx, абсолютно забыв методы API, а также помня, насколько <strong>медленно</strong> и ресурсозатратно оно работает было решено писать SQL напрямую и все бы ничего, пока я не увидел структуру tv полей. Руками писать SQL с выборкой необходимых TV было адским адом, и было решено за часик накидать мини билдер SQL запросов



Получился примерно такой в использовании билдер, по мне покрывает 100% моих задач в формировании SQL для выгрузок из modx &amp; ms2:

<code>
$builder = new SimpleBuilder();
$builder-&gt;addResourceFields('id', 'pagetitle', 'longtitle')
    -&gt;addMs2Fields('article', 'price')
    -&gt;addTvFields('price_opt', 'product_time', 'valute', 'remains', 'product_tax')
    -&gt;where('deleted', '=', false)
    -&gt;where('published', '=', true)
    -&gt;where('class_key', '=', 'msProduct')
    -&gt;where('remains', '!=', 0)
    -&gt;whereNotNull('remains')
    -&gt;whereIn('id', &#91;18559, 18560&#93;)
    -&gt;limit(1)
    -&gt;offset(1)
;
$sql = $builder-&gt;sql();

$products = $modx-&gt;query($sql)-&gt;fetchAll(PDO::FETCH_ASSOC);
</code>Под катом код и результат SQL который формирует билдер

<a href="https://gist.github.com/pavel-one/75c0c0c966e78b6f209868c238e41abc">Если хочется сразу к коду</a>
]]></description>
       <pubDate>Ср 21 дек 2022 08:22:08 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[AjaxForm без jQuery]]></title>
       <link>https://www.ilyaut.ru/reposts/ajaxform-bez-jquery/</link>
       <description><![CDATA[Приветствую тебя дорогой читатель. Давно хотел это сделать и наконец-то сделал — теперь для работы AjaxForm не нужен jQuery. Для этого нужно

1. Перейти по <a href="https://github.com/ShevArtV/ajaxformfork">ссылке</a>.

2. Заменить содержимое папок core/components/ajaxform и assets/componentns/ajaxform/ данными из репозитория. 

3. Заменить код сниппета AjaxForm кодом из репозитория.

Если будут ошибки пишите в комментарии, а под катом немного о нюансах.
]]></description>
       <pubDate>Ср 21 дек 2022 08:21:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[MODX + Docker]]></title>
       <link>https://www.ilyaut.ru/reposts/modx-docker/</link>
       <description><![CDATA[Всем привет!



Увидел тут в комментариях <a href="https://modx.pro/development/22612">к одной заметке</a> вопрос про MODX в Docker. Так уж совпало, что я как раз недавно освоил работу с Docker для своих проектов на <strong>Vesp</strong>, и <a href="https://www.pixmill.ch">Pixmill</a> попросили меня сделать что-то такое же и для MODX.



<img src="https://file.modx.pro/files/0/5/8/0582790dc9e434e04071b17dd3d084de.png">



Вызов был принят — и вот результат <a href="https://github.com/bezumkin/modx-docker">github.com/bezumkin/modx-docker</a>, можете использовать. Ниже будут пояснения.]]></description>
       <pubDate>Ср 21 дек 2022 08:20:12 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[ZoomX для новичков]]></title>
       <link>https://www.ilyaut.ru/reposts/zoomx-dlya-novichkov/</link>
       <description><![CDATA[ZoomX — компонент, который подключает шаблонизатор Smarty и делает элементы файловыми. Также есть роутер, контроллеры, как во фреймворках. Главный плюс, конечно — это файловые элементы без костылей в виде статических элементов.



Как мне показалось, автор считает, что компонент предназначен для опытных разработчиков, более менее знакомыми с фреймворками, дабы те не ушли с MODX. Могу ошибаться, конечно) Моё же мнение таково: ZoomX нужно изучать сразу же, вместе с pdoTools. Почему? Чтобы не тратить время на изучение стандартного парсера и на решение проблем с ним при реализации чего-то сложнее вывода заголовка страницы. Smarty гораздо проще в использовании. Хранение элементов в базе может отпугнуть новичков. Именно ZoomX, а не выход третьей версии MODX — важнейшая веха в развитии системы со времён pdoTools. Но все статьи про компонент написаны для более-менее опытных разработчиков, новичкам будет сложно разобраться. Поэтому, собственно, и решил написать эту статью.
]]></description>
       <pubDate>Ср 21 дек 2022 08:18:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Простые отзывы на сайте AjaxForm (Formit) + MIGX]]></title>
       <link>https://www.ilyaut.ru/reposts/prostyie-otzyivyi-na-sajte-ajaxform-formit-migx/</link>
       <description><![CDATA[Создание отзывов на сайте без использования платных дополнений или громоздких, таких как <strong>Tickets</strong>.

Нам понадобятся следующие дополнения: <strong>Formit</strong>, <strong>AjaxForm</strong> и если хочется защитить форму — <strong>recaptchav3</strong>.



Данная статья будет полезна новичкам в modx и ни на что не претендует.
]]></description>
       <pubDate>Ср 21 дек 2022 08:13:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Используем $modx->getOption()]]></title>
       <link>https://www.ilyaut.ru/reposts/method-modx-getoption/</link>
       <description><![CDATA[Метод $modx-&gt;getOption() один из основных методов MODX. Очень часто он используется для получения какой-либо системной настройки.



<pre class="prettyprint">mixed getOption (string $key &#91;, array|null $options &#91;, mixed $default &#91;, boolean $skipEmpty&#93;&#93;&#93; )</pre><strong>$key</strong> — ключ настройки, который нужно найти.

<strong>$options</strong> — ассоциативный массив или NULL. Если указано последнее, то поиск будет производится в системных настройках. В противном случае, ключ будет искаться в указанном массиве.

<strong>$default</strong> — значение по-умолчанию, которое будет передано методом, если настройка с указанным ключом не найдена.

<strong>$skipEmpty</strong> — если установлено в true, то значение по-умолчанию будет передано не только когда ключ не найден, но и когда возвращается пустая строка.]]></description>
       <pubDate>Пн 15 апр 2019 09:36:00 +0400</pubDate>
    </item>
<item>
       <title><![CDATA[Скрипт для создания менеджера]]></title>
       <link>https://www.ilyaut.ru/reposts/a-script-to-create-a-manager/</link>
       <description><![CDATA[Скрипт для создания пользователей с определенными правами и своим источником файлов для админки.



По умолчанию будет создан менеджер с логинам и паролем <strong>manager</strong> и медиа источником с корневым каталогам <strong>assets/uploads</strong> из прав у пользователя будет только возможность работать с ресурсами, а c пунктов меню доступ только к «Приложения»]]></description>
       <pubDate>Вт 12 мар 2019 07:58:21 +0400</pubDate>
    </item>
  </channel>
</rss>