Всего 123 811 комментариев

Alexey
30 ноября 2022, 08:42
+2
Да, вчера обратил внимание, что если закомментить указанную строку в файле processors/mgr/file/export.class.php ( if ($new_session == 'new_session') ), то начинается проблема при запуске генерации прайса с большим количеством позиций из админки, там же за несколько этапов генерация идет, каждый раз новую сессию создавая, и подумал, что нужно попозжЕ попытаться пробросить параметр из скрипта для крона, но vectorserver опередил))), за что ему снова человеческое спасибо!

Кстати, при запуске кода для крона, можно убрать эту строку:

$modx->user = $modx->getObject('modUser', 1);

авторизация при запуске процессора не требуется, как выяснилось — проверил в инкогнито, всё работает.
Алексей
30 ноября 2022, 08:39
0
Может кому будет полезно, надо добавить сортировку
'sortby' => 'FIELD(modResource.parent, '~ $_modx->resource.parent ~ ')'

В итоге получаем
{'!pdoResources' | snippet: [
'parents' => 2,
'resources'=> '-' ~ $_modx->resource.id,
'limit' => '10',
'hideContainers' => 1,
'sortby' => 'FIELD(modResource.parent, '~ $_modx->resource.parent ~ ')'
]}
Александр Туниеков
30 ноября 2022, 07:32
0
Использование jquery большая часть разработчиков считает излишним в 2022. Код давно пишут на чистом JS.
Я как раз пишу на jquery. На чистом js писать могу научиться, но код на js растягивается Меня добивает что на jquery можно написать
$(".nav-img").css('width', 33);

а на чистом надо целых 4 строки
var vNavimg = document.getElementsByClassName("nav-img");
for(var i=0;i<vNavimg.length;i++){
    vNavimg[i].style.height = "33px";
}
Для использования цифрового слайдера и авто подсказок используется jquery UI. Это лишняя устаревшая зависимость. Есть плагины, которые реализуют подобное качественнее. Кроме того слайдер не работает на телефонах.
не знал что jquery UI не работает на телефонах. Какой компонент посоветуете? И вообще под телефоны надо для фильтров верстку другую. Потом думать буду.
Привязка к ID на страницах. Тоже можно к проблемам отнести. Переиспользовать код на странице несколько раз не получится. Сейчас подобные вещи обычно к data атрибутам и классам привязывают.
От ID я избавился, но переиспользовать код не получиться. Адресная строка одна и 2 фильтра в нее писать не могут. Я начал делать для 2 и более фильтров на странице, но отказался и отменил изменения.
Сам по себе код большой, объемный трудночитаемый. В современном мире разработки обычно принято разбивать код на логические куски и выносить в отдельные модули.
если вникнуть в код то на вполне логические блоки разбито. Можно разбить и по другому, но не факт что получиться лучше. Тем более у меня с этим не айс.
vectorserver
30 ноября 2022, 06:53
1
+2
Нужно еще просто было указать в параметрах, еще один ключ stage

$params = array(
    'crontab' => true,    
    'stage' => 'new_session',
    'id' => 2,
);


Готовый рабочий вариант:
<?php
define('MODX_API_MODE', true);
require '../index.php';

/* @var modX $modx */

//Дадим права админа навыполнение процессора
$modx->user = $modx->getObject('modUser', 1);

//id строки в таблице (колонка ID), таб "Прайс-листы"
$row_ID = 2;

/** @var msPriceList $msPriceList */
$msPriceList = $modx->getService('msPriceList', 'msPriceList', MODX_CORE_PATH . 'components/mspricelist/model/');

$corePath = $modx->getOption('mspricelist_core_path', null, $modx->getOption('core_path') . 'components/mspricelist/');
$path = $modx->getOption('processorsPath', $msPriceList->config, $corePath . 'processors/');


/* @var modX $modx */
$params = array(
    'crontab' => true,
    'stage' => 'new_session',
    'id' => $row_ID,
);

/* @var modProcessorResponse $response */
$response = $modx->runProcessor('mgr/file/export', $params, array(
    'processors_path' => $path
));

if ($response->isError()) {
    die($response->getMessage());
} else {
    echo json_encode($response->response);
}
Артур Шевченко
29 ноября 2022, 22:01
0
Уважаемый, тут гадалок нет. Есть стандартные пути поиска ошибки: консоль браузера, журнал ошибок админки, лог ошибок php на сервере. В одном из этих мест или во всех сразу точно есть записи касающиеся вашей проблемы. И вот если вы их предъявите, можно будет предложить какое-то решение.
Артур Шевченко
29 ноября 2022, 21:58
0
Ошибка 500 всегда должна что-то записывать в лог ошибок сервера. Смотри там.
Константин Ильин
29 ноября 2022, 19:37
0
Ребят, подскажите по событиям msOnBeforeValidateOrderValue и msOnValidateOrderValue

Задача такая. Есть скрытое пол $typepayer значения либо 1 либо 2. Если 2 то нужно проверить заполненость ИНН
switch ($modx->event->name) {
    case "msOnValidateOrderValue":
        if ($key === 'typepayer') {
            $data = $order->get();
            
            // Если Юр лицо(val = 2) проверяем заполненость ИНН
            if($data['typepayer'] == 2 && empty($data['inn'])){
                
                $modx->log(1, print_r($data, 1));
                $modx->log(1, print_r($key, 1)); 
                //$modx->event->returnedValues['value'] = false;
                //$modx->event->output("Yыфвфы");    
                //return INN false
            }
        }
    break;
}
Никак не соображу как вернуть error для поля инн, чтобы оно загорелось красным, в документации ничего не нашел про ответ плагинов и верно ли я выбрал событие под такую задачу?
по логике нужно вернуть ключ поля с false, но что найти не могу и понять…
Не нужно добавлять поле ИНН в где-то в msOnBeforeAddToOrder или msOnAddToOrder?
Алексей
29 ноября 2022, 18:58
0
Путь понятен, но он не туда
{'!pdoResources' | snippet: [
'parents' => 2,
'resources'=> '-' ~ $_modx->resource.id,
'limit' => '10',
'hideContainers' => 1
]}
Сейчас в моем снипете уже указано условие не выводить Контейнеры вообще и не выводить текущий ресурс. Мне нужны все остальные ресурсы, которые находятся в главном ресурсе-контейнере(2), но сначала надо выводить имеющиеся ресурсы соседние по бокам текущего ресурса.
т.е. если я вывожу ресурс 42 — Сначала должны вывестись ресурсы 41,43, а затем уже 31,32 и т.д. но не больше 10 штук
Алексей Смирнов
29 ноября 2022, 18:49
0
Чем ресуры 31-35 отличаются от 3,4,5,6? (Шаблон? класс?)
Если ничем, то возможно если 31-35 это не контейнеры, то вывод можно организовать сосздав условие isfolder = 0, а контейнеры можно выводить с условием isfolder = 1.
НО если у ресов есть отличие в Шаблоне, то Параметр template в помощь.
Надеюсь путь понятен.
Алексей
29 ноября 2022, 18:38
0
--Ресурс(Контейнер)(2)
— — Ресурс(Контейнер)(3)
— — — Ресурс(31)
— — — Ресурс(32)
— — — Ресурс(33)
— — — Ресурс(34)
— — — Ресурс(35)
— — Ресурс(Контейнер)(4)
— — — Ресурс(41)
— — — Ресурс(42)
— — — Ресурс(43)
— — Ресурс(Контейнер)(5)
— — Ресурс(Контейнер)(6)
… т.д.

Вот такая структура, а соседей я считаю только по бокам, пример с 31 по 35 находящихся в одном контейнере(3). Вот их надо выводить в первую очередь, исключая текущий. А затем уже остальные ресурсы-контнейры 4, 5 и т.д.
Петропавловский Артем
29 ноября 2022, 16:44
0
Да, этого не хватало. Спасибо! Тоже на ковыряние много времени убил.
Alexey
29 ноября 2022, 16:35
+1
Совсем забыл про существенный момент — столько времени компонент ковырял, что память стала подводить))

В файле core/components/mspricelist/processors/mgr/file/export.class.php в методе startExport закомментил это условие:



Без этого запуск генерации прайс-листа из внешнего файла не происходит
Артур Шевченко
29 ноября 2022, 15:40
0
Если вы на сайте с modx получаете данные, не важно откуда, вы можете использовать его методы для вывода их на фронт. Если вы получаете данные во внешнем файле, то чтобы использовать методы modx, надо его подключить, а дальше можно творить что душе угодно.
Pavel
29 ноября 2022, 13:14
0
Данные обновляются постоянно.
Нашел способ вывести это через echo c html разметкой, но не уверен, что так правильно.
$mysqli = new mysqli("localhost", "root", "toor", "new", "3306", "utf8");

$queryfull = "SELECT `Users`.`ID` AS `ID`,
					`Users`.`Name`,
					`Mail`,
					`Position`,
					`Department`,
					`WorkPhone`,
					`Cellphone`,
					((DAYOFMONTH(Birthday) = DAYOFMONTH(NOW()))
					& (MONTH(Birthday) = MONTH(NOW())))
					AS bday
				FROM `new`.`Users`
				WHERE NOT Fired AND Department != ''
				ORDER BY `Department`, `Name`";

$fullresult = $mysqli->query($queryfull);

    echo "
        <div class=\"uk-panel uk-panel-box uk-panel-contents uk-container\">";
    echo "
        <div class=\"uk-card uk-card-default uk-card-body uk-overflow-auto\">";
    echo "
        <table class=\"uk-table\" border=0 width=\"100%\">";

while ($full = $fullresult->fetch_object())
{
        if ($dept != $full->Department)
    {
        $dept = $full->Department;
        echo "
            <tr align=\"left\">
.................
Алексей Смирнов
29 ноября 2022, 13:04
0
Если вам не нужна связь с MODX и вам это нужно примерно 1 раз в столетие…
то самый быстрый вариант накостылить html в самом файле.
Если связь есть и есть еще какие-то обстоятельства, которые мы не знаем, то нужно подключить API MODX и применить метод $modx->getChunk

без MODX еще есть пару вариантов, но тогда погружаться в php поглубжее надо.
Pavel
29 ноября 2022, 11:23
0
Читал, но не понял, как это использовать в случае внешней БД
Артур Шевченко
29 ноября 2022, 11:14
+1
Посмотрите в сторону таких методов Modx как getChunk и parseChunk.
Алексей Смирнов
29 ноября 2022, 10:54
+4
Подскажите, Виктор. Какой смысл в минусовании ответов людей вы вкладываете?
На ваш вопрос как минимум 1 участник ответил правильно и объяснил причину. Вроде бы ему "+" нужно ставить за то время что он потратил на ответ на Ваш вопрос.
Я хочу понять Вас. Спасибо.
Алексей Смирнов
29 ноября 2022, 10:05
0
ВЫ не поняли. Вопрос в том, что вы понимаете под СОСЕДНИМИ ресурсами? Это родители или это дочерние или иные из другого ресурса. я просто не понимаю что такое сосед. тк соседи и с верху есть и с низу и побокам… МОжет если опишите структуру подробнее станет понятнее. Например деревовидная обычно используется:
Индекс (0)
— Ресурс (2)
— — вложенный (100)
— — — вложенный глубже (1500)
— — вложенный (200)
— Еще ресурс (15)
— Ресурсо (18)