Экскурс как можно использовать vuejs в место extjs и не запариться.
Это не статься в стиле «я написал торт/тудушку/ещечтото на rea extjs и vue и вот что у меня получилось». Это просто инструкция как можно без особых усилий писать на чем-то стороннем (в моем случае vue).
(внимание) Так как на этом ресурсе сидят довольно опытные ребята, я не буду рассказывать все в подробностях, как поставить ноду + сопутствующее окружение, что такое modExtra, почему vue а не react/angular/свойвариант и т.д…
В общем погнали.
(шаг один) В принципе, в админке modx, можно писать компоненты на чем угодно. Но вот, что я предпринимал в случае с vue:
(шаг два) Нам нужно чтобы vue сборщик выгружал все данные по адресу domain.name/componentName/assets/components/componentname/js/mgr и эту задачку можно решить двумя способами:
выбрать из списка задач build, нажать на “параметры” и произвести настройки:
(шаг три, завершающий) Теперь нам нужно научить vue работать с лексиконами и выполнять запросы, а modx их понимать. Для этого идем в domain.name/componentName/core/components/componentname/controllers/home.class.php, в методе loadCustomCssJs удаляем все ссылки на extjs файлы а вместо них пишем что-то вроде этого:
Ну тут все совсем просто, в connector_url мы передаем коннектор, в modAuth токен пользователя для запросов и соответственно в lang кидаем лексиконы (как это сделать правильно я не придумал по этому пока так). Так же копируем id нашего компонента из метода getTemplateFile(), пусть будет awesome-panel-home-div.
Теперь идем папку src в корне проекта, открываем main.js и подключаем все необходимые компоненты, в нашем случае:
По завершению проекта необходимо будет выполнить build в режиме production.
(можно сипнуть) Кто-то скажет «ты просто не шаришь в extjs» и будет прав, но как-то не очень хочется продолжать копаться в трупе. Давайте будем честны сами с собой, extjs в той версии которой он есть в MODX, уже давно мертв. По этому, почемуб не начать плавную миграцию на что-то стороннее. Я думаю что если сделать аналог modExtra на базе того-же react`а или vue, то начнут появляться новые компоненты именно на альтернативе. Таким образом можно будет более или менее рулить процессом того стека технологий который будет использоваться в modx в будущем. Из минусов можно отметить то, что скорее всего выглядеть все компоненты будут по разному, отсюда интерфейс в виде попугая. Но как вариант можно накидать стандартный набор стилей для грида, инпутов, модалок и т.д… Вообще изначально тут были прописаны пункты с явной агитацией и пропагандой в пользу использования сторонних решений и начала плавного ухода от extjs. Но перечитав, я понял, что не стоит разводить холивар под новый год.
p.s. Если вам показалось все довольно абстрактным, то я могу запилить минимальный пример и выгрузить на github или bitbucket, с которым можно будет сверить основные моменты. Но уже в следующем году =)
Всех с наступающим! Счастья, радости, улыбок и вообще всего самого клевого!
(внимание) Так как на этом ресурсе сидят довольно опытные ребята, я не буду рассказывать все в подробностях, как поставить ноду + сопутствующее окружение, что такое modExtra, почему vue а не react/angular/свойвариант и т.д…
В общем погнали.
- Ставим modExtra от товарища Василия, производим необходимые настройки и запускаем билд domain.name/componentName/_build/build.php.
- Затем удаляем все наши extjs активы по адресу domain.name/componentName/assets/components/componentname/js/mgr. В ней у нас будет наш app.js
- Ставим vue cli 3 командой npm install -g @vue/cli или yarn global add @vue/cli от наших китайских товарищей.
(шаг два) Нам нужно чтобы vue сборщик выгружал все данные по адресу domain.name/componentName/assets/components/componentname/js/mgr и эту задачку можно решить двумя способами:
- Запустив в папке с проектом терминал и следуя этой инструкции выполнить команду которая похожа на что-то подобное vue-cli-service build --mode development --dest assets/components/componentsname/js/mgr/dist --watch.
- Либо вместо всего этого написать vue ui и сделать все кнопочно-тыкачно. Честно говоря мне очень зашел интерфейс и я именно в таком режиме в последнее время работаю.
выбрать из списка задач build, нажать на “параметры” и произвести настройки:
- режим среды => development
- результирующая директория => assets/components/componentsname/js/mgr/dist
- делаем активным поле “следить за изменениями”
- сохраняем и нажимает запустить
(шаг три, завершающий) Теперь нам нужно научить vue работать с лексиконами и выполнять запросы, а modx их понимать. Для этого идем в domain.name/componentName/core/components/componentname/controllers/home.class.php, в методе loadCustomCssJs удаляем все ссылки на extjs файлы а вместо них пишем что-то вроде этого:
public function loadCustomCssJs()
{
$this->addCss(MODX_BASE_PATH . .'componentName/assets/components/componentname/css/mgr/main.css');
$this->addJavascript(MODX_BASE_PATH . .'componentName/assets/components/componentname/js/mgr/dist/app.js');
//---
$this->addHtml('<script type="text/javascript">
var componentName= {
connector_url: "' . $this->componentName->config['connectorUrl'] . '",
modAuth: "' . $this->modx->user->getUserToken($this->modx->context->get('key')) . '",
lang: ' . json_encode($this->modx->lexicon->fetch()) . '
};
</script>');
}
Ну тут все совсем просто, в connector_url мы передаем коннектор, в modAuth токен пользователя для запросов и соответственно в lang кидаем лексиконы (как это сделать правильно я не придумал по этому пока так). Так же копируем id нашего компонента из метода getTemplateFile(), пусть будет awesome-panel-home-div.
Теперь идем папку src в корне проекта, открываем main.js и подключаем все необходимые компоненты, в нашем случае:
import axios from 'axios'
import VueAxios from 'vue-axios'
import vueModx from 'vuemodx'
//засовываем вызов vue в window.onload чтоб дождаться пока отрисуется наш div
window.onload = function() {
Vue.use(VueAxios, axios)
Vue.use(vueModx, {
lexicon: componentName.lang, // передаем наш словарик
appId: 'awesome-panel-home-div' //id div`a в котором отрисовывается наш компонент, он будет следить за его высотой и при необходимости добавлять скролл
})
Vue.prototype.$httpConfig = {headers: {'modAuth': componentName.modAuth}}; // кидаем modAuth в заголовок axios
new Vue({
render: h => h(App),
}).$mount('#awesome-panel-home-div');
};
Так-же не забываем изменить id в фале App.vue. На этом все, теперь можно использовать все возможности vue.По завершению проекта необходимо будет выполнить build в режиме production.
(можно сипнуть) Кто-то скажет «ты просто не шаришь в extjs» и будет прав, но как-то не очень хочется продолжать копаться в трупе. Давайте будем честны сами с собой, extjs в той версии которой он есть в MODX, уже давно мертв. По этому, почемуб не начать плавную миграцию на что-то стороннее. Я думаю что если сделать аналог modExtra на базе того-же react`а или vue, то начнут появляться новые компоненты именно на альтернативе. Таким образом можно будет более или менее рулить процессом того стека технологий который будет использоваться в modx в будущем. Из минусов можно отметить то, что скорее всего выглядеть все компоненты будут по разному, отсюда интерфейс в виде попугая. Но как вариант можно накидать стандартный набор стилей для грида, инпутов, модалок и т.д… Вообще изначально тут были прописаны пункты с явной агитацией и пропагандой в пользу использования сторонних решений и начала плавного ухода от extjs. Но перечитав, я понял, что не стоит разводить холивар под новый год.
p.s. Если вам показалось все довольно абстрактным, то я могу запилить минимальный пример и выгрузить на github или bitbucket, с которым можно будет сверить основные моменты. Но уже в следующем году =)
Всех с наступающим! Счастья, радости, улыбок и вообще всего самого клевого!
Комментарии: 7
Уффф я честно не предаствляю как можно с «полпинка» связать дерево процессы компоненты да и вообще оживить все менюшки, короче я что-то даже не понял что получилось в итоге, можно ли видос или объяснение, а что собственно это дало кроме использования vue в качестве админки в которой ничего нет, прошу не закидывать камнями, я просто не в теме vue еще. Да и конечно же с наступающем, всем чистого кода в новом году! )
Это не дало использование vue в качестве админки. Тут vue служит инструментом заменяющим extjs в создаваемом компоненте. Но в вы правы, как только новогодняя суета утрясется соберу что-то на скорую руку со скриншотами и кратким пояснением.
Да, сделайте это пожалуйста. Потому как я тоже чувствую, что нет смысла вникать в extjs, а vue набирает обороты, хотя пока и остается для меня лишь словом из трех букв. С наступающим вас.
Идея последующих версий MODX — отказ от какого-либо фреймворка на строне клиента, но предоставление полноценного API для взаимодействия с системой. Это даст возможность развивать параллельно несколько админок, хотя и не без проблем. Нынешняя модель с единым интерфейсом как раз и хороша тем, что компоненты выглядят одинаоково и как правило, совместимы между версиями, зоопарк админок несомненно добавит хауса.
Былоб очень интересно ознакомиться с этой информацией в более развернутом виде, в ближайшем дайджесте или подкасте =)
Видимо я очень плохо донес замысел, я не подразумевал замену админики. Я говорил только о смене extjs, во вновь создаваемых компонентах и в случае с vue, не вижу никаких препятствий в совместимости. Ему нужно только корректный json принимать и все, дальше он все рисует как надо. Касаемо стилей, полностью с вами согласен по этому и предлагал сделать набор стандартных стилей, чтоб все было максимально одинаково. Например так выглядел компонент на vue из второй статьи.
Изначально даже можно не понять что это не родной extjs. Ну и если в дальнейшем и так будет отказ от конкретного фрейморка, то на мой взгляд это только должно подталкивать людей использовать стороннее и более универсально.
Видимо я очень плохо донес замысел, я не подразумевал замену админики. Я говорил только о смене extjs, во вновь создаваемых компонентах и в случае с vue, не вижу никаких препятствий в совместимости. Ему нужно только корректный json принимать и все, дальше он все рисует как надо. Касаемо стилей, полностью с вами согласен по этому и предлагал сделать набор стандартных стилей, чтоб все было максимально одинаково. Например так выглядел компонент на vue из второй статьи.
Изначально даже можно не понять что это не родной extjs. Ну и если в дальнейшем и так будет отказ от конкретного фрейморка, то на мой взгляд это только должно подталкивать людей использовать стороннее и более универсально.
А всё же, можете вкратце пояснить, почему vue, а не react/angular/свойвариант и т.д.?
Не ангуляр, потому что на мой взгяд у него не лучшие времена, меньше готовых решений, менее активное сообщество, среди основных конкурентов менее активное развитие, плюс порог вхождения у новичков выше. Не реакт, потому что, тут играет роль индивидуальное предпочтение, мне не нравиться повсеместное использование jsx. Я не против синтаксического сахара, но на мой взгляд, это недо xml/html/js… ну т.е. не рыба не мясо. В целом реакт не плох, хотя опыта работы с ним у меня очень мало, меньше чем с ангуляром или vue.
Почему vue, наиболее значимую роль сигала документация и мой предыдущий опыт использования ангуляра. Так же мне понравился подход vueloader`а, где идет отдельно template, отдельно script и отдельно style. Очень активное сообщество, кстати я еще не разу не натыкался на сторонние разговоры (погода, политика, дошираки, что угодно) в телеграм чате vue, всегда все по делу. Вообще vue это штука которая по надергало много интересных приемов у аналогов и вылилось во что-то «индивидуальное». Если в вкратце, то как-то так)
Почему vue, наиболее значимую роль сигала документация и мой предыдущий опыт использования ангуляра. Так же мне понравился подход vueloader`а, где идет отдельно template, отдельно script и отдельно style. Очень активное сообщество, кстати я еще не разу не натыкался на сторонние разговоры (погода, политика, дошираки, что угодно) в телеграм чате vue, всегда все по делу. Вообще vue это штука которая по надергало много интересных приемов у аналогов и вылилось во что-то «индивидуальное». Если в вкратце, то как-то так)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.