Пишем простым языком о сложных технических процессах

Разработка компонента для MODX Revolution без использования Ext JS

  • Разработка MODX
  • CMP

Предисловие ​

MODX Revolution использует JavaScript библиотеку Ext JS версии 3.4 для построения интерфейса панели управления (ПУ). Это привело к тому, что разработчики тех компонентов для которых необходим CMP (Custom Manager Pages), т.е. отдельные страницы для управления и предоставления функционала или для расширения существующих страниц и функционала, также используют выше названную библиотеку. У такой реализации есть несколько преимуществ:

  • Малый размер самого компонента, т.к. нет необходимости подключать сторонние фреймворки и библиотеки
  • Легкая читаемость кода компонентов. Если у вас есть знания библиотеки, то вы достаточно быстро можете разобраться в работе того или иного компонента и в случае необходимости изменять или расширять их функционал
  • Избежание конфликтов между фреймворками. В теории, если разные компоненты на одной странице ПУ MODX загрузять несколько библиотек, фреймворков и даже несколько версий одной и той же библиотеки, то конфликтов не избежать

Это не все преимущества, поэтому перейдем к недостаткам, точнее к одному конкретному, из уст разработчиков или тех кто хочет разработать компонент для MODX он звучит так: "Ext JS 3.4 устарел или я не хочу его использовать". Итак, я услышал и в этой статье покажу как можно разработать фронт компонента без Ext JS, вместо него будем использовать Vanilla JS.

Начало ​

Для примера я возьму за основу пакет modExtra, после того как мы настроем его как нам нужно (в документации на странице репозитория подробно описано как это сделать) нам необходимо удалить все js файлы и создать файл test.js в папке assets/components/modextra/js/mgr/, а содержимое будет такое:

js
modExtra.init = function() {
  var xhr = new XMLHttpRequest();
  xhr.open('GET', modExtra.config.connector_url + '?action=mgr/item/getlist');
  xhr.setRequestHeader('Powered-By', 'MODx');
  xhr.setRequestHeader('modAuth', MODx.siteId);
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
      try {
          var data = JSON.parse(xhr.responseText);
          console.log(data);
      } catch(err) {
          console.log(err.message + ' in ' + xhr.responseText);
          return;
      }
    }
  }
  xhr.send();
}

Ну или используя последние нововведения в ECMAScript:

js
modExtra.init = () => {
  fetch(modExtra.config.connector_url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
      'modAuth': MODx.siteId
    },
    credentials: 'include',
    body: `action=mgr/item/getlist&HTTP_MODAUTH=${MODx.siteId}`
  })
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));
}

Далее нам нужно внести некоторые правки в файл core/components/modextra/controllers/home.class.php, нас интересует строка 67 и его нужно заменить на следующую:

js
Ext.onReady(function() {modExtra.init();});

И в этом же файле в методе loadCustomCssJs нужно удалить все вызовы метода addJavascript и добавит загрузку нашего файла:

php
$this->addJavascript($this->modExtra->config['jsUrl'] . 'mgr/test.js');

Собираем наш пакет и открываем в браузере страницу нашего компонента и в консоли браузера мы увидим наши записи, которые нужно будет создать предварительно в БД.

Как это работает ​

Почти все компоненты в MODX работают одинаково, краткое описание:

  • Отправляется запрос в коннектор c параметрами. Обязательным является параметр action в котором относительный путь до нужного процессора
  • Коннектор запускает процессор который делает запросы в БД, предварительно совершив много полезных и нужных действий, например, проверяет права пользователя на совершаемое действие
  • Коннектор возвращает данные

Заключение ​

Разработать компонент без использования Ext JS для MODX Revolution можно. Для некоторых этот факт был известен хотя бы потому что уже существуют такие компоненты, которые используют Angular, jQuery и др. фреймворки и библиотеки, например такие как: modSizeControl, modxNotes и TVTable, две были разработаны, а последний был модифицирован и поддерживается нами.