Разработка компонента без злосчастного ExtJS
Привет всем.
Во время выступления Steffan Blockx (Building a CMP without ExtJS) в этом году на митапе MODX AMSTERDAM я вдоволь насмеялся, потому, что для меня тема и содержание его выступления были не содержательными. Он 45 мин. говорил, что компонент для MODX можно написать и без ExtJS. Но как же я ошибался по поводу очевидности его слов. Для кого-то — да, а для некоторых оказывается, что не совсем.
Несколько причин очевидности:
Это была первая причина, а вторая поинтереснее. Как же устаешь от нытья в чате телеграм по поводу ExtJS. Каждый клянется, что он точно не является некрофилом и ему противно вступать в половые отношения с «мертвым» MODX.
Третья причина банальная, несколько людей попросили показать.
_________________________________________________________
Итак, для быстрого старта можно взять modExtra, удаляем все js файлы, создаем файл test.js по пути assets/components/modextra/js/mgr/ с таким содержанием:
Теперь открываем файл core/components/modextra/controllers/home.class.php 67-ую строку заменяем на:
Заодно удалим вызовы метода addJavascript с 56 по 62 строку и добавляем:
Запускаем build, заходим в панели управления на страницу компонента и заглядываем в консоль браузера, там будет подарок. Естественно, предварительно нужно создать пару записей в БД чтобы получить их.
Пара слов об этих строчках:
В js объекте MODx в свойстве siteId хранится результат метода getUserToken пользователя. Можно поступить и другим способом:
Либо самостоятельно в классе контроллера его можно получить след. образом:
Еще один не очевидный факт для меня, это то что процессор modObjectGetListProcessor в запросе ждёт не offset а start, т.е. при пагинации записей нужно отправлять именно start.
Хотел побольше примеров написать в этой статье, но случайно получился целый компонент modNotes
Репозиторий на github.com, вы можете ознакомится с ним.
Если он нужен будет кому-то, то отпишитесь в комментариях чтобы я его выложил на modstore.pro. Спасибо за внимание.
P.S. Прошу без бомбежки в комментариях, я прекрасно осознаю недостатки ExtJS который имплементирован в MODX.
☕ Угостить чашкой кофе
Во время выступления Steffan Blockx (Building a CMP without ExtJS) в этом году на митапе MODX AMSTERDAM я вдоволь насмеялся, потому, что для меня тема и содержание его выступления были не содержательными. Он 45 мин. говорил, что компонент для MODX можно написать и без ExtJS. Но как же я ошибался по поводу очевидности его слов. Для кого-то — да, а для некоторых оказывается, что не совсем.
Несколько причин очевидности:
- ExtJS всё еще JS и обходится без магии работая с процессорами
- На данный момент есть много компонентов (барабанная дробь) которые работают на чистом js или используя библиотеки. Shopkeeper3 (Angular), imgArea (частично jQuery), ModxMinify (jQuery)
- Об использовании vue писали и раньше
Это была первая причина, а вторая поинтереснее. Как же устаешь от нытья в чате телеграм по поводу ExtJS. Каждый клянется, что он точно не является некрофилом и ему противно вступать в половые отношения с «мертвым» MODX.
Третья причина банальная, несколько людей попросили показать.
Итак, для быстрого старта можно взять modExtra, удаляем все js файлы, создаем файл test.js по пути assets/components/modextra/js/mgr/ с таким содержанием:
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();
}
Теперь открываем файл core/components/modextra/controllers/home.class.php 67-ую строку заменяем на:
Ext.onReady(function() {modExtra.init();}); // Это единственная строка которая хоть как-то относится к ExtJS
Заодно удалим вызовы метода addJavascript с 56 по 62 строку и добавляем:
$this->addJavascript($this->modExtra->config['jsUrl'] . 'mgr/test.js');
Запускаем build, заходим в панели управления на страницу компонента и заглядываем в консоль браузера, там будет подарок. Естественно, предварительно нужно создать пару записей в БД чтобы получить их.
Пара слов об этих строчках:
xhr.setRequestHeader('Powered-By', 'MODx');
xhr.setRequestHeader('modAuth', MODx.siteId);
Если в нашем запросе не будет этих заголовков, то мы ничего из коннектора не сможем получить.В js объекте MODx в свойстве siteId хранится результат метода getUserToken пользователя. Можно поступить и другим способом:
xhr.open('GET', modExtra.config.connector_url + '?action=mgr/item/getlist&HTTP_MODAUTH=' + MODx.siteId);
Либо самостоятельно в классе контроллера его можно получить след. образом:
$this->addHtml('<script type="text/javascript">
modExtra.config.http_modauth= "' . $this->modx->user->getUserToken($this->modx->context->get('key')) . '";
</script>');
и потом:xhr.open('GET', modExtra.config.connector_url + '?action=mgr/item/getlist&HTTP_MODAUTH=' + modExtra.config.http_modauth);
Еще один не очевидный факт для меня, это то что процессор modObjectGetListProcessor в запросе ждёт не offset а start, т.е. при пагинации записей нужно отправлять именно start.
Итог
Хотел побольше примеров написать в этой статье, но случайно получился целый компонент modNotes
Репозиторий на github.com, вы можете ознакомится с ним.
Если он нужен будет кому-то, то отпишитесь в комментариях чтобы я его выложил на modstore.pro. Спасибо за внимание.
P.S. Прошу без бомбежки в комментариях, я прекрасно осознаю недостатки ExtJS который имплементирован в MODX.
☕ Угостить чашкой кофе
Комментарии: 13
Интересная статья, спасибо?
Действительно нужная информация. Спасибо!
А что, так можно было?))
Спасибо большое, надо пробовать!
Спасибо большое, надо пробовать!
Ага)
А еще его можно будет развить и т.к. у меня уже времени нет предлагаю тем у кого есть желание и это самое время его допилить, создал несколько issues
Если кто-то отправит PR то я и сообщество (кому нужен будет этот компонент) только будем рады этому. Спасибо всем за обратную связь!
А еще его можно будет развить и т.к. у меня уже времени нет предлагаю тем у кого есть желание и это самое время его допилить, создал несколько issues
Если кто-то отправит PR то я и сообщество (кому нужен будет этот компонент) только будем рады этому. Спасибо всем за обратную связь!
Можно и fetch'ем забирать данные
fetch(modExtra.config.connector_url,
{
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'modAuth': MODx.siteId
},
credentials: 'include',
body: `action=mgr/item/getlis&HTTP_MODAUTH=${MODx.siteId}`
})
Можно при желании и через axios сделать. Вопрос то не в технологии, а в принципе работы, как я понял.
Для начала стоит задача показать что и так можно, и не extJS единым может MODX жить
Для начала стоит задача показать что и так можно, и не extJS единым может MODX жить
Если задача такая, то внутри Ext можно Vue использовать.
Например, требуется дополнительный таб в ресурсах, а внутри таба уже будем Vue использовать.
Например, требуется дополнительный таб в ресурсах, а внутри таба уже будем Vue использовать.
Ext.ComponentMgr.onAvailable("modx-resource-tabs", function() {
let tabs = this;
tabs.on("beforerender", () => {
tabs.add({
title: _('tab-name'),
id: "tab-id",
layout: 'form',
labelAlign: 'top',
items: [{
html: '<div id="for-vue-wrapper"><vue-component></vue-component></div>',
listeners: {
afterrender() {
new Vue({el: '#for-vue-wrapper'});
}
}
}]
});
});
});
Было бы круто, если бы такой компонент появился в modstore
поддерживаю добавление в modstore)
от себя один момент — может расширенную заметку или внутренний скролл, вижу его использование в качестве карточек для клиента, что где искать в админке
от себя один момент — может расширенную заметку или внутренний скролл, вижу его использование в качестве карточек для клиента, что где искать в админке
Выложу обязательно в таком случае, сразу после того как несколько issue будут реализованы мной или кем-то из сообщества, а то неправильно будет выкладывать без определенного функционала. Список недостающего функционала можно увидеть тут, работы немного но у меня и вправду времени критически не хватает
Одно замечание. Префикс «mod» зарезервирован для системного функционала. А твой компонент явно никак не связан с ядром. Лучше не нарушать правила!
@Сергей Шлоков Как всегда ёмко и по делу, спасибо, я тебя понял)
Благодарю. Очень полезно!
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.