Всего 123 792 комментария

Александр Туниеков
15 марта 2023, 21:11
0
<?php
$ms = $modx->getService('miniShop2');
if($msOrder = $modx->getObject('msOrder',['num'=>'2303/41'])){
    echo "<p>{$msOrder->createdon}</p>";
}
Ну так дату можно получить заказа с номером 2303/41
А тебе зачем дату?
Генадий
15 марта 2023, 20:56
0
есть ли какие-то подвижки в направлении тем? не могу найти.
Андрей
15 марта 2023, 20:53
0
Нужно время конкретного заказа

Артур Шевченко
15 марта 2023, 20:51
0
А сервер точно apache?
Александр Туниеков
15 марта 2023, 20:02
0
В смысле ухватиться? Можно плагин на событие msOnChangeOrderStatus написать. https://docs.modx.pro/komponentyi/minishop2/razrabotka/sobyitiya
Или что-то другое надо?
Vladimir
15 марта 2023, 19:39
0
1) Везде где есть двойные фигурные скобки замените на одинарные фигурные скобки.
2) Везде где есть знак "+" заменить на знак "$" допустим
{{+pagetitle}}
на
{$pagetitle}

3) плейсхолдеры лучше берите через "$_pls['']" допустим не
{{+360x270}}
а
{$_pls['360x270']}
. и соответственно у вашего превью
{{+360x270.alt}}
не может быть ещё внутреннего значения, ваш
{{+360x270}}
это уже конечная переменная, которая в вашем примере возвращает ссылку на превью в вашем разрешении
4)в феноме нет таких конструкций как ":" и действие, у фенома идёт пайпами через знак "|". соответственно в вашем пример не вот так
{{+menutitle:default=`{{+pagetitle}}`}}
а так
{if $menutitle}{$menutitle}{else}{$pagetitle}{/if}
Скиньте шаблон сюда полностью, посмотрю помогу. Можете поставить плагин modstore.pro/packages/utilities/moddevtools и легко быстро везде заменить разные вещи, допустим {{ на {
Andrey
15 марта 2023, 17:23
0
Кэш чистил.
Нет не уверен.
Если этот чанк отключить, то страница открывается.
Возможно есть еще один чанк, но не могу понять какой.
Алексей Смирнов
15 марта 2023, 16:47
0
Кеш чистили?
Уверены что именно этот кусок кода (чанка) балуется. если убрать его, что будет?
Сергей
15 марта 2023, 16:11
+1
Всё — победил. Сам туплю. Спасибо.
alexandr.skyrda
15 марта 2023, 16:01
0
уже стоит, не помогает(
Andrey
15 марта 2023, 15:45
0
Не помогло, даже если этот чанк сократить до
[[!pdoPage?
	&element=`ms2GalleryResources`
	&depth=`0`
	&limit=`0`
	&sortby=`menuindex`
	&sortdir=`ASC`
	&tplWrapper=`@INLINE <div class="row" id="catalog_inner">[[+output]]</div>`
	&tpl=`@INLINE
        	<div class="col-12 col-md-3" id="grid_element">
                        [[+pagetitle]]
        	</div>
	`
	&typeOfJoin=`Left`
	&includeThumbs=`360x270`
	&includeOriginal=`1`
	&includeContent=`1`
]]
[[!+page.nav]]
Страница выдаёт 500
Артур Шевченко
15 марта 2023, 15:32
0
У вас включен fenom на страницах и вот такой синтаксис {{ ему не нравится. Самый простой вариант заменить {{ на [[ должно помочь.
Andrey
15 марта 2023, 15:31
0
[[!pdoPage?
	&element=`ms2GalleryResources`
	&depth=`0`
	&limit=`0`
	&sortby=`menuindex`
	&sortdir=`ASC`
	&tplWrapper=`@INLINE <div class="row" id="catalog_inner">[[+output]]</div>`
	&tpl=`@INLINE
        	<div class="col-12 col-md-3" id="grid_element">
        		<a href="{$_modx->makeUrl($id)}">
        			<div class="col-offset-1 col-10">
                        <img class="img-fluid mx-auto rounded" src="{{+360x270}}" alt="{{+360x270.alt}}" title="{{+360x270.name}}" />
                        <h5 class="text-center">{{+menutitle:default=`{{+pagetitle}}`}}</h5>
        			</div>
        		</a>
        	</div>
	`
    &tpl_n4=`@INLINE
            <div class="col-12 col-md-3" id="grid_element">
        		<a href="{$_modx->makeUrl($id)}">
        			<div class="col-offset-1 col-10">
                        <img class="img-fluid mx-auto rounded" src="{{+360x270}}" alt="{{+360x270.alt}}" title="{{+360x270.name}}" />
                        <h5 class="text-center">{{+menutitle:default=`{{+pagetitle}}`}}</h5>
        			</div>
        		</a>
        	</div>
        	</div>
        	<div class="row" id="catalog_inner">
    `
	&tplLast=`@INLINE
        	<div class="col-12 col-md-3" id="grid_element">
        		<a href="{$_modx->makeUrl($id)}">
        			<div class="col-offset-1 col-10">
        			    <img class="img-fluid mx-auto rounded" src="{{+360x270}}" alt="{{+360x270.alt}}" title="{{+360x270.name}}" />
                        <h5 class="text-center">{{+menutitle:default=`{{+pagetitle}}`}}</h5>
        			</div>
        		</a>
        	</div>
	`
	&typeOfJoin=`Left`
	&includeThumbs=`360x270`
	&includeOriginal=`1`
	&includeContent=`1`
]]
[[!+page.nav]]
Есть такой чанк отключая который страница перестаёт сыпать ошибку 500 и открывается
Кирилл
15 марта 2023, 15:12
1
0
Тоже хотел, во-первых, поблагодарить Георгия за форму. Но проблема в том, что я сначала потратил 3 дня, чтобы свою сварганить, а потом только ради прикола решил проверить, есть ли в инете готовая))) Да, такое тоже бывает.
В итоге, что мы имеем. Я тоже решил выложить свой результат.
Моя форма дополнена java-скриптом, который подсчитывает общую сумму включённых в таблицу товаров. Также несколько насыщеннее оформлена по стилям (CSS), ну, и является адаптивной (тянется как под альбомную, так и под книжную распечатку). В общем, пользуйтесь на здоровье.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Универсальный передаточный документ</title>

    <style>
        /* Общие */
        /*Структура
        str: 1_1 | 1_2 (1_2_1, 1_2_2, 1_2_3)
        str:     2
        str: 3_1 | 3_2
        str:     4
        str: 5_1 | 5_2
        */
        body {margin: 0px; padding: 0px}
        table {border-collapse: collapse;}
        td {border: 0px solid black}
        th {border: 0px solid black}
        .border_a, .border_a td {border: 4px solid black;} /*Бордюр вокруг*/
        .border_r, .str2 td.border_r {border-right: 4px solid black;} /*Бордюр справа*/
        .border_b {border-bottom: 4px solid black;} /*Бордюр снизу*/
        .border_b_lite {border-bottom: 1px solid black;}
        .bold {font-weight: bold;} /*Жирный шрифт*/
        .footnote {font-size: 70%; text-align: center; vertical-align: top;} /*Сноска -- подпись под строкой*/
        .cut_string {border-right: 10px solid white;} /*Усечение подстрочных линий*/
        .small_text {font-size: 70%} /*Мелкий шрифт*/
        .vertical_text {writing-mode: vertical-lr;} /*Вертикальный текст*/

        /* --str1_2-- Столбец правый _ Строка первая: TABLE + DIV _ НОМЕР СЧЕТА ФАКТУРЫ, ИСПРАВЛЕНИЕ. ПРИЛОЖЕНИЕ №1 */
        .str1_2 {display: flex; justify-content: left;} /*Ставим у родительского блока*/
        .str1_2_1 {width: 45%;}
        .str1_2_2 {width: 55%; line-height: 0; text-align: right;} /* Убираем строки */

        /* --str1_2_3-- */
        .str1_2_3 {width: 100%; margin-bottom: 5px;} /*Ставим у родительского блока*/
        .str1_2 th, .str1_2_3 th {text-align: left; font-weight: normal;}
        .str1_2 th {white-space: pre;}

        /* --str2-- */
        .str2 td {border: 1px solid black; text-align: center; font-size: 90%;}
        .str2 th {text-align: left;}


        /* --str3-- */
        .str3 {width: 100%; margin-top: 15px;} /*Ставим у родительского блока*/

        /* --str4-- */
        .str4 {width: 100%;} /*Ставим у родительского блока*/

        /* --str5-- Столбец 1 и 2 */
        .str5 {display: flex; justify-content: left;} /*Ставим у родительского блока*/
        .str5_1 {width: 50%;}
        .str5_2 {width: 50%;} /* Убираем строки */

        /**/

    </style>
    <script type="text/javascript">
        function startsumms(){
            /*summ('sum1count', 'summ1res');*/
            summ('customPrices1','summPrice1');
            summ('customPrices2','summPrice2');
            summ('customPrices3','summPrice3');
            MakePricesFormat();
            /*window.print()*/;
        }

        function summ(fromClass,toId){
            try{
                var amount = 0;
                var tdArr = document.getElementsByClassName(fromClass);

                for(var i =0; i < tdArr.length; i++){
                    var res = tdArr[i].innerHTML.replace(",", ".");
                    var getint = parseFloat(res);
                    if(!isNaN(getint)){ amount = amount + getint; }
                }
                if(isNaN(amount)){amount=0;}
                document.getElementById(toId).innerHTML = amount;
            }
            catch(e){
                document.getElementById(toId).innerHTML = amount.toFixed(2);
            }
        }

        function MakePricesFormat(){
            var tdArr = document.getElementsByClassName("customPrices");

            for(var i =0; i < tdArr.length; i++)
            {
                var getint = parseFloat(tdArr[i].innerHTML.replace(",", "."));
                if(!isNaN(getint))
                {
                    tdArr[i].innerHTML = parseFloat(tdArr[i].innerHTML.replace(",", ".")).toFixed(2);
                }
            }

            var tdArr = document.getElementsByClassName("sum1count");

            for (var i = 0; i < tdArr.length; i++)
            {
                var getint = parseFloat(tdArr[i].innerHTML.replace(",", "."));
                if (!isNaN(getint))
                {
                    tdArr[i].innerHTML = parseFloat(tdArr[i].innerHTML.replace(",", ".")).toFixed(2);
                }
            }
        }

        function number_to_string(_number) {
            var _arr_numbers = new Array();
            _arr_numbers[1] = new Array('', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', 'десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать');
            _arr_numbers[2] = new Array('', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто');
            _arr_numbers[3] = new Array('', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот');
            function number_parser(_num, _desc) {
                var _string = '';
                var _num_hundred = '';
                if (_num.length == 3) {
                    _num_hundred = _num.substr(0, 1);
                    _num = _num.substr(1, 3);
                    _string = _arr_numbers[3][_num_hundred] + ' ';
                }
                if (_num < 20) _string += _arr_numbers[1][parseFloat(_num)] + ' ';
                else {
                    var _first_num = _num.substr(0, 1);
                    var _second_num = _num.substr(1, 2);
                    _string += _arr_numbers[2][_first_num] + ' ' + _arr_numbers[1][_second_num] + ' ';
                }
                switch (_desc){
                    case 0:
                        var _last_num = parseFloat(_num.substr(-1));
                        if (_last_num == 1) _string += 'рубль';
                        else if (_last_num > 1 && _last_num < 5) _string += 'рублей';
                        else _string += 'рублей';
                        break;
                    case 1:
                        var _last_num = parseFloat(_num.substr(-1));
                        if (_last_num == 1) _string += 'тысяча ';
                        else if (_last_num > 1 && _last_num < 5) _string += 'тысяч ';
                        else _string += 'тысяч ';
                        _string = _string.replace('один ', 'одна ');
                        _string = _string.replace('два ', 'две ');
                        break;
                    case 2:
                        var _last_num = parseFloat(_num.substr(-1));
                        if (_last_num == 1) _string += 'миллион ';
                        else if (_last_num > 1 && _last_num < 5) _string += 'миллиона ';
                        else _string += 'миллионов ';
                        break;
                    case 3:
                        var _last_num = parseFloat(_num.substr(-1));
                        if (_last_num == 1) _string += 'миллиард ';
                        else if (_last_num > 1 && _last_num < 5) _string += 'миллиарда ';
                        else _string += 'миллиардов ';
                        break;
                }
                _string = _string.replace('  ', ' ');
                return _string;
            }
            function decimals_parser(_num) {
                var _first_num = _num.substr(0, 1);
                var _second_num = parseFloat(_num.substr(1, 2));
                var _string = ' ' + _first_num + _second_num;
                if (_second_num == 1) _string += ' копейка';
                else if (_second_num > 1 && _second_num < 5) _string += ' копеек';
                else _string += ' копеек';
                return _string;
            }
            if (!_number || _number == 0) return ''
            if (typeof _number !== 'number') {
                _number = _number.replace(',', '.');
                _number = parseFloat(_number);
                if (isNaN(_number)) return ''
            }
            _number = _number.toFixed(2);
            if(_number.indexOf('.') != -1) {
                var _number_arr = _number.split('.');
                var _number = _number_arr[0];
                var _number_decimals = _number_arr[1];
            }
            var _number_length = _number.length;
            var _string = '';
            var _num_parser = '';
            var _count = 0;
            for (var _p = (_number_length - 1); _p >= 0; _p--) {
                var _num_digit = _number.substr(_p, 1);
                _num_parser = _num_digit +  _num_parser;
                if ((_num_parser.length == 3 || _p == 0) && !isNaN(parseFloat(_num_parser))) {
                    _string = number_parser(_num_parser, _count) + _string;
                    _num_parser = '';
                    _count++;
                }
            }
            if (_number_decimals) _string += decimals_parser(_number_decimals);
            return _string;
        }
    </script>

    <script language="javascript">
        window.onload = function(){
            startsumms();
        };
    </script>
</head>
<body onload="startsumms();">
        <table>
            <tr>
                <td colspan="2" class="border_r" style="width: 8%;">
                    <p style="margin-right: 5px;">Универсальный передаточный документ</p>
                    <p>Статус: <span style="border: 3px solid black; padding: 0px 5px;">1</span></p>
                    <p class="small_text">1 — счет-фактура и передаточный документ (акт)</p>
                    <p class="small_text">2 — передаточный документ (акт)</p>
                </td>
                <td colspan="14">
                    <div class="str1_2">
                        <table class="str1_2_1">
                            <tr>
                                <th style="width: 16%;">Счет-фактура №</th>
                                <td style="width: 18%;" class="border_b_lite cut_string"></td>
                                <td style="width: 4%;">от</td>
                                <td style="width: 22%;" class="border_b_lite"></td>
                                <td style="width: 30px">(1)</td>
                            </tr>
                            <tr>
                                <th>Исправление №</th>
                                <td class="border_b_lite cut_string"></td>
                                <td>от</td>
                                <td class="border_b_lite"></td>
                                <td>(1а)</td>
                            </tr>
                        </table>
                        <div class="str1_2_2">
                            <p class="small_text">Приложение №1</p>
                            <p class="small_text">к постановлению Правительства Российской Федерации от 26 декабря 2011 г. N 1137</p>
                            <p class="small_text">(в ред. постановления Правительства РФ от 19 августа 2017 № 981)</p>
                        </div>
                    </div>
                    <table class="str1_2_3">
                        <tr> <!-- 1 -->
                            <td style="width: 15%" class="bold">Продавец</td>
                            <td colspan="6" class="border_b_lite">123</td>
                            <td style="width: 30px">(2)</td>
                        </tr> <!-- 2 -->
                        <tr>
                            <th>Адрес</th>
                            <td colspan="6" class="border_b_lite">123</td>
                            <td>(2а)</td>
                        </tr>
                        <tr> <!-- 3 -->
                            <th>ИНН/КПП продавца</th>
                            <td colspan="6" class="border_b_lite">123</td>
                            <td>(2б)</td>
                        </tr> <!-- 4 -->
                        <tr>
                            <td>Грузоотправитель и его адрес</td>
                            <td colspan="6" class="border_b_lite">123</td>
                            <td>(3)</td>
                        </tr>
                        <tr> <!-- 5 -->
                            <td>Грузополучатель и его адрес</td>
                            <td colspan="6" class="border_b">123</td>
                            <td>(4)</td>
                        </tr>
                        <tr> <!-- 6 -->
                            <td>К платежно-расчетному документу</td>
                            <td style="width: 5%">№</td>
                            <td style="width: 5%" class="border_b"></td>
                            <td style="width: 5%">от</td>
                            <td colspan="3" class="border_b"></td>
                            <td>(5)</td>
                        </tr>
                        <tr> <!-- 7 -->
                            <td>Документ об отгрузке</td>
                            <td>№ п/п</td>
                            <td class="border_b_lite"></td>
                            <td>№</td>
                            <td style="width: 5%" class="border_b_lite"></td>
                            <td style="width: 5%">от</td>
                            <td class="border_b_lite"></td>
                            <td>(5а)</td>
                        </tr>
                        <tr> <!-- 8 -->
                            <td class="bold">Покупатель</td>
                            <td colspan="6" class="border_b_lite">123</td>
                            <td>(6)</td>
                        </tr>
                        <tr> <!-- 9 -->
                            <td>Адрес</td>
                            <td colspan="6" class="border_b_lite">123</td>
                            <td>(6а)</td>
                        </tr>
                        <tr> <!-- 10 -->
                            <td>ИНН/КПП покупателя</td>
                            <td colspan="6" class="border_b_lite">123</td>
                            <td>(6б)</td>
                        </tr>
                        <tr> <!-- 11 -->
                            <td>Валюта: наименование, код</td>
                            <td colspan="6" class="border_b_lite">Российский рубль, 643</td>
                            <td>(7)</td>
                        </tr>
                        <tr> <!-- 12 -->
                            <td colspan="5">Идентификатор государственного контракта, договора (соглашения) (при наличии)</td>
                            <td colspan="2" class="border_b_lite"></td>
                            <td>(8)</td>
                        </tr>
                    </table>

                </td>
            </tr>
                    <!--table class="str2"-->
                        <tr class="border_a str2"> <!-- 1 -->
                            <td rowspan="2" style="width: 3%">№<br />п/п</td>
                            <td rowspan="2" class="border_r" style="width: 5%">Код товара/ работ, услуг</td>
                            <td rowspan="2">Наименование товара (описание выполненных работ, оказанных услуг), имущественного права</td>
                            <td rowspan="2">Код вида товара</td>
                            <td colspan="2">Единица измерения</td>
                            <td rowspan="2" style="height: 150px;" class="vertical_text">Количество (объем)</td>
                            <td rowspan="2">Цена (тариф) за единицу измерения</td>
                            <td rowspan="2" style="height: 150px;" class="vertical_text">Стоимость товаров (работ, услуг), имущественных прав без налога – всего </td>
                            <td rowspan="2">В том числе сумма акциза</td>
                            <td rowspan="2">Налоговая ставка</td>
                            <td rowspan="2" style="height: 150px;" class="vertical_text">Сумма налога, предъявляемая покупателю</td>
                            <td rowspan="2" style="height: 150px;" class="vertical_text">Стоимость товаров (работ, услуг), имущественных прав с налогом – всего</td>
                            <td colspan="2">Страна происхождения товара</td>
                            <td rowspan="2" style="height: 150px;" class="vertical_text">Регистрационный номер таможенной декларации</td>
                        </tr>
                        <tr class="border_a str2"> <!-- 2 -->
                            <td>Код</td>
                            <td>Условное обозначение (национальное)</td>
                            <td>Цифровой код</td>
                            <td>Краткое наименование</td>
                        </tr>
                        <tr class="str2"> <!-- 3 -->
                            <td>А</td>
                            <td class="border_r str2">Б</td>
                            <td>1</td>
                            <td>1а</td>
                            <td>2</td>
                            <td>2а</td>
                            <td>3</td>
                            <td>4</td>
                            <td>5</td>
                            <td>6</td>
                            <td>7</td>
                            <td>8</td>
                            <td>9</td>
                            <td>10</td>
                            <td>10а</td>
                            <td>11</td>
                        </tr>
                        <tr netixexp='[%foreach{this.Items;1;49}%]' class="str2"> <!-- 4 -->
                            <td>123</td>
                            <td class="border_r">123</td>
                            <td style="text-align: left;">123</td>
                            <td></td>
                            <td>321</td>
                            <td>321</td>
                            <td>321</td>
                            <td>321</td>
                            <td class="customPrices1">321</td>
                            <td></td>
                            <td>321</td><!---->
                            <td class="customPrices2">321</td>
                            <td class="customPrices3">321</td>
                            <td></td>
                            <td></td>
                            <td>321</td>
                        </tr>
                        <tr class="border_a str2"> <!-- 5 -->
                            <td></td>
                            <td class="border_r"></td>
                            <th colspan="6">Всего к оплате:</th>
                            <td id='summPrice1'>0,00</td>
                            <td colspan="2">X</td>
                            <td id='summPrice2'>0,00</td>
                            <td id='summPrice3'>0,00</td>
                            <td></td>
                            <td></td>
                            <td></td>
                    <!--/table-->
            </tr>
            <tr>
                <td colspan="2" class="border_r"><p>Документ составлен на <span style="border-bottom: 3px solid black; padding: 0px 5px;">3</span> листах</p></td>
                <td colspan="14">
                    <table class="str3">
                        <tr>
                            <td style="width: 20%">Руководитель организации или иное уполномоченное лицо</td>
                            <td style="width: 8%" class="border_b_lite"></td>
                            <td style="width: 20%" class="border_b_lite"></td>
                            <td style="width: 20%">Главный бухгалтер или иное уполномоченное лицо</td>
                            <td style="width: 8%" class="border_b_lite"></td>
                            <td style="width: 20%" class="border_b_lite"></td>
                        </tr>
                        <tr>
                            <td></td>
                            <td class="footnote cut_string">подпись</td>
                            <td class="footnote">Ф.И.О.</td>
                            <td></td>
                            <td class="footnote cut_string">подпись</td>
                            <td class="footnote">Ф.И.О.</td>
                        </tr>
                        <tr>
                            <td>Индивидуальный предприниматель</td>
                            <td class="border_b cut_string"></td>
                            <td class="border_b cut_string"></td>
                            <td colspan="3" class="border_b"></td>
                        </tr>
                        <tr class="border_b">
                            <td></td>
                            <td class="footnote">подпись</td>
                            <td class="footnote">Ф.И.О.</td>
                            <td colspan="3">(реквизиты свидетельства о государственной регистрации индивидуального предпринимателя)</td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
        <table class="str4">
            <tr>
                <td>Основание передачи (сдачи)/получения (приемки)</td>
                <td class="border_b_lite"></td>
                <td style="width: 30px">[8]</td>
            </tr>
            <tr>
                <td></td>
                <td class="footnote">(договор; доверенность и др.)</td>
                <td></td>
            </tr>
            <tr>
                <td>Данные о транспортировке и грузе</td>
                <td class="border_b"></td>
                <td>[9]</td>
            </tr>
            <tr>
                <td></td>
                <td class="footnote">(транспортная накладная, поручение экспедитору, экспедиторская / складская расписка и др. / масса нетто/бруттно груза, если не приведены ссылки на транспортные документы, содержащие эти сведения)</td>
                <td></td>
            </tr>
        </table>
        <div class="str5">
            <table class="str5_1">
                <tr>
                    <td colspan="4">Товар (груз) передал/услуги, результаты работ, права сдал</td>
                </tr>
                <tr>
                    <td style="width: 30%;" class="border_b_lite cut_string"></td>
                    <td style="width: 30%;" class="border_b_lite cut_string"></td>
                    <td style="width: 35%;" class="border_b_lite"></td>
                    <td style="width: 30px">[10]</td>
                </tr>
                <tr>
                    <td class="footnote cut_string">(должность)</td>
                    <td class="footnote cut_string">(подпись)</td>
                    <td class="footnote">(Ф.И.О.)</td>
                    <td></td>
                </tr>
                <tr>
                    <td>Дата отгрузки, передачи (сдачи)</td>
                    <td colspan="2">"__" ___________ 20__ г.</td>
                    <td>[11]</td>
                </tr>
                <tr>
                    <td colspan="4">Иные сведения об отгрузке</td>
                </tr>
                <tr>
                    <td colspan="3" class="border_b_lite"></td>
                    <td>[12]</td>
                </tr>
                <tr>
                    <td colspan="3" class="footnote">(ссылки на неотъемлемые приложения, сопутствующие документы, иные документы и т.п.)</td>
                    <td></td>
                </tr>
                <tr>
                    <td colspan="4">Ответственный за правильность оформления факта хозяйственной жизни</td>
                </tr>
                <tr>
                    <td class="border_b cut_string"></td>
                    <td class="border_b cut_string"></td>
                    <td class="border_b"></td>
                    <td>[13]</td>
                </tr>
                <tr>
                    <td class="footnote cut_string">(должность)</td>
                    <td class="footnote cut_string">(подпись)</td>
                    <td class="footnote">(Ф.И.О.)</td>
                    <td></td>
                </tr>
                <tr>
                    <td colspan="4">Наименование экономического субъекта — составителя документа (в т.ч. комиссионера/агента)</td>
                </tr>
                <tr>
                    <td colspan="3" class="border_b_lite"></td>
                    <td>[14]</td>
                </tr>
                <tr>
                    <td colspan="4" class="footnote">(может не заполняться при проставлении печати в М.П., может быть указан ИНН/КПП)</td>
                </tr>
                <tr>
                    <td colspan="4">М.П.</td>
                </tr>
            </table>
            <table class="str5_2">
                <tr>
                    <td colspan="4">Товар (груз) получил/услуги, результаты работ, права принял</td>
                </tr>
                <tr>
                    <td style="width: 30%" class="border_b_lite cut_string"></td>
                    <td style="width: 30%" class="border_b_lite cut_string"></td>
                    <td style="width: 40%" class="border_b_lite"></td>
                    <td style="width: 30px">[15]</td>
                </tr>
                <tr>
                    <td class="footnote cut_string">(должность)</td>
                    <td class="footnote cut_string">(подпись)</td>
                    <td class="footnote">(Ф.И.О.)</td>
                    <td></td>
                </tr>
                <tr>
                    <td>Дата отгрузки, передачи (сдачи)</td>
                    <td colspan="2">"__" ___________ 20__ г.</td>
                    <td>[16]</td>
                </tr>
                <tr>
                    <td colspan="4">Иные сведения о получении, приёмке</td>
                </tr>
                <tr>
                    <td colspan="3" class="border_b_lite"></td>
                    <td>[17]</td>
                </tr>
                <tr>
                    <td colspan="3" class="footnote">(информация о наличии/отсутствии претензий, ссылки на неотъемлемые приложения и другие документы и т.п.)</td>
                    <td></td>
                </tr>
                <tr>
                    <td colspan="4">Ответственный за правильность оформления факта хозяйственной жизни</td>
                </tr>
                <tr>
                    <td class="border_b cut_string"></td>
                    <td class="border_b cut_string"></td>
                    <td class="border_b"></td>
                    <td>[18]</td>
                </tr>
                <tr>
                    <td class="footnote cut_string">(должность)</td>
                    <td class="footnote cut_string">(подпись)</td>
                    <td class="footnote">(Ф.И.О.)</td>
                    <td></td>
                </tr>
                <tr>
                    <td colspan="4">Наименование экономического субъекта — составителя документа</td>
                </tr>
                <tr>
                    <td colspan="3" class="border_b_lite"></td>
                    <td>[19]</td>
                </tr>
                <tr>
                    <td colspan="4" class="footnote">(может не заполняться при проставлении печати в М.П., может быть указан ИНН/КПП)</td>
                </tr>
                <tr>
                    <td colspan="4">М.П.</td>
                </tr>
            </table>
        </div>
</body>
</html>
Артур Шевченко
15 марта 2023, 15:04
0
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/
RewriteRule ^(.*)index\.(php|html|htm)$ $1 [R=301,L]
Добавить в htaccess
Артур Шевченко
15 марта 2023, 12:54
0
<?php
ini_set('memory_limit', '512M');

class ImportFeed
{
    public ModX $modx;
    public string $basepath;
    public string $filename;
    public string $feedurl;
    public string $logpath;
    public array $categoryDefaultFields;

    public function __construct($modx, $filename, $feedurl)
    {
        $this->modx = $modx;
        $this->feedurl = $feedurl;
        $this->basepath = $this->modx->getOption('base_path');
        $this->logpath = $this->basepath . 'import_log.txt';
        $this->filename = $this->basepath . $filename;
        $this->categoryDefaultFields = array(
            'parent' => 89,
            'template' => 15,
            'hidemenu' => 1,
            'published' => 1,
            'class_key' => 'msCategory'
        );

        return true;
    }

    public function start($import_categories = true, $import_products = true, $download_feed = true)
    {
        if(file_exists($this->logpath)){
            unlink($this->logpath);
        }

        if ($download_feed) {
            if ($this->downloadFeed()) {
                $this->log('[ImportFeed::start] Загружен файл фида.');
            } else {
                $this->log('[ImportFeed::start] Не удалось скачать файл фида.');
                return false;
            }
        } else {
            if (file_exists($this->filename)) {
                $this->log('[ImportFeed::start] Будет произведён импорт из имеющегося файла фида.');
            } else {
                $this->log('[ImportFeed::start] Файл фида отсутствует. Загрузите его, чтобы выполнить импорт.');
                return false;
            }
        }

        $this->log('[ImportFeed::start] Начат импорт.');
        if ($import_categories) {
            $this->getCategoriesData();
        }
        if ($import_products) {
            $this->getProductsData();
        }
    }

    function downloadFeed()
    {
        $ch = curl_init($this->feedurl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $html = curl_exec($ch);
        curl_close($ch);

        return file_put_contents($this->filename, $html);

    }

    private function getCategoriesData()
    {
        $this->log('[ImportFeed::getCategoriesData] Начато получение данных категорий для импорта.');
        if ($reader = $this->getXmlReader($this->filename, 'categories')) {
            $this->modx->log("[ImportFeed::getCategoriesData] Выделено памяти:" . (memory_get_usage() / 1048576).  " МБ.", 0, 1);
            if ($xml = $this->readXml($reader)) {
                $this->log('[ImportFeed::getCategoriesData] Начат импорт категорий.');
                $c = 0;
                foreach ($xml->category as $item) {
                    $c++;
                    $parentId = $item->attributes()->parentId ? $item->attributes()->parentId->__toString() : '';
                    $id = $item->attributes()->id ? $item->attributes()->id->__toString() : '';
                    if ($id && !$parentId) {
                        $categoryData = array(
                            'pagetitle' => $item->__toString(),
                            'feed_id' => $id,
                        );
                    } else {
                        $categoryData = array(
                            'feed_id' => $id,
                            'parentId' => $parentId,
                            'pagetitle' => $item->__toString(),
                        );
                    }
                    $this->manageCategories($categoryData);
                }
                $this->log('[ImportFeed::getCategoriesData] Импорт окончен. Импортировано категорий: ' . $c);
                unset($xml);
            } else {
                $this->log('[ImportFeed::getCategoriesData] Не удалось прочитать данные категорий из фида.');
            }
            unset($reader);
        } else {
            $this->log('[ImportFeed::getCategoriesData] Не удалось получить данные категорий для чтения.');
        }
    }

    private function manageCategories($categoryData)
    {
        $categoryData = array_merge($this->categoryDefaultFields, $categoryData);
        if ($categoryData['parentId']) {
            $data['feed_id'] = $categoryData['parentId'];
            $data = array_merge($this->categoryDefaultFields, $data);
            if ($parent = $this->manageObject('modResource', $data, array('class_key' => 'msCategory', 'feed_id' => $data['feed_id'], 'template' => 15))) {
                $categoryData['parent'] = $parent;
            }
        }
        $this->manageObject('modResource', $categoryData, array('class_key' => 'msCategory', 'feed_id' => $categoryData['feed_id'], 'template' => 15));
        unset($categoryData);
    }

    private function getProductsData()
    {
        $this->log('[ImportFeed::getProductsData] Начато получение данных товаров для импорта.');
        if ($reader = $this->getXmlReader($this->filename, 'offers')) {
            if ($xml = $this->readXml($reader)) {
                $this->log('[ImportFeed::getProductsData] Начат импорт товаров.');
                $c = 0;
                foreach ($xml->offer as $item) {
                    $c++;
                    $id = $item->attributes()->id ? $item->attributes()->id->__toString() : '';
                    $productData = array(
                        'pagetitle' => $item->name->__toString(),
                        'longtitle' => $item->url->__toString() . '?utm_source=petrovich_znaet',
                        'introtext' => $item->picture->__toString(),
                        'price' => $item->price->__toString(),
                        'categoryId' => $item->categoryId->__toString(),
                        'feed_id' => $id,
                        'published' => 1
                    );
                    $this->manageProducts($productData);
                }
                $this->log('[ImportFeed::getProductsData] Импорт окончен. Импортировано товаров: ' . $c);
                unset($xml);
            }
            else {
                $this->log('[ImportFeed::getProductsData] Не удалось прочитать данные товаров из фида.');
            }
            unset($reader);
        } else {
            $this->log('[ImportFeed::getProductsData] Не удалось получить данные товаров для чтения.');
        }
    }

    private function manageProducts($productData)
    {
        $productData['parent'] = 89;
        $productData['class_key'] = 'msProduct';
        $productData['show_in_tree'] = 0;
        if ($parent = $this->modx->getObject('msCategory', array('feed_id' => $productData['categoryId']))) {
            $productData['parent'] = $parent->get('id');
        }
        $this->manageObject('modResource', $productData, array('class_key' => 'msProduct', 'feed_id' => $productData['feed_id']));
        unset($productData);
    }

    private function getXmlReader($filename, $search)
    {
        //read xml file
        $reader = new XMLReader;
        $success = $reader->open($filename);
        if (!$success) {
            $this->modx->log("[ImportFeed::getXmlReader] Невозможно считать файл $filename. Возможно он содержит ошибки XML.", 0, 1);
        }

        //search categories
        while ($reader->read() && $reader->name !== $search);
        return $reader;
    }

    private function readXml($reader)
    {
        $outerXml = $reader->readOuterXML();
        return $outerXml ? new SimpleXMLElement($outerXml) : null;
    }

    private function manageObject($class, $data, $conditions)
    {
        if ($data['pagetitle']) {
            $data['description'] = $data['pagetitle'];
            $data['pagetitle'] = $this->truncate($data['pagetitle']);
            $data['pagetitle'] .= ' ' . $data['feed_id'];
        }
        if (!$obj = $this->modx->getObject($class, $conditions)) {
            if (!$data['pagetitle']) {
                $data['pagetitle'] = 'Ресурс' . $data['feed_id'];
            }
            $obj = $this->modx->newObject($class);
            if ($class === 'modResource') {
                $data['alias'] = $this->translit($data['pagetitle']);
            }
        }
        $obj->fromArray($data);
        if ($obj->save()) {
            $this->log('[ImportFeed::manageObject] Обработан ресурс: ' . $data['pagetitle'] . ' ' . print_r($data,1));
            $id = $obj->get('id');
            unset($obj);
            return $id;
        } else {
            $this->log('[ImportFeed::manageObject] Не удалось сохранить объект со следующими данными ' . print_r($data, 1));
        }
    }

    private function translit($value)
    {
        $converter = array(
            'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd',
            'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i',
            'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n',
            'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't',
            'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch',
            'ш' => 'sh', 'щ' => 'sch', 'ь' => '', 'ы' => 'y', 'ъ' => '',
            'э' => 'e', 'ю' => 'yu', 'я' => 'ya',
        );

        $value = mb_strtolower($value);
        $value = strtr($value, $converter);
        $value = mb_ereg_replace('[^-0-9a-z]', '-', $value);
        $value = mb_ereg_replace('[-]+', '-', $value);
        $value = trim($value, '-');

        return $value;
    }

    private function truncate($str, $length = 90)
    {
        $arr = explode(' ', $str);
        $c = 0;
        $newArr = [];
        foreach ($arr as $r) {
            $c += mb_strlen($r);
            $newArr[] = $r;
            if ($c > $length) {
                break;
            }
        }
        return implode(' ', $newArr);
    }

    private function log($msg)
    {
        file_put_contents($this->logpath, date('d.m.Y H:i:s') . ' ' . $msg . PHP_EOL, FILE_APPEND);
    }
}
Роман
15 марта 2023, 11:53
0
Брось пожалуйста, посмотрю смогу ли адаптировать его под себя. Спасибо
Артур Шевченко
15 марта 2023, 11:48
0
Связка с 1C обязательна, без этого запустить обработку, по словам автора, сложно. Я писал свой импорт, могу скинуть код скорректируешь под себя.