We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 42597
    • 8 Posts
    Приветствую
    Сейчас изучаю modx, и никак не могу найти наиболее идеологически верный способ, которым можно обработать ajax-запросы в кастомной (самописной) компоненте НЕ из мэнеджера, а просто, для обычного web-контекста. То есть, есть некий сайт, на нём находится мой ajax-виджет, который "подтягивает" данные с сайта, анализирует их выводит какую-либо соответствующую информацию. Однако, сам компонент (бищнес логика этого компонента) должна выполняться в контексте архитектуры modx, то есть, иметь достум к $modx->*, на него должны распространяться механизмы безопасности и т.д. то есть быть обычным modx-компонентом.

    Лично я сейчас вижу такой способ: создаём ресурс с mime-type json, отключаем для него шаблон и в качестве контента вставляем некий сниппет: [[doAjaxParseAndFormatResponse]] который собственно и делает всенаеобходимые действия, затем отвечает каким-то другим аяксом (return json_encode($myResponseInfo);)

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

    в общем, не могли бы подсказать (и привести пример структуры директорий с последовательносью обращений) для обработки клиентских ajax-запросов из кастомных компонент?
      • 39194
      • 149 Posts
      В случае с компонентом необходимо использовать процессоры + коннекторы. коннекторы - это веб-акцессоры для процессоров. По идее коннекторы должны быть в connectors/components/mycomponent/ , но на практике коннекторы суют в /assest/components/mycomponent/ , что убивает некоторые функции modx. Также возможен вариант использования плагина, навешенного на подходящее событие (вроде OnWebPageInit) . Тут важно использовать самое подходящее событие, чтобы modx сделал не больше не меньше того, что он должен сделать когда придет AJAX запрос. С ходу и не подскажу, как уже писал - OnWebPageInit можно попробовать.
        • 42597
        • 8 Posts
        спасибо, но к сожалению, это не то, что имелось ввиду: процессоры + коннекторы это только для бэкенда (как говорят сами разработчики), и только для уже аутентифицированных пользователей, и что-бы проделать что-то подобное для фронтэнда, приходится прибегать к хаку, что весьма удивительно... подробнее здесь: http://stackoverflow.com/questions/10395660/front-end-ajax-in-modx-revolution

        а официальный предлагаемый способ сводится к тому способу, как я и думал сделать, но считал это неправильным решением, думая, что имеется более элегантное решение
          • 42597
          • 8 Posts
          в принципе, думаю, возможно получится это сделать в более правильном Revo-стиле, используя какой-то такой подход но прийдётся изрядно покопаться во внутренностях MODx, так как затрагивается действительно много всего ради просто обычного ajax-запроса из фронтэнда...
            • 39194
            • 149 Posts
            Насчет коннекторов быть может я не прав (что их можно использовать в вебморде).
            Я думаю я бы выбрал один из вариантов:
            1) Создать ресурс в blank шаблоном и поместить в него сниппет, обрабатывающий мои AJAX запросы.
            2) Создать плагин и отлавливать свои xhr-запросы еще до того, как MODX начнет подгружать запрошенный ресурс.
            3) Создать отдельную точку входа ввиде файла, скажем ajax.php
              • 42597
              • 8 Posts
              спасибо за ответ. Это ясно и так, однако, мне просто хотелось ухнать именно про идеологически-верный способ это делать, который является что-ли более MODx-way, а не просто как это сделать технически.
              В общем, получается так, что самый правильный способ - это делать свои ресурсы с mime-type json, в котором будет туолько один выхов нужного нам сниппета... в общем, уж как-то слишком усложнено, но если сами разрабы говорят, что в MODx это правильно и идеологически-верно, тогда остановлюсь на этом способе.
              с другой стороны, подобный подход даже более плавно интегрируется в саму идеологию MODx-а для фронтэнда, где роль коннектора выполняет ресурс-нода, на которую огут распространяться все прочие политики безопасности, видимости т.д... хотя, просто после Yii, такой подход просто отвергался мною чисто органически )
                • 39194
                • 149 Posts
                Идеологически все правильно и верно бывает только в сказках. MODx не идеал. Идеала нет вообще и быть не может.
                В MODx нет никаких особых плюшек для xhr-запросов. Поэтому каждый как хочет так и реализует их обработку. Это мое мнение.
                  • 21854
                  • 58 Posts
                  Я вот так работаю с AJAX http://modx.im/blog/181.html
                  Еще через коннекторы, в этом нет ничего страшного
                    Working with MODX Revo|Evo, Laravel Framework. My website http://vanchelo.pp.ua
                    • 42597
                    • 8 Posts
                    о, замечательно, благодарю, про MODX_API_MODE не знал.

                    Еще через коннекторы, в этом нет ничего страшного
                    ну как я понимаю, обычный способ ($modx->request->handleRequest(...)) потребует аутентификации, или вы про другой ?

                    пока остановился на способе из shopkeeper, т.е. конечный файл, который принимает ajax-запрос хоть и находится в assets/connectors, но вдействительности является просто:
                    <?php
                    /**
                     * Shopkeeper frontend connector
                     *
                     * @package shopkeeper
                     */
                    
                    require dirname(dirname(dirname(dirname(__FILE__))))."/config.core.php";
                    require MODX_CORE_PATH."components/shopkeeper/ajax-action.php";
                    ?>
                    


                    а вот этот хэндлер MODX_CORE_PATH."components/shopkeeper/ajax-action.php" уже просто запускает движок, инициализирует контекст и т.д.