Контактная информация

По всем интересующим вас вопросам связывайтесь при помощи контактной информации приведенной на этой странице!

skype: metsof
email: accusser@gmail.com

В социальных сетях...

Форма обратной связи

Авторизация

MODX статьи, уроки и готовые решения для MODX Revo

Сайдбар

Создание SEO AJAX Framework (Revo 2+)

16 дек. 2012

 

Этот учебный материал представлен в виде обсуждения / демонстрации техники. Этот плагин позволяет SEO AJAX легко передавать запросы AJAX с помощью сегментов URL в виде упорядоченных неименованных массивов параметров на любую страницу сайта. Неиспользуемые параметры игнорируются.



Пример:  URL http.://sub.domain.tld/buy/ajax/12345/43/3 передает значения 12345, 43 и 3 на страницу “купить” без каких либо усилий с вашей стороны. Если изменить «ajax» на «full», произойдет снижения уровня производительности до выбранного вами " full " шаблона страницы.

Обновление на 20 августа 2012:

•    Разделен на 3 плагина
•    Сделаны улучшения алгоритмов кода
•    Появилась поддержка всех моих плагинов
•    Добавлено автоснижение нагрузки на систему (с помощью переключения шаблонов)
•    Добавлены системные настройки для изменения параметров совместимости, конфигураций, безопасности, производительности.


Резюме



MODx – чрезвычайно быстрая и легкая платформа для разработки полномасштабных веб приложений, контент-провайдеров и даже веб сервисов. Поиграв с Revolution, я обнаружил, что информация об интеграции с AJAX ограничена. Но мой опыт в разработке плагинов и использовании Php помог разобраться с этим в два счета и сделал использование AJAX проще, чем любые другие CMS/CMP. Этот материал о том,  как сделать доступными AJAX скрытые возможности MODx, например, возможность использовать с помощью AJAX Ресурсы и т.д. Самое главное – все настройки займут меньше 30 минут.

Внимание: Я уверен, что методика будет работать в Evolution и Revolution. Методика была разработана для Revolution 2.2+.


Методика



Это пособие создано одновременно и для AJAX новичков, и для MODx экспертов. В результате некоторые разделы могут быть пропущены читателями, хотя я не рекомендую это делать. Сначала, для новичков, я рассматриваю AJAX – что это такое, его требования. Далее я углубляюсь в то, как AJAX интегрируется в MODx и какие вопросы возникают при этом. Обсуждение каждого вопроса подразумевает его логическое решение. Далее мы работаем с редактированием системных установок, после чего учимся добавлять плагины. Затем мы создаем пример сниппета для обучения обращению с его параметрами. Все это не так-то просто, если не увидеть, как  с этим работают на примере, поэтому мы создадим пример Ресурса. Ну а дальше – пробовать, пробовать и еще раз пробовать! Перед подведением итогов обратимся к совместимости.

Готовы вы или нет, мы начинаем.


Введение в AJAX



Этот раздел предназначен для новичков в AJAX, использующих JS/PHP. Любые AJAX запросы – это запросы к документам веб сайта (в ModX это Ресурсы), используя JavaScript. Для функциональности, очень часто результат будет в виде прямой ссылки на  php/.asp документ. Это подразумевает, что для каждого AJAX компонента нужно иметь: а) URL и  б) способ формирования контента.

Многие запросы AJAX требуют различную информацию, основывающуюся на параметрах, которые должны быть переданы. Часто разработчики пытаются использовать различные методы (GET, POST, PUT, DELETE) в зависимости от того, что они хотят сделать. Более запутанные вещи, SEO-ориентированные запросы, не зависимо от платформы, могут быть сложными для задания параметров. Поисковые системы часто  избегают кэшировать не “привязанные” URLы (т.е. domain.tld/path?parameters).

В качестве резюме, нам нужны:

•    URL для извлечения контента
•    Метод получения параметров URL’ом
•    Возможность преобразования параметров в динамический контент
•    Простейший шаблон для образования выбранного SEO-ориентированного URL’а


Интеграция AJAX  в ModX платформу



Теперь немного подробнее о том, что скрыто происходит при работе AJAX в MODx. Когда определенные дополнения разрешены для динамических запросов, большинство из них зарезервированы для Коннекторов. Коннекторами могут быть комплексные PHP классы, которые требуют много этапов для отладки. Нам нужен обходной способ для создания Коннектора в выделенной среде обработки.

К тому же, несмотря на размещения вашего PHP файла в вашей Assets директории, PHP файлы не доступны через URL. Типичным ресурсом является полные HTML документы с необходимыми URLами. Это означает, что работающий динамический код может быть “занозой в …”.
Несмотря на эти ограничения, есть несколько простых способов для преодоления их. Каждый позволяет расширять функциональные возможности, для большей универсальности и лучшей функциональности. Если мы разыграем наши карты верно, мы можем даже улучшить возможности безопасности.

— неполный HTML – наиболее часто используемый Шаблон в качестве структуры страниц. Но Шаблоны только добавляют выбранный HTML или Контент. Вы можете также а) создать новый Шаблон без  HTML заголовка или Body элементов, но с P, DIV, OL, и т.д. или б) “привязать” каждую AJAX к пустому Шаблону (0). Также возможно вернуть только HTML сгенерированный при запросе к этому URL. Первый вариант – лучший, он допускает применение TV и MODx парсинг. Новые результаты в документе не подлежат парсингу.

    Запуск PHP с помощью URLа – это действительно довольно просто. URLы передаются Ресурсу (всегда). Ресурсы запускают код с помощью Сниппетов. Каждый сниппет вызывает PHP. Просто включите вызов Сниппета в ваш Ресурс. Таким образом MODx сделает парсинг документа.

    - Параметры запроса доступа – Когда Ресурс отправляет запрос Сниппету, у Сниппета есть доступ к базе переменных, включая  $_REQUEST, $_POST, $_GET и т.д. Чем дольше этот запрос не будет изменен другими Сниппетами, тем лучше. Во всяком случае, в основном AJAX оперирует $_GET или $_POST.

    - Извлечение Dynamic Paths – Dynamic Paths не существуют в MODx. Каждый Ресурс определенное время статичен. Path основывается на его положении в Структуре Ресурсов. Но если вы используете Path к Ресурсу и затем он подключает параметры как сегменты, мы может что-то получить. С того момента, как результат будет URLом без страницы, это будет приводить к (404) OnPageNotFound System Event – Страница не найдена. System Events обрабатываются через плагины!

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


Системные установки



Нам следует настроить уже существующие системные установки, и затем добавить парочку своих. Системные установки, которые мы будем использовать, будут делать Плагин более чутким к другим Плагинам (в частности, к нашим собственным). Вдобавок,  если использовать один из плагинов из другого моего пособия, то он будет особенно сильно снижать производительность.

(Важно!) AJAX Path сегмент

Эти настройки очень важны и плагин onGetRequestType использует их для определения, сделан ли AJAX Запрос. Везде, где вы увидите "/ajax/", используются эти настройки. Если их изменить, сегмент будет “/совсем другим/”.

Перейдите в MODx Manager в System Settings. Кликните на Create New Setting. Задайте опции как указано ниже:

•    Key: alias_ajax_page
•    Type: Text
•    Name: Alias: AJAX Request
•    Description: Поддельный URL path под альтернативным именем (alias) присоединится к Запросу URL Request, сообщающим MODx, что он обработан как AJAX Запрос (AJAX Request). Это позволяет любым Ресурсам быть AJAX Ресурсами. AJAX URLs имеют следующий вид: (resource)/ajax_alias/(parameters)
•    Value: ajax
Кликните Cохранить (Save) и дело сделано.

(Важно) Degrade Path сегмент

Эти настройки – вторые по важности, плагин onGetRequestType использует их для определения, запрашивается ли полная страница. Везде, где вы видите "/full/", используются эти настройки

Если их изменить, сегмент будет “/совсем другим/”.

Перейдите в MODx Manager в System Settings. Кликните на Create New Setting. Задайте опции как указано ниже:

•    Key: alias_full_page
•    Type: Text
•    Name: Alias: Force Full Page
•    Description: Ошибочный URL псевдоним, присоединяемый URL Request, сообщающий MODx, что нужно обрабатывать вместо полной страницы.
•    Value: full

Кликните Cохранить (Save) и дело сделано.

(Важно!) Флаг Degrade

Используется для связи onGetRequestType с onDegradeGracefully. Здесь устанавливаются параметры флага. Не следует менять их..

Перейдите в MODx Manager в System Settings. Кликните на Create New Setting. Задайте опции как указано ниже:
•    Key: key_degrade
•    Type: Text
•    Name: Degrade Placeholder
•    Description: Имя ключа глобальной переменной $_REQUEST, указывающей, что шаблон должен быть переключен. По умолчанию — 'forceFull'
•    Value: forceFull

Кликните Cохранить (Save) и дело сделано.

(Важно!) Шаблон снижения производительности

    Здесь произойдет связывание Шаблона с onDegradeGracefully плагином. Можете использовать любой HTML Skeleton, какой вы хотите. По умолчанию значение установлено как “Base”, но в действительности оно зависит от того, что из себя представляет универсальный шаблон. Внимание! По последним данным, некоторые версии MODx не поддерживают корректно Шаблоны в System Settings. Если Плагин не снижает производительность, просто измените это на Text и введите ID Шаблона.

Перейдите в MODx Manager в System Settings. Кликните на Create New Setting. Задайте опции как указано ниже:

•    Key: id_degrade_to
•    Type: Template
•    Name: Template: Degrade To
•    Description: Шаблон для интеллектуального снижения производительности, используется, когда требуется страница целиком для вызова AJAX.
•    Value: Base

Кликните Cохранить (Save) и дело сделано.

(Важно!) Метка для корректировки URL

Она используется во всех моих плагинах и позволяет AJAX Requests (Запросам) быть кросс-контекстными или основанными на шаблонах. Это обеспечивается тем, что все плагины, подключенные последовательно, получают реальный URL, а не поддельный, который мы запрашиваем, поэтому они могут работать корректно. Это можно изменить в любое время, подобно тому, как хакер пытается подменить $_REQUEST.

Перейдите в MODx Manager в System Settings. Кликните на Create New Setting. Задайте опции как указано ниже:

•    Key: key_url_request
•    Type: Text
•    Name: URL Placeholder
•    Description: Метка запрошенного URL глобальной переменной $_REQUEST.
•    Value: toURL

Кликните Cохранить (Save) и дело сделано.

(Важно!) Метка параметров

Она используется Сниппетами и только этим Плагином (пока). Она позволяет другим Плагинам / Сниппетам использовать Параметры, если они необходимы, без просмотра или изменения кода. Изменяйте это, если вас взломали или есть конфликт с другими плагинами.
Перейдите в MODx Manager в System Settings. Кликните на Create New Setting. Задайте опции как указано ниже:

•    Key: url_params_name
•    Type: Text
•    Name: URL Parameters Placeholder
•    Description: Имя массива в глобальной переменной $_REQUEST  для сохранения / извлечения URL Parameters (Параметров). Используется многими плагинами и сниппетами. Если вы изменяете его в соответствии с контекстом /пользователем, делайте осторожно. По умолчанию значение 'urlParams'.
•    Value: urlParams

Кликните Cохранить (Save) и дело сделано.


    Создание Framework



Framework состоит из 3 плагинов. Два запускаются по событию OnPageNotFound, когда URL не найден в MODx. Это событие особенно удобно для использования, т.к. позволяет перехватить сообщение об ошибке 404 и подменить его. Если подходящей замены нет, то остается 404 страница. Это делает Custom Aliasing мечтой. Третий плагин запускается, при загрузке любой страницы (даже не AJAX). Это выглядит просто как установка. На практике это выглядит в виде установки флажка для снижения производительности, если флажок установлен, то переключает Шаблон на один из выбранных вами Шаблонов. Давайте попробуем этот код!


Плагин: onGetRequestType



Как было описано выше, все наши вызовы AJAX всегда запускаются по событию OnPageNotFound. Вот парочка: а) дает нам что-то в качестве цели и б) добавляет новую проблему. Пока мы вручную обрабатываем события, нам не нужно автоконвертирование каждого ошибочного запроса на AJAX  странице. Этот Плагин считывает URL. Если он находит один из наших фальшивых псевдонимов, он отделяет настоящий URL от тех параметров, которые мы передаем. Это подобно тому, словно другой Плагин, зависящий от URL, сможет получить настоящий URL вместо неверной ссылки.
Создайте новый плагин. Назовите его onGetRequestType. Добавьте нижеприведенный код в плагин и сохраните.
 
<code><!--?php
// Get System Settings Получаем системные установки
     = --->getOption('alias_ajax_page', null, 'ajax');
    $fullAlias = $modx->getOption('alias_full_page', null, 'full');
    $argsName = $modx->getOption('url_params_name', null, 'urlParams');
    $keyDegrade = $modx->getOption('key_degrade', null, 'forceFull');
    $keyURL = $modx->getOption('key_url_request', null, 'toURL');
 
// Get the Request URL Получаем URL запроса
    $toURL = !empty($_REQUEST[$keyURL])
        ? $_REQUEST[$keyURL]
        : $_SERVER['REQUEST_URI'];
// Remove Parameters Удаляем GET  параметры
    $toURL = reset(explode('?', trim($toURL, '/')));
// Find AJAX Alias and Separate from Parameters Находим AJAX Alias и отделяем // от параметров
    $pieces = explode($ajaxAlias, trim($toURL, '/') . '/');
     
// Only proceed if Alias was found Обрабатывается только если Alias найден
    if (count($pieces) > 1)
    {//Flag as AJAX Alias Отмечено если  AJAX Alias
        $_REQUEST[$keyDegrade] = 'false';
    // Add Parameters to $_REQUEST global variable Добавление параметров в
// глобальную переменную $_REQUEST
        $_REQUEST[$argsName] = $pieces[1];
    // Set the path to search for Aliases Установка пути поиска для Aliases
        $_REQUEST[$keyURL] = '/'. $pieces[0] . '/';
    }
    else
    {// Find FULL Alias and Separate from Parameters Поиск полного Alias и //отделение от параметров
        $pieces = explode('/'.$fullAlias.'/', trim($toURL, '/') . '/');
    // Only proceed if Alias was found Обрабатывается только если найден  // Alias
        if (count($pieces) > 1)
        {//Flag for Template Switch Метка для переключения шаблона
            $_REQUEST[$keyDegrade] = 'true';
        // Add Parameters to $_REQUEST global variable Добавление параметров // в глобальную переменную $_REQUEST
            $_REQUEST[$argsName] = $pieces[1];
        // Set the path to search for Aliases Задание пути для поиска Aliases
            $_REQUEST[$keyURL] = '/'. $pieces[0] . '/';
        }
    }</code>

Перейдите на закладку System Events. Прокрутите страницу вниз и выберите 'OnPageNotFound'. Убедитесь, что установлен приоритет 3 (или выше).
Внимание! Если вы используете мои другие плагины, ознакомьтесь с OnCompatibility в конце пособия.

Экспромт: Вы будете уведомлены, что не  следует ничего изменять, что это не правильно. Введите ложный URL и ваша 404 страница появится корректно.


Плагин: onParseURLParams



Известно, что AJAX вызовы бесполезны, пока мы не акцептируем параметры. Это плагин получает обособленные параметры от предыдущего плагина и размещает их в массиве  $_REQUEST, поэтому они могут использоваться.

Создайте новый плагин. Назовите onParseURLParams. Введите нижеприведенный код и сохраните.
 
<code><!--?php
//Get the System Settings (if we haven't already...) Получение System Settings (если до их пор не получены)
 = !empty() ?  : --->getOption('url_params_name', null, 'urlParams');
     
// Only proceed if a previous plugin has set the URL Params Выполняется, если предыдущий плагин задал параметры URL
    if (!empty($_REQUEST[$argsName]))
    {//Split the list of Parameters
        $list = explode('/', trim($_REQUEST[$argsName], '/'));
    // Reset the REQUEST variable
        $_REQUEST[$argsname] = array();
    // Add each of the Params to the array
        $i = 0;
        foreach ($list as $key => $value)
        {   $_REQUEST[$argsName][$i] = strval($value);
            $i++;
        }
    }</code>



Перейдите на закладку System Events. Прокрутите страницу вниз и выберите 'OnPageNotFound'.Убедитесь, что установлен приоритет 4 (или выше). Сделайте так, чтобы код выполнялся после onGetRequestType. Внимание!! Если вы используете мои другие плагины, ознакомьтесь с OnCompatibility в конце пособия.


Плагин: onDegradeGracefully



Полностью соответствует названию. Если ссылка отправляет полнотекстовый запрос, возвращает всю страницу, переключая шаблон (временно).
Создайте новый плагин. Назовите onDegradeGracefully. Введите нижеприведенный код и сохраните.
 
<code><!--?php
//Get the System Settings (if we haven't already...) Получаем системные установки (если еще не получены)

     = !empty() ?  : --->getOption('key_degrade', null, 'forceFull');
    $idDegradeTo = !empty($idDegradeTo) ? $idDegradeTo : $modx->getOption('id_degrade_to', null, 1);
 
// Determine if we were told to switch Определяем, задано ли переключение
    $switch = $_REQUEST[$keyDegrade];
    if ($switch == 'true')
    {
        $modx->resource->set('template', $idDegradeTo);
    }</code>
Перейдите на закладку System Events. Прокрутите вниз и выберите 'OnLoadWebDocument'. Убедитесь, что установлен приоритет 1. Это обеспечит выполнение плагина перед любыми другими плагинами по одному и тому же событию.


Использование Framework



С этого момента жизнь становится легче. Переходим непосредственно к Framework. Если у вашего AJAX документа нет Шаблона, он будет возвращен независимо от Типа  Контента. Если Шаблон есть, будет произведен его парсинг. Если нужен доступ к параметрам, вы можете его дать с помощью любого Сниппета, используя нижеприведенный код.

Получение параметров URL

 


<code><!--?php
//Get the System Setting (needed only once per Resource) Получение System Setting (нужно только один раз для каждого Ресурса)

     = !empty() ?  : --->getOption('url_params_name', null, 'urlParams');
 
// Get an ordered Parameter Получение упорядоченного параметра
    $varName = $_REQUEST[$argsname][#]; // <-- Replace # with the segment index.
    // For example: The first Parameter would be 0; the second is 1, etc. Для примера: Первый параметр 0, второй 1 и т.д.</code>



Вызов сниппета



Всегда используйте некэшируемые вызовы. Удостоверьтесь, что контент динамический. Для совместимости добавьте? в конце, даже если не задаете никаких свойств.



<code>   [[!mySnippetName? ]]</code>



Это действительно просто! Давайте увидим это в действии!


Тестирование.


Установка: создать AJAX сниппет


Имя: testAJAXRequest:



<code><!--?php
//Get the System Setting (needed only once per Resource) Получение System Setting (нужно только один раз для каждого Ресурса)

     = !empty() ?  : --->getOption('url_params_name', null, 'urlParams');
 
// Get an ordered Parameter Получение упорядоченного параметра
    if (!empty($_REQUEST[$argsname][0]))
        $value = $_REQUEST[$argsname][0]; // <-- Замените # индексом сегмента.
    else
        $value = 'Nothing sent';
 
    $output = '</code>
'. $value. '
<code>';
 
    return $output;</code>
 
Установка: Создать Шаблон

Создайте шаблон для выполнения Сниппета. Назовите его «Partial HTML». Контент содержит одну строку кода:

   
<code> [ [*content]]</code>

Установка: Создать Ресурс

Создайте где-нибудь на сайте Ресурс. Установите Шаблон как Partial HTML. Установите ваши Alias любыми, только не 'ajax'. Задайте Container. Это имеет смысл, т.к. это группа документов, что означает другой контент, основанный на параметрах. Контент имеет одну строку кода:

   
<code> [ [!testAJAXRequest]]</code>


Тест 1: Просмотр ресурса

Кликните правой клавишей мыши на ресурсе  и выберите 'View Resource'. Это, конечно, неправильно, в результате чего вы получите небольшое сообщение. Но у вас есть прямая ссылка.

Тест 2: Просмотр ресурса

Перейдите в адресную строку в браузере. Просто добавьте '/ajax/' и что-нибудь еще в конце текущего адреса. Результат будет наподобие такого: domain.tld/path_to_resource/ajax/14. Нажмите Enter.

Теперь должен запуститься Сниппет и выдать результат. Ура. Вы получили базовые знания  URL.

Параметрические AJAX запросы и любые ваши страницы теперь AJAX-активированные или такие, какие Вы хотите.

Несколько заметок о динамических  URL ах и AJAX

Первое, никогда – никогда не используйте URLS с непроверенным пользовательским вводом, таким как SQL Query. Это для простых запросов с простым предоставлением информации (подобно ID родительскому ID или шаблонному ID). Основная идея заключается в следующем: Параметры URL для простых данных, подобно ID Ресурсов, которые не планируют часто менять. Они не для дополнительных аргументов, базирующихся на информации из форм. URL небезопасные. Всегда перепроверяйте, используя сниппет. Еще можете использовать GET, POST, PUT и DELETE. Делайте это для больших и непроверенных строковых данных. JSON хорошо подходит для обработки больших объемов информации. MODx может обрабатывать ACL (Access Control List, список контроля доступа) для Resource Groups. Но это подразумевает, что вы можете делать защищенную обработку более уязвимой информации (проверку прав доступа пользователя, контекст, и т.д.). Это также делается с помощью сниппетов.

Совместимость

Поддерживаются:

•    Любые ресурсыany, добавляющие псевдоним в конец URL.
•    Любые типы контента
•    Числа, символы, слова, имена файлов, дефис
•    Не выполняется url_decode. Вы должны сделать это самостоятельно.

Плагины, использующие OnPageNotFound (все)

Другие плагины, использующие OnPageNotFound, должны иметь приоритет 5 (или выше), в зависимости от плагина. Это позволяет другим плагинам использовать настройки и  переменные, заданные Плагинами, включая исправленные URL и параметры
Это совместимо со Статьями, которые используют действия на основе шаблонов (ссылка в моей подписи).

Подпишитесь на рассылку! Никакого спама, только обновления!!!

Комментарии (0)


    Услуги по MODX Revolution

    Посмотреть все услуги

    Техническая оптимизация сайта

    Подробнее & Заказать

    Создание сайта на MODX Revolution

    Подробнее & Заказать

    Перенос сайта на MODX Revolution

    Подробнее & Заказать

    Продвижение сайта на MODX

    Подробнее & Заказать