Всего 125 685 комментариев

Евгений Шеронов
24 мая 2021, 10:13
+2
Как раз на сервере ничего не происходит, там только MODX который генерирует модели по схеме и отвечает на запросы.
Сборка стилей и js в master ветке локально в шторме. Я их и в git кладу.
Можно и на сервере, в заготовке есть пример сборки assets. Но потом опять надо буде выкачать изменения себе)

Так, уточню про процесс по пунктам подробнее)
1) Открываю PhpStorm
2) Жму serve во вкладке npm (читай пишу npm serve в терминале)
3) Происходит небольшая сборка и становится доступна страничка localhost:8080
4) На этой страничке есть только стили и шрифты от MODX и один
5) В него Vue.js уже маунтит приложение.
6) Для ajax запросов я использую axios, в который в зависимости от окружения добавляются псевдокуки в main.js (там где new Vue(...)) и создание конфига.
import axios from "axios";
   let ym2Config = window.ym2Config || (process.env.NODE_ENV !== 'production' ? {
        modAuth: process.env.VUE_APP_MOD_AUTH || '',
        apiUrl: process.env.VUE_APP_API_URL || '',
        xmlLoaded: true,
        lang: {}
    } : {});
 axios.defaults.baseURL = ym2Config.apiUrl || '/assets/components/yandexmarket2/connector.php';
    axios.defaults.headers.common['modAuth'] = ym2Config.modAuth;
    if (process.env.NODE_ENV !== 'production' && process.env.VUE_APP_COOKIE) {
        axios.defaults.headers.common['modCookie'] = process.env.VUE_APP_COOKIE;
    }
//...тут дальше new Vue({...}).$mount('#yandexmarket-app');
7) И при каждой правке обновляется даже не вся локальная страница, а именно тот участок DOM, что обновился. Vue очень умный) Вся страница обновится если что-то сильно общее поменять.

А чтоб это всё работало админке MODX уже Home контроллер отвечает за создание windows.ym2Config и создание разметки:
<?php 
   ...
// тут ничего нового, всё уже описано в вышеупомянутых заметках про vue в админке)
 public function getTemplateFile(): string
    {
        $this->content .= '<div id="yandexmarket-app"></div>';
        return '';
    }

    public function loadCustomCssJs()
    {
        $this->addCss($this->mgrAssetsUrl.'css/chunk-vendors.css');
        $this->addCss($this->mgrAssetsUrl.'css/app.css');

        $this->addHtml("<script type=\"text/javascript\">
        window.ym2Config = {
            apiUrl: \"{$this->connectorUrl}\",
            modAuth: \"{$this->modx->user->getUserToken($this->modx->context->key)}\",
            xmlLoaded: {$this->xmlLoaded}, 
            lang: {}
        }
        </script>");

        $this->addJavascript($this->mgrAssetsUrl.'js/chunk-vendors.js');
        $this->addLastJavascript($this->mgrAssetsUrl.'js/app.js');
    }
Евгений Шеронов
24 мая 2021, 09:55
+2
Спасибо!)

Интересный подход — нужно попробовать.
В комментах чуть поделюсь кодом:
<?php
// в начале файла /assets/components/yandexmarket2/connector.php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Authorization, Cookie, Content-Type, Accept, modAuth, modCookie');
header('Access-Control-Allow-Methods: OPTIONS, HEAD, POST, GET, PUT, DELETE');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    die; //браузеры уже очень давно перед каждым запросом отправляют OPTIONS для проверки CORS
}
if (isset($_SERVER['HTTP_MODCOOKIE'])) {
    //а тут уже строка в таком формате приходит: "MODSESSID=aaaaa; PHPSESSID=aaaaa"
    $modCookie = array_map('trim', explode(';', $_SERVER['HTTP_MODCOOKIE']));
    foreach ($modCookie as $cookie) {
        list($key, $value) = explode('=', $cookie, 2);
        $_COOKIE[$key] = $value;
    }
}
Этот код у меня только в dev ветке. Людям в продакшн он уже не попадает)

Зачем усложняешь?
Действительно, но в где-то явно может быть иначе. Видел, что вообще по умолчанию PHP 5.4, в /usr/bin/ только один php. А нормальный лежит тут: /opt/php70/bin/php

А для чего такое решение? Чем не устроило то что есть в xPDOSimpleObject например?
Как раз чтобы не привязывать логику к конкретным xPDO объектам. Ну и они не подходят под PSR-4.
Идея была в том, что компонент не должен особо знать, что там подсунуто.
В идеале от этих объектов требовалось имплементация методов save, toArray и get-set для свойств.
Надеюсь, что легко можно будет портировать интерфейс хоть под Laravel, там тоже ActiveRecord модель, которую можно будет смаппить с моделями из компонента)

А еще всегда можно прислать PR
Найду когда-нибудь время и поэкспериментирую с предложенным функционалом, замерю разницу.
Илья Уткин
24 мая 2021, 08:03
0
Админки на текущий момент нет. Не думал, что кому-то потребуется читать все сообщения)
Постараюсь в следующей версии добавить.
Николай Савин
24 мая 2021, 06:56
+1
Слушай я по рабочему процессу решил отдельную ветку написать. Интересно стало.
Получается у тебя нода крутится на сервере, код ты пишешь локально?
Я так понял — при написании кода у тебя срабатывает автодеплой, нода на сервере подхватывает изменения и сразу же их показывает с перезагрузкой страницы? Это прямо в админке происходит? или ты отдельную страничку завел для тестов?
Николай Савин
24 мая 2021, 06:53
+2
Уф. Вроде осилил. Не зря заказывал — спасибо порадовал.

С заголовком modAuth проблем нет, но куки приходится прокидывать в кастомном заголовке modCookie (предварительно разрешив его политикой Access-Control-Allow-Headers), который уже на сервере обрабатывается и добавляется в PHP массив $_COOKIE. После чего запрос успешно авторизовывается и возвращает данные из процессоров.
Интересный подход — нужно попробовать. Я в последнее время много локально со VUE и Реактом работаю и как то чаще велосипед с какими-нибудь токенами изобретаю. Ну и плюс CORS на сервере настраиваю.

MODSESSID, PHPSESSID. Может кто глубоко погружался, зачем нам два разных ID сессии?)
Это все чтобы кто-попало в MODX не приходил. Только истинные любители садо-мазо программирования.
Если не ошибаюсь MODSESSID для аутентификации в коннекторах админки да?

/usr/bin/php7.4 ~/www/core/components/yandexmarket2/cron/generate.php
Зачем усложняешь?
php7.4 ~/www/core/components/yandexmarket2/cron/generate.php
Напомню, что для сгенерированных MODX-классов (которые от xPDOSimpleObject) сделал свои proxy-классы Pricelist, Field и т.д, наследуемые от базового абстрактного.
А для чего такое решение? Чем не устроило то что есть в xPDOSimpleObject например?

Возможно, этот механизм нужно будет внедрить в miniShop2 (там рефлексия не нужна, а просто хватит проверки, все ли поля были получены для этих объектов из базы и засеттить их в соответствующие свойства).
Ох Женя это нехилый такой мажорный апдейт получится. Только не скоро у нас уже miniShop v3.0 запланирован с гораздо более простыми изменениями, которые нужны в первую очередь. Но вообще интересно. Я бы почитал исходники на предмет внедрения. А еще всегда можно прислать PR
Артур
23 мая 2021, 14:07
0
В обоих файлах стоит восклицательный знак на 2-й строке
prnt.sc/13auxvf
Артур
23 мая 2021, 13:54
0
Алексей, а теперь как понять, который работает?
Alexey
23 мая 2021, 11:49
0
На сайте jquery аж два раза подключен

prnt.sc/13aozdd
prnt.sc/13ape7r

а вы ещё один зачем-то подключаете, да ещё такой древний (1.11.0)
Артур Шевченко
23 мая 2021, 11:14
0
Ну в консоли браузера я этого файла не нашёл. Форма не отправляется. Страница перезагружается. В консоли ошибка ajaxSubmit is not a function, так что рекомендую переподключить.
Артур
23 мая 2021, 11:02
0
Артур, спасибо за ответ!
Но вроде подключено!
<img src="" />
Lori
23 мая 2021, 10:01
0
да, уже в сниппете нашел строку формирования url и удалил $port
Артур Шевченко
23 мая 2021, 09:03
0
По-моему ты jQuery не подключил.
Сергей
21 мая 2021, 18:25
0
А какая админка у дополнения reMessages? По проекту еще нужен функционал в админке поиск по «Дата, Имя пользователя, сообщения»
Артур Шевченко
21 мая 2021, 11:38
0
Да, правильно, но в случае если клиент сайт покинул, уведомления ему не нужны.
Александр
21 мая 2021, 11:32
0
Спасибо Алексей!!! Ошибся в схеме. Вот прям хочется картину заказать: «Сначала прочти логи, потом задавай вопросы» и дарить людям. Сегодня например себе)))
Роман
21 мая 2021, 11:08
0
Я правильно понял, что это будет работать, только если клиент находится на сайте?
Роман
21 мая 2021, 10:16
0
Сумбурно написано.
$filter[] = "dateend > '".$date_today."'";
Наумов Алексей
21 мая 2021, 08:56
+1
В примере из статьи это таблица modx_electrica_items

Вероятнее всего, у вас ошибка в схеме, иных причин, почему таблица не создалась придумать сложно.

Стоит посмотреть в логах modx, может быть там ошибка написана.