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

Володя
05 декабря 2023, 12:24
0
вероятно можно. Под рукой нет mFiter2.
deleted
05 декабря 2023, 12:12
0
При попытке применить их на моем сайте выплыли проблемы:
1. Redirector не позволял создать редирект на произвольный url, он обязательно хотел видеть в качестве цели существующий ресурс. А мне так не нужно было, у меня страницы генерируются своим плагином, обрабатывающим событие OnPageNotFound, т.е. целевого ресурса как такового на сайте нет.
2. autoRedirector больше заточен на отслеживание измененных url, ну и у него та же особенность — конечный url редиректа должен принадлежать существующему ресурсу.
Есть ещё Seo Suite. Не знаю, есть ли там такие проблемы
Володя
05 декабря 2023, 12:10
0
попробуйте заменить на этот плагин. там добавлен iterator_to_array для $modx->getIterator
<?php
$resourceEvents = array('OnBeforeDocFormSave', 'OnDocFormSave');
if (in_array($modx->event->name, $resourceEvents)) {
    foreach($scriptProperties as & $object){
        if(
            is_object($object)
            AND $object instanceof modResource
            AND $original = $modx->getObject('modResource', $object->id)
        ){
            $resource = $object;
            break;
        }
    }
}
switch ($modx->event->name) {
    case "OnManagerPageInit":
        $cssFile = MODX_ASSETS_URL.'components/autoredirector/css/mgr/main.css';
        $modx->regClientCSS($cssFile);
        break;

    case "OnBeforeDocFormSave":
        $resources = array(
            $resource,
            $modx->getObject('modResource',$resource->get('parent'))
        );
        if($child_ids = $modx->getChildIds($resource->id,50,array('context' => $resource->context_key))){
            $resources = array_merge($resources, iterator_to_array($modx->getIterator('modResource',array("id:IN" => $child_ids))));
        }
    case "OnResourceBeforeSort":
        if (empty($resources)) {
            foreach ($nodes as $node) {
                $resources[] = $modx->getObject('modResource',$node['id']);
            }
        }
        foreach ($resources as $res) {
            if (!empty($res)) {
                if (!$res->getProperty('old_uri','autoredirector')) {
                    $res->setProperty('old_uri',$res->get('uri'),'autoredirector');
                    $res->save();
                }
            }
        }
        break;
    case "OnDocFormSave":
        $resources = array(
            $resource,
            $modx->getObject('modResource',$resource->get('parent'))
        );
        if($child_ids = $modx->getChildIds($resource->id,50,array('context' => $resource->context_key))){
            $resources = array_merge($resources, iterator_to_array($modx->getIterator('modResource',array("id:IN" => $child_ids))));
        }
    case "OnResourceSort":
        if (empty($resources)) {
            foreach ($nodesAffected as $node) {
                $resources[] = $node;
            }
        }
        $modelPath = $modx->getOption('autoredirector_core_path',null,$modx->getOption('core_path').'components/autoredirector/').'model/';
        $modx->addPackage('autoredirector', $modelPath);
        $processorProps = array('processors_path' => $modx->getOption('autoredirector_core_path',null,$modx->getOption('core_path').'components/autoredirector/').'processors/');
        foreach ($resources as $res) {
            if (!empty($res)) {
                $old_uri = $res->getProperty('old_uri','autoredirector');
                $current_uri = $res->getAliasPath($res->get('alias'));
                if ($old_uri && $current_uri != $old_uri) {
                    $currentRuleQ = array('uri' => $current_uri);
                    if (!$modx->getOption('global_duplicate_uri_check')) {
                        $currentRuleQ['context_key'] = $res->get('context_key');
                    }
                    if ($currentRule = $modx->getObject('arRule', $currentRuleQ)) {
                        $response = $modx->runProcessor('mgr/item/remove', $currentRule->toArray(), $processorProps);
                        if ($response->isError()) {
                            $modx->log(modX::LOG_LEVEL_ERROR, 'AutoRedirector removing error. Message: '.$response->getMessage());
                        }
                    }
                    $arRule = array('uri' => $old_uri
                                    , 'context_key' => $res->get('context_key')
                                    , 'res_id' => $res->get('id'));
                    if (!$modx->getObject('arRule', $arRule)) {
                        $response = $modx->runProcessor('mgr/item/create', $arRule, $processorProps);
                        if ($response->isError()) {
                            $modx->log(modX::LOG_LEVEL_ERROR, 'AutoRedirector creating error. Message: '.$response->getMessage());
                        }
                    }
                }
                $res->setProperty('old_uri',$current_uri,'autoredirector');
                $res->save();
            }
        }
        break;
    case "OnPageNotFound":
        $uri = $_SERVER['REQUEST_URI'];
        $uri = str_replace($modx->getOption("site_url"),"",$uri);
        if (substr($uri, 0, 1) == "/") $uri = substr($uri, 1);
        $getparams = '';
        if (mb_strpos($uri,'?') !== FALSE) {
            $uri_split = explode('?',$uri);
            $uri = $uri_split[0];
            if(!$modx->getOption("autoredirector_clear_get",null, 0)) {
                $getparams = $uri_split[1];
            }
        }
        $uri = urldecode($uri);

        $RuleQ = array('uri' => $uri);
        if (!$modx->getOption('global_duplicate_uri_check')) {
            $RuleQ['context_key'] = $modx->context->get('key');
        }
        $modelPath = $modx->getOption('autoredirector_core_path',null,$modx->getOption('core_path').'components/autoredirector/').'model/';
        $modx->addPackage('autoredirector', $modelPath);
        if ($Rule = $modx->getObject('arRule', $RuleQ)) {
            if ($url = $modx->makeUrl($Rule->get('res_id'),'',$getparams)) {
                $modx->sendRedirect($url,array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
            }
        }
        break;
}
Giant Dad
05 декабря 2023, 12:01
0
Прошу прощения, изначально вопрос был некорректно сформулирован. Можно ли сделать сортировку по ajax (по кнопке Сортировать по цене) таким образом, чтобы товары с нулевой ценой всегда были в конце выдачи?
Володя
05 декабря 2023, 11:47
1
+1
можно попробовать как при убывающей сортировке
&sortby=`{"COALESCE(NULLIF(price,0),0)":"DESC"}`
или при возрастающей
&sortby=`{"COALESCE(NULLIF(price,0),9999999)":"ASC"}`
Pandemic
05 декабря 2023, 11:41
0
Как вы в итоге решили новую проблему? у меня ошибка появляется такая:
(
    [code] => 138
    [message] => Secret incorrect error
)
Володя
05 декабря 2023, 11:36
0
там в плагине ошибка
if($child_ids = $modx->getChildIds($resource->id,50,array('context' => $resource->context_key))){
            $resources = array_merge($resources, $modx->getIterator('modResource',array("id:IN" => $child_ids)));
        }
версия php не причем
Дмитрий
04 декабря 2023, 14:12
0
Зачем? это из ЧатГПТ скопировано? Во время установки панели всё должно установиться и так, а все настройки можно сделать прямо в панели. У некоторых хостеров можно выбрать готовые образы сразу с предустановленной панелью.
Sergei Petrov
04 декабря 2023, 13:13
-2
Для выполнения данной настройки, следуйте приведенным ниже инструкциям:

Установите Nginx и PHP-FPM:
a. Обновите список пакетов и установите Nginx:

sudo apt update
sudo apt install nginx
b. Установите PHP-FPM и необходимые расширения:

sudo apt install php-fpm php-mysql
Настройте Nginx для обработки PHP-кода:
Создайте файл конфигурации виртуального хоста для вашего домена (например, example.com) в каталоге /etc/nginx/sites-available:

sudo nano /etc/nginx/sites-available/example.com
Вставьте следующую конфигурацию:

server {
listen 80;
listen [::]:80;

root /var/www/example.com;
index index.php index.html;

server_name example.com www.example.com;

location / {
try_files $uri $uri/ =404;
}

# Обработка PHP-запросов
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}

3. Создайте симлинк на созданный файл конфигурации:

```sh
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
Перезагрузите Nginx:
sudo systemctl reload nginx
Установите FastPanel и настройте MODX:
Для установки FastPanel, вам потребуется зарегистрировать аккаунт на их сервере и следовать инструкциям по установке. Процесс может отличаться в зависимости от того, используете ли вы установщик FastPanel или устанавливаете самостоятельно.

После успешной установки FastPanel, вы можете использовать его для настройки MODX. Вам потребуется создать новый сайт в панели управления и выбрать MODX в качестве используемой CMS. Затем следуйте инструкциям, предоставленным FastPanel для завершения настройки.

Обратите внимание, что процесс настройки может быть различным в зависимости от версии MODX, которую вы используете. В данном случае, мы используем MODX Revolution 2.8.5.

Пожалуйста, убедитесь, что вы следуете инструкциям, соответствующим вашей версии MODX.
Наумов Алексей
04 декабря 2023, 12:20
0
И Redirector, и autoRedirector и easyRedirects имеют в своём составе плагин, который висит на событии OnDocFormSave и отслеживают изменение url ресурса.

Но есть одно но) Все компоненты для того чтобы узнать какой был старый url у страницы — они его сохраняют где-то заранее, к примеру на событии OnBeforeDocFormSave (в properties ресурса) или OnDocFormRender (в сессию). И только потом на OnDocFormSave уже идет сравнение старого адреса и нового и при необходимости создание редиректа.
Ну в общем то любой компонент для импорта событие OnDocFormRender точно не вызовет.
В принципе OnBeforeDocFormSave в autoRedirector вроде как должен срабатывать, если msImportExport обновляет товар через процессор resource/update… но не знаю, не разбирался.

В общем для них лучше свой плагин написать с созданием правил редиректа (благо там и нужно то заполнить 2 поля минимально), насколько помню у того же msImportExport есть событие, куда приходят данные при обновлении товара.
Сергей
04 декабря 2023, 11:52
0
Приветствую! Было бы круто, если бы компонент автоматически проставлял 301 редирект при смене адреса страницы, товара… Я не смог найти компонент, который бы автоматически их ставил, если товары выгружаются из 1с или из файла xls. Речь идет о msImportExport и о mSync
Антон
04 декабря 2023, 01:05
0
Спасибо, но не помогло(
Владимир
04 декабря 2023, 00:31
0
Помогло сделать вот так:
preg_replace('/(\[+|\]+)/', '', $curl_body);
Всем спасибо за поддержку! :)
Дмитрий Середюк
04 декабря 2023, 00:19
+1
Возможно дело в каком то плагине с событием OnDocFormSave по отключайте плагины по очередно.
Владимир
03 декабря 2023, 23:50
0
Разобрался в чем дело. Это приходит и правда извне, с другого сайта, с которого регулярно у меня парсятся товары. Парсящий PHP-скрипт запускается отдельно по крону, но в нем я использую MODX API для удобства. И вот из-за того, что данные куски кода на сайте источнике обрамлены в [[...]], то modParser думает, что тут происходит вызов сниппета. Хотя этот результат вообще не должен по идее обрабатываться парсером Модекса. Это еще предстоит разобраться почему так выходит…
Владимир
03 декабря 2023, 23:32
0
Нет, все нужные скрипты внутри, там же, где сайт. Соответственно, были просканированы
Володя
03 декабря 2023, 06:29
0
А внешние скрипты у вас не подключаются да?
Владимир
03 декабря 2023, 00:59
0
Да, но даже фрагментов из этой строки не находится в содержимом файлов сайта, даже такого фрагмента «w.Callbacks» там нет. Пришла пора поверить в магию? :)
disk.yandex.ru/i/98Uosztw7QTUdQ
Володя
02 декабря 2023, 21:21
0
notify","progress",w.Callbacks("memory"),w.Callbacks("memory"),2],["resolve","done",w.Callbacks("once
Ну вот это же явно js.