Всего 123 801 комментарий

Николай Савин
20 июня 2023, 17:39
0
Класс оплаты, мало просто положить в нужный каталог. Его нужно зарегистрировать в системе. Подробнее читайте в документации
Giant Dad
20 июня 2023, 16:22
0
копирую Ваш код, регистрирую через $this->modx, но при создании оплаты, класс-обработчик всё равно не появляется disk.yandex.ru/d/xq_rjkOVRfquHQ только стандартный PayPal. Подскажите, пожалуйста, в чём может быть проблема
inkeri21
20 июня 2023, 15:57
0
Это полностью код сниппет msProduct

<?php
/** @var modX $modx */
/** @var array $scriptProperties */
/** @var miniShop2 $miniShop2 */
$miniShop2 = $modx->getService('miniShop2');
$miniShop2->initialize($modx->context->key);
/** @var pdoFetch $pdoFetch */
$fqn = $modx->getOption('pdoFetch.class', null, 'pdotools.pdofetch', true);
$path = $modx->getOption('pdofetch_class_path', null, MODX_CORE_PATH . 'components/pdotools/model/', true);
if ($pdoClass = $modx->loadClass($fqn, $path, false, true)) {
    $pdoFetch = new $pdoClass($modx, $scriptProperties);
} else {
    return false;
}
$pdoFetch->addTime('pdoTools loaded.');

if (isset($parents) && $parents === '') {
    $scriptProperties['parents'] = $modx->resource->id;
}

// Start build "where" expression
$where = array(
    'class_key' => 'msProduct',
);
if (empty($showZeroPrice)) {
    $where['Data.price:>'] = 0;
}
// Add grouping
$groupby = array(
    'msProduct.id',
);

// Join tables
$leftJoin = array(
    'Data' => array('class' => 'msProductData'),
    'Vendor' => array('class' => 'msVendor', 'on' => 'Data.vendor=Vendor.id'),
);

$select = array(
    'msProduct' => !empty($includeContent)
        ? $modx->getSelectColumns('msProduct', 'msProduct')
        : $modx->getSelectColumns('msProduct', 'msProduct', '', array('content'), true),
    'Data' => $modx->getSelectColumns('msProductData', 'Data', '', array('id'), true),
    'Vendor' => $modx->getSelectColumns('msVendor', 'Vendor', 'vendor.', array('id'), true),
);

// Include thumbnails
if (!empty($includeThumbs)) {
    $thumbs = array_map('trim', explode(',', $includeThumbs));
    foreach ($thumbs as $thumb) {
        if (empty($thumb)) {
            continue;
        }
        $leftJoin[$thumb] = array(
            'class' => 'msProductFile',
            'on' => "`{$thumb}`.product_id = msProduct.id AND `{$thumb}`.rank = 0 AND `{$thumb}`.path LIKE '%/{$thumb}/%'",
        );
        $select[$thumb] = "`{$thumb}`.url as `{$thumb}`";
        $groupby[] = "`{$thumb}`.url";
    }
}

// Include linked products
$innerJoin = array();
if (!empty($link) && !empty($master)) {
    $innerJoin['Link'] = array(
        'class' => 'msProductLink',
        'on' => 'msProduct.id = Link.slave AND Link.link = ' . $link,
    );
    $where['Link.master'] = $master;
} elseif (!empty($link) && !empty($slave)) {
    $innerJoin['Link'] = array(
        'class' => 'msProductLink',
        'on' => 'msProduct.id = Link.master AND Link.link = ' . $link,
    );
    $where['Link.slave'] = $slave;
}

// Add user parameters
foreach (array('where', 'leftJoin', 'innerJoin', 'select', 'groupby') as $v) {
    if (!empty($scriptProperties[$v])) {
        $tmp = $scriptProperties[$v];
        if (!is_array($tmp)) {
            $tmp = json_decode($tmp, true);
        }
        if (is_array($tmp)) {
            $$v = array_merge($$v, $tmp);
        }
    }
    unset($scriptProperties[$v]);
}
$pdoFetch->addTime('Conditions prepared');

// Add filters by options
$joinedOptions = array();
if (!empty($scriptProperties['optionFilters'])) {
    $filters = json_decode($scriptProperties['optionFilters'], true);
    foreach ($filters as $key => $value) {
        $option = preg_replace('#\:.*#', '', $key);
        $key = str_replace($option, $option . '.value', $key);
        if (!in_array($option, $joinedOptions)) {
            $leftJoin[$option] = array(
                'class' => 'msProductOption',
                'on' => "`{$option}`.product_id = Data.id AND `{$option}`.key = '{$option}'",
            );
            $joinedOptions[] = $option;
            $where[$key] = $value;
        }
    }
}

// Add sort by options
if (!empty($scriptProperties['sortbyOptions'])) {
    $sorts = array_map('trim', explode(',', $scriptProperties['sortbyOptions']));
    foreach ($sorts as $sort) {
        $sort = explode(':', $sort);
        $option = $sort[0];
        if (preg_match("#\b{$option}\b#", $scriptProperties['sortby'], $matches)) {
            $type = 'string';
            if (isset($sort[1])) {
                $type = $sort[1];
            }
            switch ($type) {
                case 'number':
                case 'decimal':
                    $sortbyOptions = "CAST(`{$option}`.`value` AS DECIMAL(13,3))";
                    break;
                case 'int':
                case 'integer':
                    $sortbyOptions = "CAST(`{$option}`.`value` AS UNSIGNED INTEGER)";
                    break;
                case 'date':
                case 'datetime':
                    $sortbyOptions = "CAST(`{$option}`.`value` AS DATETIME)";
                    break;
                default:
                    $sortbyOptions = "`{$option}`.`value`";
                    break;
            }
            $scriptProperties['sortby'] = preg_replace("#\b{$option}\b#", $sortbyOptions, $scriptProperties['sortby']);
            $groupby[] = "`{$option}`.value";
        }

        if (!in_array($option, $joinedOptions)) {
            $leftJoin[$option] = array(
                'class' => 'msProductOption',
                'on' => "`{$option}`.product_id = Data.id AND `{$option}`.key = '{$option}'",
            );
            $joinedOptions[] = $option;
        }

    }
}

$default = array(
    'class' => 'msProduct',
    'where' => $where,
    'leftJoin' => $leftJoin,
    'innerJoin' => $innerJoin,
    'select' => $select,
    'sortby' => 'msProduct.id',
    'sortdir' => 'ASC',
    'groupby' => implode(', ', $groupby),
    'return' => !empty($returnIds)
        ? 'ids'
        : 'data',
    'nestedChunkPrefix' => 'minishop2_',
);
// Merge all properties and run!
$pdoFetch->setConfig(array_merge($default, $scriptProperties), false);
$rows = $pdoFetch->run();

// Process rows
$output = array();
if (!empty($rows) && is_array($rows)) {
    $c = $modx->newQuery('modPluginEvent', array('event:IN' => array('msOnGetProductPrice', 'msOnGetProductWeight')));
    $c->innerJoin('modPlugin', 'modPlugin', 'modPlugin.id = modPluginEvent.pluginid');
    $c->where('modPlugin.disabled = 0');

    $modifications = $modx->getOption('ms2_price_snippet', null, false, true) ||
        $modx->getOption('ms2_weight_snippet', null, false, true) || $modx->getCount('modPluginEvent', $c);
    if ($modifications) {
        /** @var msProductData $product */
        $product = $modx->newObject('msProductData');
    }
    $pdoFetch->addTime('Checked the active modifiers');

    $opt_time = 0;
    foreach ($rows as $k => $row) {
        if ($modifications) {
            $product->fromArray($row, '', true, true);
            $tmp = $row['price'];
            $row['price'] = $product->getPrice($row);
            $row['weight'] = $product->getWeight($row);
            // A discount here, so we should replace old price
            if ($row['price'] < $tmp) {
                $row['old_price'] = $tmp;
            }
        }
        $row['price'] = $miniShop2->formatPrice($row['price']);
        $row['old_price'] = $miniShop2->formatPrice($row['old_price']);
        $row['weight'] = $miniShop2->formatWeight($row['weight']);
        $row['idx'] = $pdoFetch->idx++;

        $opt_time_start = microtime(true);
        $options = $modx->call('msProductData', 'loadOptions', array(&$modx, $row['id']));
        $row = array_merge($row, $options);
        $opt_time += microtime(true) - $opt_time_start;

        $tpl = $pdoFetch->defineChunk($row);
        $output[] = $pdoFetch->getChunk($tpl, $row);
    }
    $pdoFetch->addTime('Time to load products options', $opt_time);
}

$log = '';
if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
    $log .= '<pre class="msProductsLog">' . print_r($pdoFetch->getTime(), 1) . '</pre>';
}

// Return output
if (!empty($returnIds) && is_string($rows)) {
    $modx->setPlaceholder('msProducts.log', $log);
    if (!empty($toPlaceholder)) {
        $modx->setPlaceholder($toPlaceholder, $rows);
    } else {
        return $rows;
    }
} elseif (!empty($toSeparatePlaceholders)) {
    $output['log'] = $log;
    $modx->setPlaceholders($output, $toSeparatePlaceholders);
} else {
    if (empty($outputSeparator)) {
        $outputSeparator = "\n";
    }
    $output['log'] = $log;
    $output = implode($outputSeparator, $output);

    if (!empty($tplWrapper) && (!empty($wrapIfEmpty) || !empty($output))) {
        $output = $pdoFetch->getChunk($tplWrapper, array(
            'output' => $output,
        ));
    }

    if (!empty($toPlaceholder)) {
        $modx->setPlaceholder($toPlaceholder, $output);
    } else {
        return $output;
    }
}
Vladimir
20 июня 2023, 15:53
0
Но там же формы все видны -а раз есть форма то есть сабмит и файлы формы и action- просто можете сказать куда сейчас action идет — своим более опытным глазом — с форм главной страницы?
inkeri21
20 июня 2023, 15:51
0
Спасибо. В Категории смотрела, галочки стоят верные. У 8 класса и у 10 класса.
Dan
Dan
20 июня 2023, 15:48
0
Если товары minishop2, то скорее всего msProducts.
Найдите шаблон подкатегории и посмотрите какой сниппет вызван на том месте, где выводятся товары?
Если в вызове нет условий выборки с помощью where, а выводятся просто товары из этой подкатегории, то подозреваю, что у ваших товаров, которые есть и в классе 8 и в классе 10 указано две категории.
Зайдите в админке в любой товар, который повторяется на обеих страницах классов, и перейдите во вкладку Категории. Скорее всего там галочкой отмечены обе.
inkeri21
20 июня 2023, 15:41
0
Возможно этот более верный

<div class="row">
  [[pdoResources?
  &parents=`1012`
  &resources=`1014,1020,1022`
  &tpl=`category_submenu_cust_tpl`
  &includeTVs=`image`
  &processTVs=`1`
  &tvPrefix=``
  &limit=`48`
  &depth=`1`
  &sortby=`parent`
  ]]
</div>
inkeri21
20 июня 2023, 15:13
0
Не уверена, что тот самый код. Изначально не я сайт писала. Стараюсь самоучкой разобраться.

{if $_modx->resource.pr_hide_category != 1}
                  <div class="prod_cats row">
                    [[pdoResources?
                      	&tpl=`category_list_tpl`
                      	&parents=`[[*id]]`
                      	&templates=`4`
                      	&limit=`48`
                      	&depth=`0`
                      	&sortby=`parent`
                      	&sortby=`{"parent":"ASC","menuindex":"ASC"}`
                      	&includeTVs=`image`
                      	&processTVs=`1`
                      	&tvPrefix=``
                      ]]
                  </div>
             {/if}

            {if $_modx->resource.pr_hide_products != 1}
              <div class="the-category-items row">
                  [[msProducts?
                  	&tpl=`category_prod_tpl`
                  	&parents=`[[*id]]`
                  	&limit=`48`
                  	&sortby=`parent`
                  	&sortby=`{"menuindex":"ASC","parent":"ASC"}`
                  	&includeTVs=`image`
                  ]]
              </div>
Dan
Dan
20 июня 2023, 14:18
0
Покажите код, как выводите товары. По картинке никто вам подсказать дельно не сможет.
При вставке кода в комментарий используйте специальный тег
Dan
Dan
20 июня 2023, 14:15
0
А по какой причине он должен происходить? Вы бы хоть показали, как редирект реализовываете, с помощью какого компонента сделана форма, если без компонента, то код обработчика. А то получается просто гадание на кофейной гуще.
Владимир
20 июня 2023, 14:03
0
здравствуйте! получилось решить у Вас данную задачу?
Николай Савин
20 июня 2023, 11:32
0
DNS не везде обновились. Решаем вопрос.
Тодор
20 июня 2023, 00:04
0
$dop = [83595,5693,4659];
$option_par = array(
    'parents' => $parent,
    'limit' => 0,
    'tpl' => 'tpl.checkbox',
    'where' => [
        "Data.is_general" => 1,
        "OR:id:IN" => $dop
    ]
);
$content = $modx->runSnippet('msProducts',$option_par);
Павел Голубев
19 июня 2023, 18:30
+4
Спасибо, ребята. Афигенно вышло!
Константин Ильин
19 июня 2023, 16:06
+4
Присоединяюсь ко все похвалам!) красота!
только наварено размер шрифта контентной части кажется лучше 14px
Дима Касаткин
19 июня 2023, 16:00
+1
Вот это да! Ещё не пробовал, но уже очень захотелось! Как и у автора статьи, и у многих думаю здесь читателей, у меня тоже есть пакет базовых настроек сайта.

Буду пробовать собрать на основе moxi мой любымый стэк!

Спасибищще!
Дима Касаткин
19 июня 2023, 15:51
+8
Очень крутое обновление! Не смотря на то, что он теперь он не на MODX, а вообще статический (т.е. набор html-файлов и скриптов без классического движка), считаю для документации это отличное решение, к тому же она стала ещё future-proof, как теперь принято говорить, их-за возможности держать локально полнофункциональную копию, что особенно важно в нынешние времена, когда даже stackoverflow иногда перестаёт открываться…

А дополнительные возможности разметки и подсветка синтаксиса MODX + Fenom это просто здорово! Уверен что авторы документации оценят и через какое-то время мы начнем встречать всё больше этих фишек со спец. разметкой даже в привычных разделах!

Старый сайт документации тоже был не плох, но заметно уже устарел. Хотя отмечу, что некоторые моменты на новом заметно отличаются (например навигация по breadcrumbs) и по началу это может быть не привычно. Но в целом стало намного лучше. Большая и впечатляющая работа! Спасибо за неё, и за то, что находите возможным рассматривать обратную связь ;)

Ещё очень здорово, что даже редиректы со старой версии сделали, проверял руками множество ссылок из чата сообщества, битых не нашлось — репект!
Руслан Алеев
19 июня 2023, 13:03
+5
Если подумать, то разработка доки чаще сложнее разработки компонента/проекта =)
Низкий вам поклон @Василий Наумкин @Баха Волков @Иван Бочкарев, что у нас есть не только дока популярных компонентов, но и функционал добавления документации.
Здоров Александр
19 июня 2023, 10:42
+5
Огонь! Приятное удивление было сегодня, когда из закладок открыл страницу и… визуальный кайф от темной темы, подсветка синтаксиса modx. постоянно сижу на документации (хотя уже большую половину синтаксиса помню наизусть). сайт помог начать делать сайт быстрее и делать меньше ошибок.

вижу идеальный стандарт документации для фирмы и команды (сочетание файлового сайта и markdown)!

огромное спасибо всем причастным!