Кровельный

Кровельный

С нами с 30 мая 2023; Место в рейтинге пользователей: #7219
Кровельный
06 ноября 2024, 11:13
0
MODX Revolution 2.8.3-pl
87.include.cache.php — Плагин: webpgenerator (87)

[2024-11-06 11:08:33] (ERROR @ /var/www/www-root/data/www/site.ru/core/components/webpgenerator/classes/ImageConverter.php : 145) PHP warning: exif_imagetype(/var/www/www-root/data/www/site.ru/assets/components/phpthumbof/cache/7040%2821%29.0211e0a20652fcdffc397d1f517afe76.jpg): failed to open stream: No such file or directory
[2024-11-06 11:08:33] (ERROR @ /var/www/www-root/data/www/site.ru/core/components/webpgenerator/classes/ImageConverter.php : 147) PHP warning: array_key_exists(): The first argument should be either a string or an integer
[2024-11-06 11:08:33] (ERROR @ /var/www/www-root/data/www/site.ru/core/components/webpgenerator/elements/plugins/plugin.webpgenerator.php : 143) User warning: InvalidArgumentException: Cannot detect /var/www/www-root/data/www/site.ru/assets/components/phpthumbof/cache/7040%2821%29.0211e0a20652fcdffc397d1f517afe76.jpg extension in /var/www/www-root/data/www/site.ru/core/components/webpgenerator/classes/ImageConverter.php:148
Stack trace:
#0 /var/www/www-root/data/www/site.ru/core/components/webpgenerator/classes/ImageConverter.php(43): ImageConverter->getRealExtension('/var/www/www-ro...')
#1 /var/www/www-root/data/www/site.ru/core/components/webpgenerator/classes/ImageConverter.php(33): ImageConverter->loadImage('/var/www/www-ro...')
#2 /var/www/www-root/data/www/site.ru/core/components/webpgenerator/elements/plugins/plugin.webpgenerator.php(141): ImageConverter->convert('/var/www/www-ro...', '/var/www/www-ro...', 95)
#3 /var/www/www-root/data/www/site.ru/core/cache/includes/elements/modplugin/87.include.cache.php(2): include_once('/var/www/www-ro...')
#4 /var/www/www-root/data/www/site.ru/core/model/modx/modscript.class.php(76): include('/var/www/www-ro...')
#5 /var/www/www-root/data/www/site.ru/core/model/modx/modx.class.php(1674): modScript->process(NULL)
#6 /var/www/www-root/data/www/site.ru/core/model/modx/modresponse.class.php(83): modX->invokeEvent('OnWebPagePreren...')
#7 /var/www/www-root/data/www/site.ru/core/model/modx/modrequest.class.php(138): modResponse->outputContent(Array)
#8 /var/www/www-root/data/www/site.ru/core/model/modx/modrequest.class.php(122): modRequest->prepareResponse()
#9 /var/www/www-root/data/www/site.ru/core/model/modx/modx.class.php(1461): modRequest->handleRequest()
#10 /var/www/www-root/data/www/site.ru/index.php(54): modX->handleRequest()
#11 {main}
Кровельный
10 июля 2024, 17:03
0
Из примера сниппета title можно сделать [[+pagetitle:title]] или {$_pls['pagetitle']|title}, на крайний случай экранировать [[+pagetitle:esc]]
Кровельный
27 июня 2024, 18:41
0
Вы можете не использовать MinifyX для некоторых компонентов, например ms2. Для этого надо унаследовать класс miniShop2 вместе с методом initialize(), и там где вызывается regClientScript() указать скрипт статично, далее обвернуть его каким-нибудь условием, например для определённых страниц или шаблонов, чтобы не боятся за то, что при обновлении что-то затрётся.

// Пример версионности статичного файла.
public function initialize($ctx = 'web', $scriptProperties = array())
{
    ...
        // Register JS
        $js = trim($this->modx->getOption('ms2_frontend_js'));
        if (!empty($js) && preg_match('/\.js/i', $js)) {
            $jsFile = 'assets/components/minishop2/js/web/minishop.js';
            $jsFileSize = filesize($_SERVER['DOCUMENT_ROOT'].'/'.$jsFile);
            $this->modx->regClientScript($jsFile.'?v='.$jsFileSize);
            ...
        }
    ...
}
miniShop2Config, а также можно обвернуть в условие. Или как в примере выше добавить конфиги.

По поводу
и продолжает сохранять файлы в /assets/minifyx/ хотя указано /assets/cache/
Тут лучше дождаться ответа разработчика, так как путь assets/components/minifyx/cache обычно идёт по умолчанию, возможно погрешность с вашей стороны или установлен кэш. Логируйте ошибки в журнал и смотрите, что там не так. Да, и ещё указывать из /assets/cache/ нельзя, так как это временная папка, которая очищается.
Кровельный
27 мая 2024, 14:06
0
А вот этот код, передаёт нормально через конфиг:
<?php
class msCartCustomHandler extends msCartHandler {
    /**
    * msCartCustomHandler constructor.
    *
    * @param miniShop2 $ms2
    * @param array $config
    */
    public function __construct(miniShop2 $ms2, array $config = array())
    {
        $this->ms2 = $ms2;
        $this->modx = $ms2->modx;

        $cityFields = $this->modx->getService('cityfields','cityFields', $this->modx->getOption('cityfields.core_path', null, $this->modx->getOption('core_path').'components/cityfields/').'model/cityfields/');
        if ($cityFields instanceof cityFields) {
            if (!empty($cityFields->currentCityId)) {
                $currentCityId = $cityFields->currentCityId;
            }
            
        }
        $this->config = array_merge(array(
            'currentCityId' => $currentCityId,
            'cart' => & $_SESSION['minishop2']['cart'],
            'max_count' => $this->modx->getOption('ms2_cart_max_count', null, 1000, true),
            'allow_deleted' => false,
            'allow_unpublished' => false,
        ), $config);

        $this->cart = &$this->config['cart'];
        $this->modx->lexicon->load('minishop2:cart');

        if (empty($this->cart) || !is_array($this->cart)) {
            $this->cart = array();
        }
    }
    
   /**
     * @param array $data
     *
     * @return array
     */
    public function status($data = array())
    {
        $status = [
            'total_count' => 0,
            'total_cost' => 0,
            'total_weight' => 0,
            'total_discount' => 0,
            'total_positions' => count($this->cart),
        ];
        foreach ($this->cart as $item) {
            if (empty($item['ctx']) || $item['ctx'] == $this->ctx) {
                $status['total_count'] += $item['count'];
                $status['total_cost'] += $item['price'] * $item['count'];
                $status['total_weight'] += $item['weight'] * $item['count'];
                $status['total_discount'] += $item['discount_price'] * $item['count'];
            }
        }

        $status = array_merge($data, $status);

        $response = $this->ms2->invokeEvent('msOnGetStatusCart', [
            'status' => $status,
            'cart' => $this,
        ]);
        if ($response['success']) {
            $status = $response['data']['status'];
        }
        $this->modx->log(1, print_r($this->config['currentCityId'], 1));

        return $status;
    }
}
?>
Кровельный
27 мая 2024, 11:11
0
Не получается присоединить конструктор, а при вызове someMethod() ошибка 500.
<?php
class msCartCustomHandler extends msCartHandler {
    public function __construct(modX & $modx, array $config = array()) {
        parent::__construct($modx, $config);
        // Ваш код инициализации здесь
    }

    public function someMethod() {
        // Пример вызова метода getService
        $cityFields = $this->modx->getService('cityfields','cityFields', $this->modx->getOption('cityfields.core_path', null, $this->modx->getOption('core_path').'components/cityfields/').'model/cityfields/');
        
        if ($cityFields instanceof cityFields) {
            // Использование методов компонента
            return $cityFields->currentCityId();
        }
    }
	
    /**
     * @param array $data
     *
     * @return array
     */
    public function status($data = array())
    {
        $status = [
            'total_count' => 0,
            'total_cost' => 0,
            'total_weight' => 0,
            'total_discount' => 0,
            'total_positions' => count($this->cart),
        ];
        foreach ($this->cart as $item) {
            if (empty($item['ctx']) || $item['ctx'] == $this->ctx) {
                $status['total_count'] += $item['count'];
                $status['total_cost'] += $item['price'] * $item['count'];
                $status['total_weight'] += $item['weight'] * $item['count'];
                $status['total_discount'] += $item['discount_price'] * $item['count'];
            }
        }

        $status = array_merge($data, $status);

        $response = $this->ms2->invokeEvent('msOnGetStatusCart', [
            'status' => $status,
            'cart' => $this,
        ]);
        if ($response['success']) {
            $status = $response['data']['status'];
        }
        $this->modx->log(1, print_r($this->someMethod(), 1));

        return $status;
    }
}
?>
Кровельный
13 мая 2024, 11:21
0
[2024-05-13 11:18:51] (ERROR @ Unknown0) PHP warning: Unknown: Cannot call session save handler in a recursive manner
Запись в базу работает, но в журнале эта запись. Кто-то уже сталкивался с этим нюансом?
Кровельный
07 мая 2024, 11:38
0
MODX Revolution 2.8.3-pl
Ace 1.9.4-pl
При выборе ACE ошибка:
Uncaught TypeError: Cannot read properties of null (reading 'match')
    at a.$detectNewLine (ace.min.js?v=2.9.3-pl:1:120718)
    at a.insert (ace.min.js?v=2.9.3-pl:1:122464)
    at a.setValue (ace.min.js?v=2.9.3-pl:1:120356)
    at p.setValue (ace.min.js?v=2.9.3-pl:1:153026)
    at S.setValue (modx.texteditor.js?v=2.9.3-pl:185:38)
    at constructor.setValues (ext-all.js:21:603600)
    at miniShop2.panel.UpdateCategory.setup (modx.panel.resource.js?v=2.9.3-pl:57:28)
    at h.Event.fire (ext-all.js:21:3699)
    at miniShop2.panel.UpdateCategory.fireEvent (ext-all.js:21:687)
    at MODx.FormPanel [as constructor] (modx.panel.js:62:14)
Как выбрать текстовый редактор?
Кровельный
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
1
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';