Всего 123 609 комментариев

Алексей Суслов
14 ноября 2023, 01:36
0
Большое спасибо за ваш вклад в развитие экосистемы модикс!
Алексей Соин
13 ноября 2023, 22:20
+6
Чтобы редактировать файлы на удалённом сервере не нужно придумывать синхронизацию по сохранению, в vscode есть официальное расширение Remote-SSH. Прочитать как всё настроить можно тут. На сервере нужен только nodejs, например, у хостинга бегет можно без проблем так править файлы на сервере, у них в доке есть инструкция по настройке.

Также насчёт настройки проекта, если над сайтом работает команда разработчиков, то хорошим подходом будет чтобы настройки среды были у всех одинаковые. Для этого в корне проекта, куда подключаемся(либо открываем папку через vscode) нужно добавить папку .vscode в которую положить несколько json файлов:

settings.json
{
  "files.associations": {
    "*.tpl": "fenom"
  }
}

extensions.json
{
  "recommendations": [
    "EditorConfig.EditorConfig",
    "gulomov.vscode-modx",
  ]
}

Файл settings.json задаёт настройки среды, сюда можно указывает любые параметры vscode, д данном примере указываем использование fenom для tpl файлов.

Файл extensions.json нужен для указания рекомендуемых расширений, которые нужно поставить для текущего проекта. В данном примере указываем, что нужно установить расширение editorconfig и расширение для modx.

Также пробегусь кратко по нескольким расширениям которые я часто использую, но редко встречающихся в таких подборках:

Error Lens — расширение для более информативной подсветки предупреждений и ошибок в коде.

File Utils — добавляет в контекстное меню дополнительные возможности для работы с файлами.

Path Intellisense — подсказка путей для файлов.

Thunder Client — postman на минималках.

Turbo Console Log — быстрое добавление console.log в коде.

PHP Tools — отличный пакет при работе с php. Подсказывает методы, классы, ошибки в коде и т.д.
Fi1osof
13 ноября 2023, 19:15
+2
Ух, где же Вы, Николай Ланец, вас в этом обсуждении очень не хватает :)
Честно сказать, неочень хочется обсуждать все это, потому что верно сказано: сколько людей, столько и мнений. И выше человек тоже реальные примеры приводит с тем, как все это быстро меняется, и я во многом согласен. Но я бы сказал иначе: все это совсременное не только лишь для всех, а точнее для тех, у кого очень много денег, потому что маркетинг требует и делать это надо, но все это сложно и как правило команда нужна. Я работаю в таком проекте, и да, все сложно, и на все это есть деньги. А не делать это нельзя, потому что «мы так хотим». Но могу точно сказать: все то, что мы делаем, на старых технологиях это просто не сделать (я бы именно сказал, что никак). Так что мы в той точке развития, когда назад уже не пойти и остается только ждать когда все это устаканится и будут выработаны best practices.
Fi1osof
13 ноября 2023, 19:11
+2
Да, такой способ работает :)
Дима Касаткин
13 ноября 2023, 18:55
0
Всем привет! Я пока не осилил всех лонгрид-комментов в этом топике, но точно знаю, что @Fi1osof лучше вот так призвать, более технологично, и может даже сработать :)
Дима Касаткин
13 ноября 2023, 16:55
1
+3
Пользуясь случаем, если у кого есть под рукой, кроме супер плагина из топика, какие ещё плагины надо поставить в VSC для удобной работы с MODX.

Необходимый минимум функций вот такой:
• Автозагрузки на сервер (SFTP) по CTRL+S (желательно без хранения учетных данных от удаленного сервера в JSON-файле рядом с исходниками)
• Перехода к объявлению JS/PHP-функций по CTRL+click
• Сборки CSS из LESS/SCSS исходников, но без бандлеров (как file watchers в phpstorm) и мудреных JSON-конфигов.

Просто года два назад такой простой набор не получилось собрать для VSCode и мне пришлось его опустить. Но я вижу, что всё меняется, и с тех пор VSC стал настолько лучше, что я рискнул заменить им (и пока не пожалел) notepad++ для открытия одиночных файлов (которые вне проектов), которым пользовался много лет (правда зарешал дизайн, а не функционал, но всё таки). Но как проектным редактором, мне осадочек от предыдущего подхода пока не наёт пользоваться.

Посоветуйте джентельменский набор модыксера (или модэксера?) для VSC плиз!
Дима Касаткин
13 ноября 2023, 16:48
+5
Впечатляющая работа! Было бы здорово такое же, для PhpStorm / WebStorm, но ради такого возможно стоит дать VSCode второй шанс. Теперь есть причина, по которой VSCode может оказаться удобнее PhpStorm для разработки под MODX, и это прекрасно!

Вообще Developer experience (DX) в MODX и раньше был очень неплохим. Кто касается других систем, очень меня сейчас поймут. Один только Ace, который поддерживает @Иван Бочкарев чего стоит. Если править что-то быстро из админки, и связка modDevTools + Ace = просто класс!

А если и если основную разработку чаще ведут в файлах, под git-ом, и тут уже связка StaticElementsLive и новый VSCode IntelliSense for MODX будет отличным решением!

А для тех, кто собирает пакеты (modx packages), и особенно если их часто обновляет, поддерживая более одного modx-пакета постоянно, также может пригодиться git-модуль с GUI: modx-build-environment-gui

Вообще, с выходом этого плагина для весь DX при работе с файлами в MODX переходит на другой уровень, на голову выше! Больше cпасибо @Баха Волков !
Кирилл
13 ноября 2023, 14:26
0
Вот мое решение, может сразу упросит поиск по поводу datetime
Данные в БД храню в integer формате в unixtimestamp
Мне важно получить дату до какого времени оплачен доступ у юзера, потому условно дата 01/01/2023, то сохраняю 01/01/2023 23:59:59 (GMT+0000)
Ну и соответственно потом показываю по разному данную дату (в подписи к полю — в привычном порядке для СНГ — день/месяц/год), а в самом поле, как по умолчанию месяц/день/год.
И да, для сохранения заюзал еще одно системное событие OnBeforeUserFormSave

<?php
/* userFields */
switch ($modx->event->name) {
    case "OnMODXInit":
        $map = array(
            'modUserProfile' => array(
                'fields' => array(
                    'surname' => '',
                    'patronymic' => '',
                    'paid' => '',
                ),
                'fieldMeta' => array(
                    'surname' => array(
                        'dbtype' => 'varchar',
                        'precision' => '100',
                        'phptype' => 'string',
                        'null' => false,
                        'default' => '',
                    ),
                    'patronymic' => array(
                        'dbtype' => 'varchar',
                        'precision' => '100',
                        'phptype' => 'string',
                        'null' => false,
                        'default' => '',
                    ),
                    'paid' => array(
                        'dbtype' => 'int',
                        'precision' => '10',
                        'phptype' => 'integer',
                        'null' => true,
                        'default' => null,
                    ),
                ),
            ),
        );

        foreach ($map as $class => $data) {
            $modx->loadClass($class);
            foreach ($data as $tmp => $fields) {
                if ($tmp == 'fields') {
                    foreach ($fields as $field => $value) {
                        foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                            if (isset($data[$key][$field])) {
                                $modx->map[$class][$key][$field] = $data[$key][$field];
                            }
                        }
                    }
                } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                    foreach ($fields as $alias => $relation) {
                        if (!isset($modx->map[$class][$tmp][$alias])) {
                            $modx->map[$class][$tmp][$alias] = $relation;
                        }
                    }
                }
            }
        }

        break;

    case "OnUserFormPrerender":
        if (!isset($user) || $user->get('id') < 1) {
            return;
        }

        if (!$modx->getCount('modPlugin', array('name' => 'AjaxManager', 'disabled' => false))) {
            $data['surname'] = htmlspecialchars($user->Profile->surname);
            $data['patronymic'] = htmlspecialchars($user->Profile->patronymic);
            $data['paid'] = date('m/d/Y', htmlspecialchars($user->Profile->paid));
            $dateRus = date('d.m.Y', htmlspecialchars($user->Profile->paid));

            $modx->controller->addHtml("
                <script type='text/javascript'>
                    Ext.ComponentMgr.onAvailable('modx-user-tabs', function() {
                        this.on('beforerender', function() {
                            var leftCol = this.items.items[0].items.items[0].items.items[0];
                            var rightCol = this.items.items[0].items.items[0].items.items[1];

                            leftCol.items.insert(4, 'modx-user-surname', new Ext.form.TextField({
                                id: 'modx-user-surname',
                                name: 'surname',
                                fieldLabel: 'Фамилия',
                                xtype: 'textfield',
                                anchor: '100%',
                                maxLength: 255,
                                value: '{$data['surname']}',
                            }));

                            leftCol.items.insert(5, 'modx-user-patronymic', new Ext.form.TextField({
                                id: 'modx-user-patronymic',
                                name: 'patronymic',
                                fieldLabel: 'Отчество',
                                xtype: 'textfield',
                                anchor: '100%',
                                maxLength: 255,
                                value: '{$data['patronymic']}',
                            }));

                            rightCol.items.insert(0, 'modx-user-paid', new Ext.form.DateField({
                                id: 'modx-user-paid',
                                name: 'paid',
                                fieldLabel: 'Оплачено ДО конца этой даты rus: {$dateRus}',
                                xtype: 'datetime',
                                format: 'm/d/Y',
                                value: '{$data['paid']}',
                            }));

                        });
                    });
                </script>
            ");
        }

        break;

    case "OnBeforeUserFormSave":
        $user->Profile->set('surname', $_POST['surname']);
        $user->Profile->set('patronymic', $_POST['patronymic']);
        $user->Profile->set('paid', strtotime($_POST['paid'].' 23:59:59'));

        break;
}
Алексей
13 ноября 2023, 13:29
0
Разобрался. Спасибо!
Баха Волков
13 ноября 2023, 13:26
0
Указывать нужно либо modx, либо fenom
Алексей
13 ноября 2023, 13:02
0
Баха, а подскажите пожалуйста, как сделать синтаксис как у вас на фото. Не выходит.
Прописал вот так:
"files.associations": {
      "*.tpl": "html | modx | fenom"
    }
Работает либо одно, либо другое.
Павел Голубев
13 ноября 2023, 12:09
+1
Vue/React не делают шаг назад. Добавили серверного рендеринга, чтобы банально быстрее грузилось, чтобы пользователь быстрее мог увидеть интерфейс, а не белый лист с индикатором загрузки.

Проблемы с расширяемостью готовых Vue/React/Svelte компонент действительно существует, проблема не решается в лоб. Но об этом знает любой front-end разработчик с релевантным опытом.
Алексей
13 ноября 2023, 11:42
+1
Добрый день!
Спасибо за проделанную работу! Очень нужное дополнение. Донат отправил.
Arahort
13 ноября 2023, 10:59
+1
Респект, хоть и пользуюсь phpStorm)
Andrei
13 ноября 2023, 10:50
0
На страницах-символичеких ссылках не работает
Павел Гвоздь
13 ноября 2023, 10:38
0
Тут решение. Пишите в ТП на Модстор в следующий раз.
Баха Волков
13 ноября 2023, 09:49
+4
Спасибо товарищ за теплые слова, они зачастую бывают важнее всего остального
Семён Кудрявцев
13 ноября 2023, 09:36
+5
Очередной крик души)
Мне знакома твоя ситуация, я сам был в ней 2 года назад и вот к чему пришел в итоге поисков я:
  • MODX, действительно, скажем честно, вряд ли ожидает новый взлет популярности — всему причина нежелание разработчиков кардинально менять движок, но с другой стороны он как решал прекрасно свои задачи 10 лет назад так и решает их сейчас. Если Web-мастеру становится тесно с ним жить, то значит он перерос этот движок, что хорошо на пути развития как специалиста.
  • Куда двигаться дальше? Мой путь: Laravel, Spiral Freamework — просто «миллиарднократный» скачок в плане Developer Experience, всё по полочкам, всегда знаешь где, когда и откуда растут ноги у малейшей ошибки в коде, мониторинг запросов и ещё куча всего всего, просто на голову выше качество кода самих фреймворков — есть чему учиться.
  • PHP или Nodejs — бесспорно нода за последние годы выросла и на ней можно реально делать хорошие, сложные проекты, но мне гораздо легче оставаться в рамках знакомого языка, который полностью покрывает потребности проектов, что мне достаются. И тут замечу, что php умеет обрабатывать js на стороне сервера, а то меня это смутило как-то в твоем крике души, вопрос лишь гугления. Если просмотреть внимательно тенденцию реактивных фреймворков — до них всех начало доходить, что всё делать на клиенте не самый лучший путь, отсюда как грибы у всех начали появляться Server Actions — многие «старики» даже ржут с этого, так как по сути эти «реактивисты» возвращаются к тому же с чего уходили, то есть к серверному рендерингу, просто с последующей гидратацией. С другой стороны классические движки наоборот переняли многое от реактивщины и сегодня можно комфортно писать привычные шаблоны на бекенде прямо в виде SFC как например во Vue и это всё уедет на клиент отрендеренное. Хороший обмен опытом между двумя путями.
  • Ну и чуть приближенней к твоей задаче из моего личного опыта: такие вещи как CRM и ERP системы нужно писать на очень зрелых технологиях, проверенных временем и как правило такие системы пишутся и состоят из 2 частей отдельный проект API, и отдельный проект это клиентские приложения, на чем бы они не были написаны. Сегодня ты делаешь сайт, завтра понадобится мобильное приложение под android и под ios, а послезавтра уже десктопный софт на винду и macos. Когда есть API с хорошей документацией, развивать проект гораздо удобнее и легче. ERP это один из самых сложных по структуре проект из всех что мне доводилось встречать, куча асинхронщины, что многих php-шников сразу вводит в ступор, но тут появляется Spiral Framework — чудо мутант PHP + GO, целью которого как раз являются такие вот сложные, многослойные проекты, вот собственно его я и выбрал и подробно в нем копаюсь последний год, пока впечатления только положительные.