Кровельный

Кровельный

С нами с 30 мая 2023; Место в рейтинге пользователей: #7204
Кровельный
28 марта 2024, 16:49
0
Добрый день, прикрутите возможность поиска товаров по ТВ/значению
Кровельный
14 февраля 2024, 10:34
0
Плохая практика отвечать вопросом на вопрос. Артур, пожалуйста пишите по существу! У нас версия старая: MODX Revolution 2.8.3-pl.
Кровельный
07 февраля 2024, 15:17
0
Тоже столкнулись с этим вопросом. Функция getConditions пишет оповещения про метод, который вызывается, но не существует в классе, зачем тогда этот несуществующий подсчёт и может быт это решается просто условием если count > 0, то вызывать этот метод или напросто после обновления метод убрали, а из класса убрать забыли?
Кровельный
30 декабря 2023, 13:07
0
А с такой ошибкой не кто не сталкивался?
/core/components/seofilter/model/seofilter/sfcount.class.php : 496) [SeoFilter] Counting error: Method "getMsProductConditions" not exists in class "sfCountHandler ".
Кровельный
28 декабря 2023, 17:28
0
Не работает, ругается на конкретный код в переменной var:
<script type="text/javascript">
    if (typeof(xLikeCls) == "undefined") {
        var xLikeCls = new xLike({"actionUrl":"\/assets\/components\/xlike\/action.php"});
    }
</script>
Кровельный
13 декабря 2023, 16:19
0
В феноме чанка tpl.yandexMaps надо заменить счетчик.
{include ++$count}
на
{var $count = ++$count}
Кровельный
08 декабря 2023, 14:59
0
Непонятно от куда идет запрос по логу «Attempted to redirect to an empty». Предположим, чтобы увидеть запрос запрашиваемой стр, далее удалить её из индекса идём в строке core/model/modx/modresponse.class.php:210 меняем на
$this->modx->log(modX::LOG_LEVEL_ERROR, "Attempted to redirect to an empty URL: " . print_r($_SERVER['REQUEST_URI'], 1));
Кровельный
24 ноября 2023, 15:57
0
Удалить изображения в базе
$q = $modx->newQuery('msProduct');
$q->innerJoin('msProductData', 'Data', 'msProduct.id = Data.id');
$q->where(array(
    'msProduct.parent:IN' => [30396,30397,30398], 
    'msProduct.published' => 1, 
    'msProduct.deleted' => 0)
);
$q->sortby('msProduct.id','ASC');
$products = $modx->getIterator('msProduct', $q);
foreach ($products as $product) {
    if ($images = $modx->getCollection('msProductFile', array('product_id' => $product->id, 'parent' => 0))) {
        $ids = array();
        foreach ($images as $im) {
            $ids[] = $im->get('id');
        }
        $response = $modx->runProcessor('gallery/multiple',
        	array('method' => 'remove', 'ids' => json_encode($ids)),
        	array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
        );
        // remove files on dir
        $remove_files = glob(MODX_BASE_PATH.'assets/images/products/'. $id.'/*');
        foreach ($remove_files as $remove_file) {
            if (is_file($remove_file)) {
                unlink($remove_file); // delete file
            }
        }
    }
}
Перегенерировать превью товара при загрузке после импорта
$q = $modx->newQuery('msProduct');
$q->innerJoin('msProductData', 'Data', 'msProduct.id = Data.id');
$q->where(array('msProduct.parent:IN' => [30396,30397,30398], 
    'msProduct.published' => 1, 'msProduct.deleted' => 0));
$q->sortby('msProduct.id','ASC');
$products = $modx->getIterator('msProduct', $q);
$i = 0;
foreach ($products as $product) {
    $i++;
    
    if ($images = $modx->getCollection('msProductFile', array('product_id' => $product->id, 'parent' => 0, 'rank' => 0))) {
        $ids = array();
        foreach ($images as $im) {
            $ids[] = $im->get('id');
            $image = $im->get('url');
        }
        $response = $modx->runProcessor('gallery/multiple',
        	array('method' => 'generate', 'ids' => json_encode($ids)),
        	array('processors_path' => MODX_CORE_PATH.'components/minishop2/processors/mgr/')
        );
        $product = $modx->getObject('msProduct', $product->id);
        $product->set('image', $image);
        $product->save();
    }
}
Номера родительских категорий следует сменить, смотрите внимательно. На всякий случай сделайте бэкап.
Кровельный
15 ноября 2023, 10:22
1
0
Возможно условие, как-то обвернуть?
&where=`[{"Data.id:NOT IN":["32"]}, {"Data.favorite":"1","OR:Data.new:=":"1"}]`
[[!msProducts?
	&parents=`2`
	&depth=`5`
	&limit=`10`
	&sortby=`{"publishedon":"DESC"}`
	&where=`{"Data.id:NOT IN":["32"],"Data.favorite":"1","OR:Data.new:=":"1"}`
	&tpl=`idx_new`
	&showLog=`1`
]]
Кровельный
25 июля 2023, 14:51
0
Как из свойств товара-ресурса записать в одну опцию товара?
Например если 2-3 значения, а 1 ключ, конечно можно использовать вариант в свойствах если там уже есть данные json, как многомерный массив, но мы сделаем тестовую опцию множественный выбор.
  1. Назовём опцию made_from
  2. Заведём в опцию значения (В настройках minishop2), чтобы получились значения:
    • Металла
    • Дерева

    • Вторсырья
    • Текстиля
    • Пластика

    * — не программно, вручную (если программно, то дописывайте код)
  3. Далее выполним:
    <?php
    $key = 'made_from'; // имя опции товара
    $resource = $modx->getObject('modResource', 44);
    $product = $modx->getObject('msProduct', $resource->id);
    //$arr = $resource->get('properties')['technicals']['Детали изготовлены из'];
    $arr = ['Пластика','Вторсырья'];
    $options = $product->loadData()->get('options');
    foreach ($arr as $k => $v) {
        $options[$key][$k] = $arr[$k];
    }
    $product->set('options', $options);
    $product->save();
  4. Готово. Теперь mFilter2 сможет фильтровать по опции. Если необходимо записать или обновить товары, то необходимо завернуть всё в getCollection
Кровельный
06 июля 2023, 15:07
0
Хорошая вещь, и после переиндексации слов вывести сниппет keywords_mse2.
<?php
/* Ключевые слова из индекса слов с ключевыми фразами или TV keywords. */
$q = $modx->query('SELECT resource, word FROM modx_mse2_words WHERE resource = '.$modx->resource->id);
if (is_object($q)) {
    while ($row = $q->fetch(PDO::FETCH_ASSOC)) {
        $result .= $row['word'].', ';
    }
}

$seoKeywords = $modx->getObject('seoKeywords', array('resource' => $modx->resource->id));
if (is_object($seoKeywords)) {
    // try seoPro
    if (!$seoKeywords->get('keywords')) {
        return mb_strtolower(substr($result,0,-2));
    } else {
        return mb_strtolower($result) . $seoKeywords->get('keywords');
    }
} else {
    //try {$_modx->resource['keywords']}
    $resource = $modx->getObject('modResource', $modx->resource->id);
    if (!$resource->getTVValue('keywords')) {
        return mb_strtolower(substr($result,0,-2));
    } else {
        return mb_strtolower($result) . $resource->getTVValue('keywords');
    }
}
Кровельный
04 июля 2023, 12:35
0
На локальном сервере была похожая проблема
Кровельный
04 июля 2023, 12:34
0
Помогло решение от @Иван Бочкарев
  • modx 2.8.4-pl
  • apache_2.4-php_7.2-7.4 open server
  • MySQL-5.7-Win10
  • PHP_7.4
#log: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'your_database_name.modx_ms2_products.id' which is not functionally dependent on columns in GROUP BY clause
Добавление следующего блока в конфигурацию config core/config/config.inc.php решает проблему:
<?php
// config core/config/config.inc.php
$driver_options = array (
  PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
  PDO::MYSQL_ATTR_INIT_COMMAND => "SET sql_mode = 'TRADITIONAL'"
);
# Или возможно, что нужно было вместо
# SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';
# SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION';
# Выполнить:
SET GLOBAL sql_mode = 'TRADITIONAL';
SET SESSION sql_mode = 'TRADITIONAL';
Кровельный
16 июня 2023, 12:21
0
Как добавить множественный список с автодополнением в ресурс/документ (свое кастомное поле tags_cloud), также как реализовано tags в ms2?
Например, у ресурса уже есть в бд значения ["тег 1","тег 2","тег 3"], но в супер-селекте они не выводятся и не вводятся. Есть у кого подсказка или решение?

В таблице modx_site_content добавлена структура tags_cloud
Плагин:
<?php
switch ($modx->event->name) {
    case "OnMODXInit":
        $modx->loadClass('modResource');    
        $map = array(
            'modResource' => array(
                'fields' => array(
                    'tags_cloud' => null,
                ),
                'fieldMeta' => array(
                    'tags_cloud' => array(
                        'dbtype' => 'varchar',
                        'precision' => '100',
                        'phptype' => 'json',
                        'null' => true,
                    ),
                ),
            ),
        );
        
        foreach ($map as $class => $data) {
            $modx->loadClass($class);
            foreach ($data as $tmp => $fields) {
                if ($tmp == 'fields') {
                    foreach ($fields as $field => $value) {
                        foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                            if (isset($data[$key][$field])) {
                                $modx->map[$class][$key][$field] = $data[$key][$field];
                            }
                        }
                    }
                } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                    foreach ($fields as $alias => $relation) {
                        if (!isset($modx->map[$class][$tmp][$alias])) {
                            $modx->map[$class][$tmp][$alias] = $relation;
                        }
                    }
                }
            }
        }
        break;
    case 'OnDocFormPrerender':
        $tags_cloud = $resource->get('tags_cloud');
        $tags_cloud = $modx->toJSON($tags_cloud);
        $modx->log(1, print_r($tags_cloud, 1));
        
        $modx->controller->addHtml("
        <script type='text/javascript'>
            Ext.ComponentMgr.onAvailable('modx-panel-resource', function(){
                const leftCol = this.items[1].items[0].items[0].items[0];
                const rightCol = this.items[1].items[0].items[0].items[1];
                config = [] || config || {};
                
                const tags_cloud = {
                    typeAhead: true,
                    triggerAction: 'all',
                    lazyRender: true,
                    resizable: true,
                    anchor: '100%',
                    description: '<b>[[*tags_cloud]]</br>Облако тегов</b>',
                    fieldLabel: 'Облако тегов',
                    id: 'modx-resource-tags_cloud',
                    maxLength:255,
                    msgTarget: 'under',
                    name:'tags_cloud',
                    hiddenName: 'tags_cloud',
                    xtype: 'superboxselect', // combo, modx-combo - одиночный выбор, а combobox и другие не работают
                    store: new Ext.data.JsonStore({
                        id: 'tags_cloud-store',
                        root: 'results',
                        autoLoad: false,
                        autoSave: false,
                        totalProperty: 'total',
                        //fields: ['value'],
                        fields: $tags_cloud,
                        url: MODx.config.connectorUrl,
                        baseParams: {
                            action: 'mgr/item/getoptions',
                            key: 'tags_cloud'
                        }
                    }),
                    mode: 'remote',
                    displayField: 'value',
                    valueField: 'value',
                    
                    extraItemCls: 'x-tags_cloud',
                    expandBtnCls: 'x-form-trigger',
                    clearBtnCls: 'x-form-trigger',
                    renderTo: Ext.getBody(),

                    editable: true,
                    selectOnFocus: false,
                    preventRender: true,
                    forceSelection: true,
                    enableKeyEvents: true,
                    displayField: ['value'],
                    valueField: ['value'],
                    //value: $tags_cloud,
                    hiddenValue: $tags_cloud,
                    emptyText: 'Выбирете или введите теги',
                    tpl: new Ext.XTemplate('<tpl for=\".\"><div class=\"x-combo-list-item\"><span>{value}</span></div></tpl>',{ compiled: true })
                }

                rightCol.items.splice(3, 0,  tags_cloud); // поле выводится там где сменить Шаблон, Пункт меню
            });
        </script>");
    break;
}
Кровельный
08 июня 2023, 10:16
0
Вот самый простой вариант, но только для админа.
<?php
switch ($modx->event->name) {
    case 'OnDocFormPrerender':
        if ($doc = $modx->getObject('modDocument', $id)) {
            if ($doc->get('richtext') == 1 && $modx->user->id == 1) {
                $script = '';
                $script .= "MODx.ux.Ace.replaceTextAreas(Ext.query('#ta'));";
                $script .= "Ext.select('.x-form-textarea.x-form-field.ace_editor');";
                $modx->controller->addHtml('<script>Ext.onReady(function() {' . $script . '});</script>');
            }
        }
        if (!$modx->controller->resourceArray) {
            return;
        }
        break;
    default:
        return;
}
Кровельный
30 мая 2023, 10:57
0
Работа с ТВ: Заменить значение в ТВ — не работает
Пакет уже обновлён до последней версии: mspre-2.4.5-pl

В функции newValue. Файла core/components/mspre/model/mspre/mspretvfield.class.php:55 — закомментируйте эту строку
<?php
/*if (empty($current)) {
    return false;
}*/
И всё. Заработает!