We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 30557
    • 11 Posts
    Уважаемые профессионалы MODX.

    Недавно программирую в MODX. Уровень владения php - средний.
    Столкнулся c проблемой, которую не знаю как решить. Буду признателен за любые идеи.

    Итак, есть движок MODX и пользовательская таблица.
    Есть страница для отображения информации из этой таблицы. Она же - форма ввода/редактирования информации.
    В разных частях страницы находятся сниппеты, "короткими селектами дергающие" информацию из пользовательской таблицы и рисующие ее в разных частях страницы. Также, на странице расположен сниппет, рисующий форму ввода/редактирования.
    При сохранении страницы на сервер передается набор полей, которые обновляются этой формой, в том числе ключевое поле таблицы.
    При отрисовке страницы сниппет, соответствующий форме ввода-вывода, анализирует был ли пост-запрос на обновление. Если да - выполняет обновление таблицы и перерисовывает свои данные. Если нет, то, просто выводит данные из таблицы. Прочие сниппеты вывода ничего не анализируют а только выполняют короткие селекты по ключевому полю.
    В результате, получается следующая ситуация:
    После отправки формы содержимое таблицы обновляется. Но при этом обновление данных заметно только в той части страницы, которая отрисовано сниппетом формы. А те части страницы, которые, отрисовываются другими сниппетами, остаются с теми значениями, которые были до выполнения обновления.
    То есть очень получается, что все сниппеты выполняются асинхронно. И получается, что часть селектов на форме успевает выполниться до обновления данных таблицы. А другая - после.
    Опытным путем установлено, что варьируя взаимное размещение и общее количество сниппетов а странице можно добиться того, некоторое количество ОДИНАКОВЫХ ВЫЗВОВ сниппетов на странице нарисуют РАЗНЫЕ значения. Некоторые нарисуют селекты до обновления. А остальные - после обновления.

    Отсюда и возникает вопрос к знатокам MODX:
    Каким образом, в MODX можно управлять порядком выполнения сниппетов?

    Нужно сделать что-то наподобие объекта-семафора. Сначала семафор закрыт. Открыть семафор может только главный сниппет-форма. Каждый сниппет должен проверять состояние семафора и приостанавливать свое выполнение до тех пор, пока семафор закрыт. При открытии семафора, все приостановленные сниппеты должны продолжить свою работу. Чтобы не проверять семафор по таймеру, желательно сделать так, чтобы при открытии семафора в каждом их остановленных сниппетов вызывалась колбэк-функция, выводящая его из режима ожидания.

    Подскажите, пожалуйста, идею, как все это можно реализовать на php.
    И как это потом прикрутить к MODX.
    Можно ли на php написать сниппет-семафор. Или это будет уже не сниппет, а скорее, плагин-семафор?
      • 785
      • 2,113 Posts
      Сниппеты в MODx исполняются строго в порядке их нахождения в коде. При кэшировании сниппеты выполняются только перед записью кэша. Все остальное – особенности PHP. Скорее всего лучшим вариантом будет объединение всего кода в одну программу и вызов ее в качестве сниппета, причем эта программа сможет реализовать вывод нужных фрагментов, обращение к базе и любые другие функции.
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 30557
        • 11 Posts
        Ну, хорошо. Допустим, MODX к этому эффекту не имеет отношения.
        Объясните, тогда про про php:
        Как на php реализовать процедуру, которая бы при запуске приостанавливала свое выполнение до завершения работы другой процедуры (или, скажем, появления какой-нибудь глобальной переменной с результатом). А затем продолжала бы свое выполнение обычным образом?

        Расскажите, пожалуйста, что такое события MODX?
        Я могу регистрировать пользовательские события (вроде, начала/окончания работы определенного сниппета).
        И запускать другие сниппеты по таким событиям?
          • 785
          • 2,113 Posts
          Какой другой процедуры? Работает всегда одна процедура, если вызвана другая, пока она не будет полностью выполнена, вызывающая процедура не будет выполняться. Нет никакого параллелизма, так что и средств синхронизации не требуется. События нужны не для синхронизации, а для того, чтобы в определенные моменты генерации страницы подключать дополнительные фрагменты кода.
            Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
            Статьи о MODx, регулярно новые публикации
            • 30557
            • 11 Posts
            Спасибо за наводящие соображения.
            Вопрос решен следующим образом.

            Страница представляет собой микс из информации, выводимой из базы, и форм, отправляющих запросы на обновление. Причем, часть полей на формах и сами формы - скрытые. А основные input-ы ввода разбросаны по всей странице. Также, присутствуют яваскрипты, которые "перекладывают и дублируют" информацию из одних инпутов одних форм в другие. При этом, любой видимый и невидимый компонент может инициализироваться выполнением сниппета с "коротким" запросом к базе с параметрами, определяемыми частично из параметров запроса, частично из логики расположения сниппета на форме.
            При выполнении запроса на обновление, имя формы, инициировавшей запрос, передается в одном из параметров запроса.

            Требуется обеспечить работоспособность страницы и ее отрисовку со всеми изменениями, вызванными выполнением текущего запроса.

            Решение: Разработан специальный сниппет, который не осуществляет никакого вывода данных на форму. Его назначение - только обработка запроса на обновление. Действия при запросе полностью идентифицируется именем формы, пославшей запрос.
            Сниппет размещен строго вверху контента страницы. Спасибо знатокам - явно используется знание о том, что вызовы сниппетов обрабатываются строго в том порядке, в котором они написаны на странице.

            При такой архитектуре проблем с синхронностью не возникает. Получается, что запрос на обновление данных всегда выполняется первым (поскольку этот сниппет - первый на странице). А весь прочий вывод идет из уже обновленных данных.