Всего 125 683 комментария

Евгений Шеронов
25 мая 2021, 18:12
+1
Я бы сказал, что оно очень необычное))
Полностью смотреть не стал (там на канале ещё 2), но подход автора видео по Vue.js мягко говоря странноват.

Сам компонент вот github.com/jaredfhealy/extrabuilder/ и, наверное, он хорошо выполняет свои функции.
Но автор умудрился намешать ExtJs, Vue.js и даже jQuery и всё это подрубается в админку через iframe!
Роман
25 мая 2021, 13:01
0
Экранировать кавычки нужно:
&filterOptions=`{
"more_tpl": "<button class=\"btn-more\"><span><i class=\"demo-icon icon-mdi_arrow_forward\"></i></span> Показать еще <b>7 товаров</b></button>"
}`
Кэш потом не забудьте почистить.
Михаил
25 мая 2021, 12:29
0
[[!mFilter2?
                        &parents=`[[*id]]`
        				&element=`msProducts`
        				&class=`msProduct`
        				&limit=`19`
        				
        				&includeTVs=`blackfriday, instock, cyberdays, newproduct, discountproduct, hit, price-metr-old, price-metr, price-for-metr`
        
                        &tplPageFirst=`@INLINE <li class="control"></li>`
                        &tplPageLast=`@INLINE <li class="control"></li>`
                        &tplPagePrev=`@INLINE <li class="control"><a href="[[+href]]">	‹</a></li>`
                        &tplPageNext=`@INLINE <li class="control"><a href="[[+href]]">›</a></li>`
                        &tplPageFirstEmpty=`@INLINE `
                        &tplPageLastEmpty=`@INLINE `
                        &tplPagePrevEmpty=`@INLINE <li class="disabled"><span>	‹</span></li>`
                        &tplPageNextEmpty=`@INLINE <li class="disabled"><span>›</span></li>`
                        
                        &tpls=`tpl.msProducts.row,tpl.msProducts.row-inline`
                        &ajaxMode=`button` 
                        &filterOptions=`{
                            "more_tpl": "<button class="btn-more">
        						<span><i class="demo-icon icon-mdi_arrow_forward"></i></span>
        						Показать еще <b>7 товаров</b>
        					</button>"
                        }`
                        
                     
        			


        			]]
Роман
25 мая 2021, 12:18
0
В документации, нет ничего про ajaxTplMore. Пришлите код снипета.
Михаил
25 мая 2021, 12:07
0
Не помогло(
Семён Кудрявцев
25 мая 2021, 12:05
+1
Крутяк! Автору, респект — давно ждал этой истории, что и как делать в MODX + Vue
На вопрос автора — Нужно ли дальше делать подобные компоненты или они наоборот уводят MODX куда-то в сторону?)
Ответ: Однозначно, да!
И по поводу админки на vue, хотелось бы, чтобы это всё-таки стало реальностью)
perfkirill
24 мая 2021, 18:50
0
Вопрос о там как ускорить импорт.

Что мы имеем после внедрения рекомендаций
1. Импорт товаров, используем 3 TV-поля, 12000 ед ~ 12 часов.
2. Импорт товаров, поля в таблице товаров, 12000 ед ~ 8 часов

В настройках импорта для определения родительской категории, в parent передаётся название (pagetitle)

Пример базы для импорта yadi.sk/i/Mp0GAvLWiOIDqg
А вообще там 12000 позиций.

Лог SQL запросов yadi.sk/d/NvVuhe2ju9graA

Сопоставление полей yadi.sk/i/Cg0okIGBIBs_DA

Настройки импорта yadi.sk/i/Ve21NuQEopQIHg
Николай Савин
24 мая 2021, 11:41
0
Насколько я знаю, на данный момент в системе LiqPay нет отдельной ссылки для отмены или неуспешной оплаты.
Компонент старый — давно писался — отсюда фактически неиспользуемая системная настройка.

Если и есть нечто подобное — значит нужно компонент переделать.
Евгений
24 мая 2021, 11:39
0
При отмене оплаты перекидывает на страницу успешной оплаты, все ссылки в системных настройках правильные. Как правильно настроить подскажите пожалуйста?
Евгений Шеронов
24 мая 2021, 11:02
+1
Ну там нет конфликта скриптов точно, а вот в стилях всех у меня добавляется css префикс.

Конфликт будет только с простыми названиями классов, это можно и как плюс использовать. Именно для иконок используются стандартные классы. Но все свои классы я пишу добавляя префикс компонента.

Я в админку совсем не захожу, только после сборки раз в неделю что-то проверить)
По идее всё как видишь на отдельной страничке — так и отображается в админке.

Есть смысл локально развернуть как раз для дебага PHP. Xdebug на modhost не поставить же?
Илья Уткин
24 мая 2021, 10:29
0
Да, конечно, используются стандартные пользователи MODX. Вы сами делает регистрацию, авторизацию — любым удобным для вас способом. Возможно, на сайте уже есть личный кабинет. Этот компонент реализует только конкретно сообщения между пользователями.
Сергей
24 мая 2021, 10:25
0
Ясно.

А пользователи куда сохраняются? Может стандартный функционал используют «Пользователи»?
Alexey
24 мая 2021, 10:18
0
я бы убрал подключение «древнего» jquery(он где-то в body подключается — skrinshoter.ru/s/240521/bo1cNzHu ), затем убрал подключение jquery в вызове сниппета minifyX (скорее всего, вызывается в head) и смотрел бы далее, что консоль выдает.
Николай Савин
24 мая 2021, 10:17
0
Все что касается VUE понятно. А вот как скрестить админку MODX и VUE — уже сложнее.
Как вовремя поймать наложения скриптов и стилей админки и VUE? Как вовремя отловить все баги без постоянного деплоя.
Это наверное лучше локально на рабочей машине развернуть MODX и сразу на месте все вопросы решать.
Евгений Шеронов
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
Найду когда-нибудь время и поэкспериментирую с предложенным функционалом, замерю разницу.