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

Олег
09 марта 2022, 16:32
0
В общем, все решилось сменой версии PHP. Хотя вроде проверял при установке.
Роман
09 марта 2022, 15:44
0
А не проще, сделать проверку по ID?
{$vendor in list [6, 7] ? 'Цена по запросу' : $price}
Артур Шевченко
09 марта 2022, 15:32
0
Без разницы где велась разработка. Нужно проверять пути и права на файлы и папки.
Олег
09 марта 2022, 15:04
0
разработка тестового сайта велась на поддомене другого домена. Скорее всего проблема в путях к minishop2?
Олег
09 марта 2022, 14:44
0
Перемещал с помощью товарищей с рег ру, сейчас копаюсь в мануалах по переносу и нашел пару ошибок в путях core/config/config.inc.php, там был указан старый домен. Пока что вопрос не решился, продолжаю.
Артур Шевченко
09 марта 2022, 14:39
0
В путях. Правда непонятно как получилось запороть пути к конкретному компоненту. При переносе случайно ядро не перемещали на уровень выше? Ещё можно права на папки проверить.
Артур Шевченко
09 марта 2022, 13:15
0
Пара советов, если позволишь:
Не просто позволю, а ещё и благодарен буду)))

и далее в коде методов ты не будешь париться и обращаться к конфигу так:
Ну вообще запись станет длиннее this.config.someprop против this.someprop, но я доверюсь твоему опыту.

Обычно принято в мире js передавать селектор первым аргументом, а вторым конфиг плагина
Тут отдельная проблема. В конструктор надо передавать уникальный селектор, потому что в противном случае если на странице больше 1 вызова AjaxForm обработчики навешиваются столько раз сколько вызывается сниппет, а это плохо по понятным причинам. И передавать селектор в каждом вызове мне кажется неудобным. Я думаю надо установить селектор по умолчанию и дополнять его меткой времени и тоже самое делать с переданным селектором, чтобы на 100% исключить вероятность дублирования или есть варианты решения получше?

3. У тебя на 20-ой строке есть странность if (this.beforeSubmit(e.target)) { и судя по коду твой метод beforeSubmit всегда возвращает true, тогда я понятия не имею зачем тут проверка.
Это у меня он возвращает true, а если кто-то захочет свою логику, например не отправлять пока не прочитают политику работы с персональными данными?

Ну и можно по стандартам пройтись :|
Я самоучка, это не оправдание, но что значит пройтись по стандартам не понимаю.

И есть ещё один момент — уведомления
if (AjaxForm.Message != 'undefined') {
    AjaxForm.Message.close();
}
Это я оставил для обратной совместимости, но это объект, мне кажется правильнее было бы сделать показ сообщения методом или методами класса, но как туда впихнуть код выше? Тут предлагали сделать как @Николай Савин в minishop2, но у него это тоже объект. Может уведомления сделать отдельным классом? Добавить из коробки уведомления не требующие jQuery, только вот надо же ещё дать возможность подключать произвольные уведомления, но как это лучше сделать?
Николай Савин
09 марта 2022, 10:50
+3
Заголовок и суть вопроса были отформатированы высокоразвитым искусственным интеллектом.
Баха Волков
09 марта 2022, 10:20
+1
@Фарит Не надо писать такие заголовки, заголовок вопроса должен отражать суть вопроса и до ката также
Баха Волков
09 марта 2022, 10:04
+3
{if $_pls['vendor.name'] in list ['nokia', 'iphone']}
    Цена по запросу
{else}
    {$price}
{/if}

{$_pls['vendor.name'] in list ['nokia', 'iphone'] ? 'Цена по запросу' : $price}
Баха Волков
09 марта 2022, 09:57
0
Ну и можно по стандартам пройтись :|
Баха Волков
09 марта 2022, 09:53
+3
Опа, а это уже лучше. Пара советов, если позволишь:

1. Можно учитывать, что конфиг может по какой-то причине не будет доступен или он придёт неполным

constructor (config) {
    this.defaults = {
        someProp: true,
        anotherProp: 'long string',
    }

    this.config = Object.assign({}, this.defaults, config);
}

и далее в коде методов ты не будешь париться и обращаться к конфигу так:

this.config.someProp

2. Обычно принято в мире js передавать селектор первым аргументом, а вторым конфиг плагина, это намного удобнее, и я понимаю, что AjaxForm в оригинале такой и ты просто перевел код, но тут заодно можно и это исправить:

class AjaxForm {
    constructor (selector, config) {
        if (!selector) {
            console.error('Нет селектора');
        }
        
        this.defaults = {
            someProp: true,
            anotherProp: 'long string',
        }
    
        this.config = Object.assign({}, this.defaults, config);

        this.forms = document.querySelectorAll(selector);
    }
}

// И теперь можно вызывать и с конфигом и без
new AjaxForm(selector, config);
new AjaxForm(selector);

3. У тебя на 20-ой строке есть странность if (this.beforeSubmit(e.target)) { и судя по коду твой метод beforeSubmit всегда возвращает true, тогда я понятия не имею зачем тут проверка.
Алексей Смирнов
09 марта 2022, 09:49
+1
Проверил fenom, к сожалению есть проблема в передачи параметров к феному.
Поэтому вариант с ним не сработает. (это учту в следующих выпусках).
А пока можно на MODX синтаксисе все сделать.
Для этого нужно в передающем параметре imgs Проверить наличие запятой.
Т.е. если есть ЗПТ, то это более 1й фото, если ЗПТ нет, то одно фото:
[[+imgs:contains=`,`:then=`ЗПТ`:else=`ТЧК`]]
Проверять естественно в чанке и там дописать разные выводы в самих условиях или используя разные чанки, например в чанке главном (по умолчанию это imgsPasteMigxGallery, но вы создайте свой, чтобы при обновлении не затерся поумолчанию) можно написать следующее:
[[$imgsSuperCunks[[+imgs:contains=`,`:then=``:else=`.one`]]]]
Таким образом у вас будет 1 чанк imgsSuperCunks — для более 1 фото.
imgsSuperCunks.one — для одной фотки.
Артур Шевченко
08 марта 2022, 23:02
+3
Вот мой код к которому обращается cron
<?php
$snippet = $argv[1] ?: $_GET['snippet'];
$allowSnippets = array('modstoreParser', 'updatePrice', 'bussinessCenterParser'); // массив разрешённых сниппетов, нужно потому что скрипт доступен с фронта и принимает get-параметры.
if(in_array($snippet, $allowSnippets)){
    require_once 'document/root/path/public_html/config.core.php'; // заменить на свой путь до корня сайта
    require_once MODX_CORE_PATH.'model/modx/modx.class.php';
    $modx = new modX();
    $modx->initialize('web');
    $modx->getService('error','error.modError', '', '');
    echo $modx->runSnippet($snippet);
}
Как создавать задачи для cron можно загуглить поискать в Яндексе.
А как должен выглядеть сниппет, я могу только предполагать. Учитывая, что есть «текстовые цены», наверное нужно будет использовать регулярные выражения. Если в самом простом варианте, без регулярок и модификаций, только основная цена товара, то примерно так
<?php
$coefficient = $modx->getOption('coefficient'); // получаем системную настройку, которую предварительно создали
if($coefficient){
    $products = $modx->getIterator('msProductData'); // получаем все товары  
    foreach($products as $product){
        $oldPrice =  $product->get('price');
        $product->set('price', $price*$coefficient);
        $product->save();
    }
}
Артур Шевченко
08 марта 2022, 21:29
+1
Самый простой способ, наверно, где-то в админке сделать коэффициент и чтобы все существующие цены на него умножались.
Да. И добавь к этому задание в планировщике и сниппет который будет цены менять.
Николай Савин
08 марта 2022, 18:36
0
За заполнение тех или иных таблиц отвечают резолверы. Пишите новый резолвер. Добавлять его никуда не нужно. Они запускаются все подряд при сканировании каталога. Внутри резолвера пишите такой же код заполнения данными, как вы бы писали в админке MODX в консоли.
Для примера таких резолверов можете посмотреть исходный код популярных компонентов.
Stepan
08 марта 2022, 16:00
0
А как заполнить таблицу сразу во время установки дополнения?