Экскурс как можно использовать vuejs в место extjs и не запариться.

Это не статься в стиле «я написал торт/тудушку/ещечтото на rea extjs и vue и вот что у меня получилось». Это просто инструкция как можно без особых усилий писать на чем-то стороннем (в моем случае vue).
(внимание) Так как на этом ресурсе сидят довольно опытные ребята, я не буду рассказывать все в подробностях, как поставить ноду + сопутствующее окружение, что такое modExtra, почему vue а не react/angular/свойвариант и т.д…
В общем погнали.
(шаг один) В принципе, в админке modx, можно писать компоненты на чем угодно. Но вот, что я предпринимал в случае с vue:
  1. Ставим modExtra от товарища Василия, производим необходимые настройки и запускаем билд domain.name/componentName/_build/build.php.
  2. Затем удаляем все наши extjs активы по адресу domain.name/componentName/assets/components/componentname/js/mgr. В ней у нас будет наш app.js
  3. Ставим vue cli 3 командой npm install -g @vue/cli или yarn global add @vue/cli от наших китайских товарищей.
В довесок я использовал axios в связке с vue-axios для запросов, так-же я собрал быстрое решение для работы с лексиконами (ну и скрола =)), + все это дело у меня крутиться на стандартном шаблоне vue cli. Можете собрать что-то свое, но на всякий пожарный я сделал прессет который ставит все необходимое за вас, по этому в консоли в папке с пректом, достаточно написать vue create --preset srsad/vue-modx-preset . и на этом все. (заодно нашел не задокументированное решение для прессетов, как можно загружать свои плагины прямо из гитхаба)

(шаг два) Нам нужно чтобы vue сборщик выгружал все данные по адресу domain.name/componentName/assets/components/componentname/js/mgr и эту задачку можно решить двумя способами:
  1. Запустив в папке с проектом терминал и следуя этой инструкции выполнить команду которая похожа на что-то подобное vue-cli-service build --mode development --dest assets/components/componentsname/js/mgr/dist --watch.
  2. Либо вместо всего этого написать vue ui и сделать все кнопочно-тыкачно. Честно говоря мне очень зашел интерфейс и я именно в таком режиме в последнее время работаю.
Если вы запустили 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, с которым можно будет сверить основные моменты. Но уже в следующем году =)
Всех с наступающим! Счастья, радости, улыбок и вообще всего самого клевого!
srs
srs
31 декабря 2018, 12:09
modx.pro
12
3 767
+19

Комментарии: 7

Степан Прищепенко
31 декабря 2018, 17:35
+2
Уффф я честно не предаствляю как можно с «полпинка» связать дерево процессы компоненты да и вообще оживить все менюшки, короче я что-то даже не понял что получилось в итоге, можно ли видос или объяснение, а что собственно это дало кроме использования vue в качестве админки в которой ничего нет, прошу не закидывать камнями, я просто не в теме vue еще. Да и конечно же с наступающем, всем чистого кода в новом году! )
    srs
    srs
    31 декабря 2018, 18:04
    +3
    Это не дало использование vue в качестве админки. Тут vue служит инструментом заменяющим extjs в создаваемом компоненте. Но в вы правы, как только новогодняя суета утрясется соберу что-то на скорую руку со скриншотами и кратким пояснением.
      Александр Мельник
      31 декабря 2018, 18:10
      +1
      Да, сделайте это пожалуйста. Потому как я тоже чувствую, что нет смысла вникать в extjs, а vue набирает обороты, хотя пока и остается для меня лишь словом из трех букв. С наступающим вас.
    Іван Клімчук
    02 января 2019, 14:05
    +2
    Идея последующих версий MODX — отказ от какого-либо фреймворка на строне клиента, но предоставление полноценного API для взаимодействия с системой. Это даст возможность развивать параллельно несколько админок, хотя и не без проблем. Нынешняя модель с единым интерфейсом как раз и хороша тем, что компоненты выглядят одинаоково и как правило, совместимы между версиями, зоопарк админок несомненно добавит хауса.
      srs
      srs
      02 января 2019, 15:54
      +5
      Былоб очень интересно ознакомиться с этой информацией в более развернутом виде, в ближайшем дайджесте или подкасте =)
      Видимо я очень плохо донес замысел, я не подразумевал замену админики. Я говорил только о смене extjs, во вновь создаваемых компонентах и в случае с vue, не вижу никаких препятствий в совместимости. Ему нужно только корректный json принимать и все, дальше он все рисует как надо. Касаемо стилей, полностью с вами согласен по этому и предлагал сделать набор стандартных стилей, чтоб все было максимально одинаково. Например так выглядел компонент на vue из второй статьи.

      Изначально даже можно не понять что это не родной extjs. Ну и если в дальнейшем и так будет отказ от конкретного фрейморка, то на мой взгляд это только должно подталкивать людей использовать стороннее и более универсально.
      Александр
      03 января 2019, 23:11
      0
      А всё же, можете вкратце пояснить, почему vue, а не react/angular/свойвариант и т.д.?
        srs
        srs
        04 января 2019, 11:32
        +5
        Не ангуляр, потому что на мой взгяд у него не лучшие времена, меньше готовых решений, менее активное сообщество, среди основных конкурентов менее активное развитие, плюс порог вхождения у новичков выше. Не реакт, потому что, тут играет роль индивидуальное предпочтение, мне не нравиться повсеместное использование jsx. Я не против синтаксического сахара, но на мой взгляд, это недо xml/html/js… ну т.е. не рыба не мясо. В целом реакт не плох, хотя опыта работы с ним у меня очень мало, меньше чем с ангуляром или vue.
        Почему vue, наиболее значимую роль сигала документация и мой предыдущий опыт использования ангуляра. Так же мне понравился подход vueloader`а, где идет отдельно template, отдельно script и отдельно style. Очень активное сообщество, кстати я еще не разу не натыкался на сторонние разговоры (погода, политика, дошираки, что угодно) в телеграм чате vue, всегда все по делу. Вообще vue это штука которая по надергало много интересных приемов у аналогов и вылилось во что-то «индивидуальное». Если в вкратце, то как-то так)
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        7