Денис

Денис

С нами с 11 декабря 2015; Место в рейтинге пользователей: #230
Денис
07 августа 2018, 17:31
0
Замените msProduct на msProductData
Денис
07 августа 2018, 16:37
+1
Как то так. Только сделайте прежде бекапы файлов и бд. Код выполняется в console.

if (!$ms2 = $modx->getService('minishop2')) return;
$step = 5;
if (!isset($_SESSION['Console']['completed'])) {
    $_SESSION['console_offset'] = 0;
}
$offset = isset($_SESSION['console_offset']) && $_SESSION['console_offset'] ? $_SESSION['console_offset'] : 0;

$q = $modx->newQuery('msProductData');
$total = $modx->getCount('msProductData', $q);
$q->limit($step, $offset);

$resources = $modx->getIterator('msProductData', $q);
foreach ($resources as $productData) {
    
	$c = $modx->newQuery('msProductFile');
	$c->where(array(
		'parent' => 0
	));
	$c->sortby('rank','asc');
	if($files = $productData->getMany('Files',$c)){
		$firstFile = reset($files);
		$response = $modx->runProcessor('mgr/gallery/remove',
			                        array('id' => $firstFile->id),
			                        array('processors_path' => $ms2->config['corePath'] . 'processors/') );
		if($response->isError()){
			echo $response->getMessage(), PHP_EOL;
		}
	}
	
}

$_SESSION['console_offset'] = $offset + $step;
if ($_SESSION['console_offset'] >= $total) {
  $sucsess = 100;
  $_SESSION['Console']['completed'] = true;
} else {
  $sucsess = round($_SESSION['console_offset'] / $total, 2) * 100;
  $_SESSION['Console']['completed'] = false;
}
for ($i=0; $i<=100; $i++) {
    if ($i <= $sucsess) {
        print '=';
    } else {
        print '_';
    }
}
print "\n";
print $sucsess.'% ('.$_SESSION['console_offset'].')'."\n\n";
Денис
03 августа 2018, 11:12
+1
Опубликуйте контейнер и тогда не будет 404 ошибки.
Денис
03 августа 2018, 10:22
1
+1
Вся проблема в открывающих фигурных скобках. Везде, что не является феномом, ставьте пробел после открывающей фигурной скобки и проблем не будет. Даже ignore не нужен.
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){ w[l]=w[l]||[];w[l].push({ 'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-KCWCD3M');</script>
<!-- End Google Tag Manager -->
Денис
03 августа 2018, 08:50
1
+1
Или так
'where' => [
        'createdby' => $_modx->user.id,
        'published' => 0,
    ] | json_encode,
Денис
31 июля 2018, 09:10
1
0
Можно сделать через fenom.
Во-первых заходите в настройки TV поля во вкладку Параметры вывода. Выбираете в поле Тип вывода — Разделитель. В поле Разделитель ставите запятую. Теперь у вас будут выводиться значения через запятую. Далее в чанке вывода пишите:

{set $productsCategoryArr = $_pls['tv.productsCategory'] | split}
{foreach $productsCategoryArr as $category}
    {switch $category}
        {case 'Фрукты'}
            <div class="fruits">Фрукты</div>
        {case 'Овощи'}
            <div class="veggies">Овощи</div>
    {/switch}
{/foreach}
Денис
30 июля 2018, 13:27
1
+3
Сделайте что то вроде такого.
Создайте файл в /assets/components/minishop2/js/mgr/product и назовите его product.extends.js

Ext.override(miniShop2.panel.Product,{
    getFields: function (config) {
        var fields = [];
        var originals = MODx.panel.Resource.prototype.getFields.call(this, config);

        for (var i in originals) {
            if (!originals.hasOwnProperty(i)) {
                continue;
            }
            var item = originals[i];
            if (item.id == 'modx-resource-header') {
                item.html = '<h2>' + _('ms2_product_new') + '</h2>';
            }
            else if (item.id == 'modx-resource-tabs') {
                item.stateful = MODx.config['ms2_product_remember_tabs'] == 1;
                item.stateId = 'minishop2-product-' + config.mode + '-tabpanel';
                item.stateEvents = ['tabchange'];
                item.collapsible = false;
                item.getState = function () {
                    return {activeTab: this.items.indexOf(this.getActiveTab())};
                };

                var product = [];
                var other = [];

                for (var i2 in item.items) {
                    if (!item.items.hasOwnProperty(i2)) {
                        continue;
                    }
                    var tab = item.items[i2];
                    switch (tab.id) {
                        case 'modx-resource-settings':
                            tab.items.push(this.getContent(config));
                            product.push(tab);
                            break;
                        case 'modx-page-settings':
                            tab.items = this.getProductSettings(config);
                            product.push(tab);

                            if(miniShop2.config['show_extra'] || miniShop2.config['show_options']) {
                                var copositeOptions;
                                copositeOptions = this.getProductFields(config);
                                if (!miniShop2.config['show_extra']) {
                                    copositeOptions.items = [];
                                }
                                if (miniShop2.config['show_options']) {
                                    var options = this.getProductOptions(config);
                                    if (options) {
                                        copositeOptions.items = copositeOptions.items.concat([{ title: options.title, style: "margin-top:30px;" }],options.items);
                                    }
                                }
                                product.push(copositeOptions);
                            }

                            if (config.mode == 'update' && miniShop2.config['show_links']) {
                                product.push(this.getProductLinks(config));
                            }
                            if (miniShop2.config['show_categories']) {
                                product.push(this.getProductCategories(config));
                            }
                            break;
                        default:
                            other.push(tab);
                    }
                }

                var tabs = [{
                    title: _('ms2_tab_product'),
                    cls: 'panel-wrapper',
                    id: 'minishop2-product-tab',
                    items: [{
                        xtype: 'modx-tabs',
                        id: 'minishop2-product-tabs',
                        stateful: MODx.config['ms2_product_remember_tabs'] == 1,
                        stateId: 'minishop2-product-' + config.mode + '-tabpanel-product',
                        stateEvents: ['tabchange'],
                        getState: function () {
                            return {activeTab: this.items.indexOf(this.getActiveTab())};
                        },
                        deferredRender: false,
                        items: product,
                        resource: config.resource,
                        border: false,
                        listeners: {},
                    }]
                }];

                item.items = tabs.concat(other);
            }
            if (item.id != 'modx-resource-content') {
                fields.push(item);
            }
        }

        return fields;
    },
});

Так же создайте плагин и привяжите его к событию OnDocFormPrerender
<?php
switch ($modx->event->name) {
	case 'OnDocFormPrerender':
	    if($modx->controller->resourceArray['class_key'] == 'msProduct'){
	        if ($miniShop2 = $modx->getService('miniShop2')) {
    	            $modx->controller->addLastJavascript($miniShop2->config['jsUrl'].'mgr/product/product.extends.js');
	        }
	    }
        break;
}

Получится как то так:
Денис
25 июля 2018, 09:03
0
У вас используется minifyX?
Денис
13 июля 2018, 09:35
1
+1
Попробуйте вместо вашего редиректа сделать вот такой:
RewriteCond %{SERVER_PORT} !^443$
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
Денис
13 июля 2018, 09:22
0
Да, всё верно.
Денис
12 июля 2018, 14:19
0
Судя по плагину (смотрите 60 строчку), выводить поля [[+user.ключ]]. А в fenom {$_pls['user.ключ']} или {'user.ключ'|placeholder}. Так же подтягиваются все поля профиля и дополнительные поля пользователя, так же с префиксом 'user.'
Денис
09 июня 2018, 08:47
0
Судя по логам проблема в компоненте modxsite. Ваш КО.
Денис
31 мая 2018, 09:18
0
Если не ошибаюсь, у товара всегда один и тот же url, независимо от того, к каким разделам он прикреплен (кроме родного естественно). Т.е. У нас есть товар с алиасом tovar, который находится в категории с алиасом category-1. Получается товар будет доступен uri /category-1/tovar/. Прикрепляем товар еще к категории category-2. Теперь на странице category-2, при выводе списка товаров через сниппет msProducts, мы увидим tovar, но uri у него по прежнему останется /category-1/tovar/. Следовательно страница одна и та же и хлебные крошки будут всегда показывать родной раздел.
Денис
30 мая 2018, 12:13
0
Системные настройки -> minishop2 -> Раздел товар. Там можно выключить/выключить отображение вкладок.

Для того, чтобы убрать настройки.
Настройки форм -> Создать новый профиль. Сразу ставим галочку активно.
Заходим в редактирование профиля. Жмем Новый набор правил. Действие — обновить ресурс, Ограничивающее поле — class_key, Ограничивающее значение — msProduct.
Заходим в редактирование нового правила. Вкладка Регионы. Убираем галочки напротив modx-page-settings, modx-page-settings-left, modx-page-settings-right. Сохраняем. На странице с товаром останется вкладка настройки, но она будет пустая.
Денис
23 мая 2018, 08:40
0
Очистите папку кэша (/core/cache/) вручную через ftp
Денис
21 мая 2018, 15:01
3
+3
Создайте плагин на событие OnManagerPageBeforeRender с следующим кодом:

switch ($modx->event->name) {
    case 'OnManagerPageBeforeRender':
        if($controller->config['controller'] == "security/user") {
            $controller->addHTML('
                <script>
                    Ext.ComponentMgr.onAvailable("modx-panel-users", function () {
                        this.items[1].items[1].baseParams = {
                            action: "security/user/getList",
                            usergroup: MODx.request["usergroup"] ? MODx.request["usergroup"] : "",
                	    sort: "id"
                        };
                    });
                </script>
            ');
        }
    break;
}
Денис
15 января 2018, 08:22
0
Сделайте значение системной настройки container_suffix пустым и Содержимое => Типы содержимого => Расширение файла HTML тоже сделайте пустым. После перегенерируйте все url'ы. У вас будут все url без слеша в конце.
Денис
11 января 2018, 16:36
+1
Есть ошибки в консоли браузера?
Денис
29 декабря 2017, 15:02
0
Стандартными средствами никак. Можете расширить класс mse2FiltersHandler и написать свой фильтр на нужный уровень вложенности.