Вывод заказов для Minishop2

Давно использую MODX Revo, но в основном для небольших сайтов. А сейчас решил сделать на нём интернет-магазин. Захотелось сделать на сайте личный кабинет покупателя, где он сможет просматривать свои заказы. Начал искать и не нашёл ни одного решения этого вопроса (может плохо искал?!).
Странно. В итоге написал свой велосипед — сниппет и чанк в котором выводится содержимое.

Сниппет getOrders:
<?php
$user_id = $modx->user->get('id');
$chunkName = 'tpl.GetOrder.row';
$q = $modx->prepare("SELECT * FROM modx_ms2_orders WHERE user_id='$user_id' ORDER BY createdon");
$q->execute();
$orders = $q->fetchAll(PDO::FETCH_ASSOC);
if(count($orders)!=0){
    foreach($orders as $order){
        echo '<div class="row order">';
        $order_id = $order[id];
        $order_num = $order[num];
        $order_status = $order[status];
        $order_created = $order[createdon];
        switch ($order_status){
            case 1:
                $order_status = '<span class="badge">Новый</span>';break;
            case 2:
                $order_status = '<span class="badge green">Оплачен</span>';break;
            case 3:
                $order_status = '<span class="badge blue">Отправлен</span>';break;
            case 4:
                $order_status = '<span class="badge red">Отменён</span>';break;
        };
        echo '<div class="col-md-2 center" style="padding: 20px;">';
        echo '<p>Заказ</p>'.$order_num.' от
<p>'.$order_created.'</p><p>'.$order_status.'</p>';
        echo '</div>';
        echo '<div class="col-md-10">';
        $q = $modx->prepare("SELECT * FROM modx_ms2_order_products WHERE order_id='$order_id'");
        $q->execute();
        $products = $q->fetchAll(PDO::FETCH_ASSOC);
        echo '<table class="table table-hover"><thead><tr><th>#</th><th>Фото</th><th>Арт.</th><th>Кол</th><th>Цена</th><th>Итого</th></tr></thead><tbody>';
        $i = 0;
        foreach($products as $product){
            $i = $i + 1;
            $product_id = $product[product_id];
            $q = $modx->prepare("SELECT * FROM modx_ms2_products WHERE id='$product_id'");
            $q->execute();
            $product_data = $q->fetchAll(PDO::FETCH_ASSOC);
            $fields = array(
                'id'=>$product_id,
                'num'=>$i,
                'thumb'=>$product_data[0][thumb],
                'article'=>$product_data[0][article],
                'count'=>$product[count],
                'price'=>$product[price],
                'summa'=>$product[price]*$product[count]
                );
                
            echo $modx->getChunk('tpl.GetOrder.row',$fields);
        };
        echo '</tbody></table>';
        echo '</div>';
        echo '</div>';
    };
} else {
    echo '<p>У вас ещё не было заказов</p>';
};
Чанк tpl.GetOrder.row:
<tr>
    <td>[[+num]]</td>
	<td><a href="[[~[[+id]]]]"><img src="[[++site_url]][[+thumb:default=`[[++assets_url]]components/minishop2/img/web/ms2_small.png`]]" width="100px"/></a></td>
	<td><a href="[[~[[+id]]]]">[[+article]]</a></td>
	<td>[[+count]]</td>
	<td>[[+price]]</td>
	<td>[[+summa]]</td>
</tr>
На премию за изящество это решение не претендует, но вроде работает.

Решение на сказать что готовое, но более подходящего раздела для темы нет.

На нужной странице вызываем сниппет:
[[!getOrders]]
и всё.
Если есть советы по усовершенствованию, то пишите.

ЗЫ: в комментариях дали совет по переделке — отделить логику от отображения и переделать c SQL на xPDO. Первое сделаю обязательно, а вот второе под вопросом — не вижу в этом смысла.
Павел Пустота
11 сентября 2015, 14:00
modx.pro
13
7 413
0

Комментарии: 38

Василий Наумкин
05 апреля 2014, 18:24
0
Начал искать и не нашёл ни одного решения этого вопроса (может плохо искал?!).
store.simpledream.ru/office
    Павел Пустота
    05 апреля 2014, 18:29
    0
    Да, его видел. Но это целый компонент. Мне он ни к чему. Я искал решения из этого разряда:
    bezumkin.ru/modx/minishop2/solutions/
      Василий Наумкин
      05 апреля 2014, 18:30
      0
      То есть, нужен не личный кабинет, а вывод заказов?

      Так и пиши.
        Павел Пустота
        05 апреля 2014, 18:34
        0
        Нужен был. Я сделал, решил поделиться.
        Поправил заголовок, спасибо! Так действительно понятнее.
    Павел Пустота
    05 апреля 2014, 18:48
    0
    Так может имеет смысл перенести эту запись сюда?
    Ну или в другой раздел с решениями.
      Сергей
      06 апреля 2014, 03:41
      +2
      Думаю все же стоит сначала немного привести в порядок, запросы с xPDO, html в чанки.
        Павел Пустота
        06 апреля 2014, 18:48
        0
        привести в порядок, запросы с xPDO
        Вот этот пункт, если не трудно, прокомментируйте чуть подробнее. Что именно не так?
          Сергей
          06 апреля 2014, 19:08
          +1
          Ну я к тому, чтобы избавиться от сырого SQL:
          $q = $modx->newQuery('msOrder', array('user_id' => $user_id));
          $q->sortby('createdon')
          ...
      Alex Alex
      Alex Alex
      08 июня 2014, 19:51
      1
      0
      Павел Пустота, а как выводить данные товара? нужно «цвет» и «размер»?
        Павел Пустота
        08 июня 2014, 20:04
        1
        0
        В цикле foreach($products as $product) добавить:
        $options = json_decode($product['options'], true);
        $color = $options['color'];
        $size = $options['size'];

        В массив $fields добавить:
        'color'=>$color,
        'size'=>$size
          Alex Alex
          Alex Alex
          08 июня 2014, 20:13
          0
          Спасибо, педали закрутились!
            Alex Alex
            Alex Alex
            08 июня 2014, 21:42
            0
            и ещё вопрос, как вывести доставку и способ оплаты?
              Павел Пустота
              09 июня 2014, 00:08
              0
              В цикле foreach($orders as $order)
              Что то вроде этого:
              $order_delivery = $order[delivery];
              $order_payment = $order[payment];
              switch ($order_delivery){
                          case 1:
                              $order_delivery = '<span class="badge">Самовывоз</span>';break;
              	    case 2:
                              $order_delivery = '<span class="badge">Что там у вас настроено</span>';break;
              };
              switch ($order_payment){
                          case 1:
                              $order_delivery = '<span class="badge">Оплата наличными</span>';break;
              	    case 2:
                              $order_delivery = '<span class="badge">PayPal</span>';break;
              }
                Alex Alex
                Alex Alex
                09 июня 2014, 01:53
                0
                Большое спасибо — работает.
                  Александр
                  13 мая 2015, 17:21
                  0
                  Павел, а как вывести имя товара? вместо поля «артикул»
            Vitalik
            18 сентября 2017, 12:07
            0
            Спасибо. но все это полностью переделать пришлось привязку шаблонов, запросы, вывод ошибок, вывод просто списка заказов а по клику отображать содержимое и т.д.
            А в целом за идею реализации спасибо.
              Volgot And Co. Ltd
              Volgot And Co. Ltd
              08 июля 2018, 00:31
              -3
              Случайно наткнулся на этот пост — искал готовое решение (из интереса и лень было писать самому)
              Павел Пустота, вам ++ за героизм — когда не зная ни одной строчки языков программирования смело пытаются что-то делать сами, respect. За это вам (и всем за компанию) в подарок ваш код вызова ордеров только в правильном виде

              <?php
              $user_id = $modx->user->get('id');
              // поменяйте префикс modx на свой
              // выводите только нужные данные указывая их вместо звезд с алиасами иначе будут перезаписаны (a.id AS a_id)
              $results = $modx->query("SELECT a.*, b.*, c.* FROM modx_ms2_orders a, modx_ms2_order_products b, modx_ms2_products c WHERE a.user_id=$user_id AND a.id=b.order_id AND c.id=b.product_id ORDER BY a.createdon");
              echo '<table class="table table-hover"><thead><tr><th># ордер</th><th>Фото</th><th>Арт.</th><th>Кол</th><th>Цена</th><th>Итого</th></tr>';
              $i=0;
              while ($r = $results->fetch(PDO::FETCH_ASSOC)) {
                  ++$i; // вставите куда надо
                  echo "<tr><th>".$r['order_id']."</th><th><img src=".$r['thumb']."></th><th>".$r['id']."</th><th>".$r['count']."</th><th>".$r['price']."</th><th>".$r['count']*$r['price']."</th></tr>"; // можете сунуть в ваши любимые "сниппеты" для "крутых программистов"
                  echo "<tr><td colspan=100>".print_r($r)."</td></tr>"; // здесь увидите все доступные данные, потом уберете эту строку
              }
              if($i==0) echo '<tr><td colspan=100>У вас ещё не было заказов</td></tr>';
              echo "</table>";
              НИКОГДА НЕ ДЕЛАЙТЕ рекурсивных запросов к базам из циклов
              A весь ваш код выкиньте в мусорную корзину, как можно скорее
              p.s. хорошо что клиенты, некоторым из которых здесь платят ДЕНЬГИ, не видят то, что здесь происходит… )
                Pavel Zarubin
                08 июля 2018, 04:06
                0
                А лучше вообще делать как то так: modx.pro/howto/13548/
                pdoResources прекрасно справляется со своими функциями
                  Volgot And Co. Ltd
                  Volgot And Co. Ltd
                  08 июля 2018, 05:39
                  -2
                  Лучше вообще чужим кривым кодом не пользоваться

                  p.s. старая советская шутка: «Если (if) человек дурак — он идет работать учителем, если же (else if) человек настолько дурак, что не может работать учителем — он идет работать учителем физкультуры»
                  p.p.s. по статье по ссылке могу лишь добавить "… а если человек инвалид, и не может работать учителем физкультуры, он идет работать учителем модикса"
                    Pavel Zarubin
                    08 июля 2018, 05:41
                    0
                    Забавно, может какие то аргументы будут?)
                      Volgot And Co. Ltd
                      Volgot And Co. Ltd
                      08 июля 2018, 05:51
                      0
                      Вы ваш запрос к pdoResources будете писать дольше и потратите больше «букаф», чем требуется к самостоятельному запросу. Я вот этот список «полезных команд» протеза под именем pdoResources читал дольше, чем написал запрос на ордера к базе

                      Resource selection properties
                      These properties determine what resources will appear in the generated list.

                      Name Default Description
                      &parents Current resource Comma-separated list of parents, to find results. Set to 0 for unlimited, to +0 for the top level. If a parent id starts with a dash, it and its children are excluded from the query.
                      &depth 10 Search depth of child resources from parent in the Resource Tree.
                      &resources Comma-separated list of resources to add to the results. If the id of the resource starts with a hyphen, this resource is excluded from the query.
                      &context Limit the resources from the given context.
                      &where An array of additional selection parameters encoded JSON.
                      &showHidden 1 Show resources that are hidden in the menu.
                      &showUnpublished 0 Show unpublished resources.
                      &showDeleted 0 Show resources that have been marked as deleted.
                      &hideContainers 0 Exclude container resources, that is, resources with «isfolder = 1».
                      &select 0 A comma-separated list of fields to retrieve. You can specify a JSON string array, for example {«modResource»:«id,pagetitle,content»}.
                      &sortby pagetitle Any resource field for sorting, including TVs if the &includeTVs property is also set. You can specify a JSON string with an array of multiple fields, for example {«tvname»:«ASC», «pagetitle»:«DESC»}. To randomly sort use «RAND()».
                      &sortdir DESC Sort direction: Ascending or Descending.
                      &limit 10 Limit the number of results. You can use «0» for no limit.
                      &offset 0 Number of items to skip, from the beginning.
                      &first 1 Number of the first item of the output results.
                      &last Automatic, by the formula (total + first — 1) Number of the last item of the results.
                      &loadModels Comma-separated list of components whose model you need to download for building a query. Example: &loadModels=`ms2gallery,msearch2`.
                      &tvFilters List of filters on TV, delimited AND and OR. Separator specified parameter &tvFiltersOrDelimiter represents the logical OR condition thereon and conditions grouped primarily. Within each group, you can specify a list of values, separated &tvFiltersAndDelimiter. Search values ​​can be performed in any particular TV, if it is provided «myTV == value», or in any «value». Sample call: &tvFilters=`filter2==one,filter1==bar%||filter1==foo`. Please note: The filter uses the LIKE operator and the "%" symbol is a metacharacter. This will search for the values for the resources that are located in the site_tmplvar_contentvalues table, not from the default settings of the TV.
                      &tvFiltersAndDelimiter "," Separator for conditional AND property &tvFilters.
                      &tvFiltersOrDelimiter "||" Separator for conditional OR property &tvFilters.
                      Template Properties
                      These properties specify the chunks that contain the templates to format the generated output.

                      Name Description
                      &returnIds Set to «1» to return a string with a list of resource ids, instead of complete results. All of the templates are ignored.
                      &tpl Name chunk for formatting the individual items. If not specified, the contents of the resource fields will be printed to the screen.
                      &tplFirst Name of the chunk to format the first item in the results.
                      &tplLast Name of the chunk to format the last item in the results.
                      &tplOdd Name of the chunk to format every odd-numbered item in the results.
                      &tplWrapper Chunk — wrapper, to wrap all results. Accepts one placeholder:[[+output]]. It does not work in conjunction with &toSeparatePlaceholders.
                      &wrapIfEmpty Includes outer chunk wrapper *&tplWrapper** even if there are no results.
                      &tplCondition Defines a field of the resource to evaluate against keys defined in the &conditionalTpls property.
                      &tplOperator Optional operator for comparison of the resource field &tplCondition with an array of values and in &conditionalTpls chunks.
                      &conditionalTpls A JSON object defining a map of field values and the associated tpl Chunks to use when the field defined by &tplCondition matches the value. The comparison operator is specified in &tplOperator. For operators such as isempty you can not use an array of keys.
                      &outputSeparator Optional string to separate the results.
                      Result Properties
                      These properties further define what data to fetch and how to display it.

                      Name Default Description
                      &fastMode 0 Quick mode for processing chunks. All raw tags (output modifiers, snippets, etc.) are removed.
                      &idx The starting number of iterations of the output.
                      &setTotal 0 Indicates if the total placeholder should be populated with a count of the results.
                      &totalVar total Name of the placeholder for storing the total number of results.
                      &includeContent 0 Indicates if the «content» field of each resource should be returned in the results.
                      &includeTVs Comma-separated list of Template Variable values that should be included in the placeholders available to each resource template. Example: «action,time» will produce the placeholders [[+tv.action]] and [[+tv.time]].
                      &prepareTVs «1», prepares all TVs specified in &includeTVs Comma-separated list of media source-dependant TV values to be prepared before output.
                      &processTVs Comma-separated list of TVs that should be processed according to their output options. If set to «1», all TV listed in &includeTVs will be processed.
                      &tvPrefix tv. Prefix TV property.
                      &scheme -1 Type of URL scheme, passed to modX::makeUrl(). See this for a list of valid options.
                      &useWeblinkUrl 0 Generate link to the weblink resource, not to the destination URL. NOTE: To get this properly working, be sure to use [[+link]] instead of [[~[[+id]]]] eg. [[+pagetitle]].
                      &toPlaceholder Save output to a placeholder with this name instead of displaying the output to the screen.
                      &toSeparatePlaceholders Each item will be displayed in a placeholder with a name starting with this value and ending with the sequential number starting from zero. For example, by specifying the property value «myPl», you'll get placeholders [[+myPl0]], [[+myPl1]] & etc.
                      &showLog 0 Show additional debugging information on the processing of the snippet only to logged-in Manager users.
                        Volgot And Co. Ltd
                        Volgot And Co. Ltd
                        08 июля 2018, 05:53
                        0
                        это зачем нужно?

                        простите, вы когда утром бреетесь запускаете для этого ядерный реактор или просто бритву используете? ))
                          Pavel Zarubin
                          08 июля 2018, 06:03
                          +1
                          Вы ваш запрос к pdoResources будете писать дольше и потратите больше «букаф», чем требуется к самостоятельному запросу
                          Да ладно? Ну давай проверим. В моем запросе 665 символов, в нем уже учтены такие моменты как возможная смена названия таблицы (новое имя автоматом подтянется), возможная смена префикса, шаблонизатор, что позволит дальше адекватно расширять фронт, а также подключается 4 таблицы, а не 3. В твоем же примере 742 символа и абсолютно никакая сопровождаемость. pdoTools далеко гораздо более функционален, чем просто конструктор запросов как бы
                            Volgot And Co. Ltd
                            Volgot And Co. Ltd
                            08 июля 2018, 06:16
                            -4
                            1. «на ты» будешь разговаривать со своим папой, ты не мой ребенок
                            2. твой запрос ты не показал
                            3. мои клиенты сами не меняют ни префиксы, ни названия таблиц, сменят — обратятся и оплатят лишнюю работу, я не разрабатываю modx, я работаю с другими, более серьезными продуктами ))
                            4. 742 символа вместе с print_r и комментариями для дебилов? )))))))
                            5. ты мне предлагаешь написать аналог pdoTools? нахуя, если он уже написан? или использовать pdoTools? нахуя, если моя задача этого не требует?
                              Pavel Zarubin
                              08 июля 2018, 06:27
                              0
                              Ясно, очередной диванный критик и мамкин миллионер, совсем забыл, каникулы же начались, пора завязывать отвечать на комментарии.
                              К слову я не рекламировал и ничего не навязывал, я сказал что это «лучше» как минимум по тому, что в принципе не хорошо выходить из экосистемы на которой весь сайт написан. Но тебе же барану не объяснить, кроме тебя твоими проектами 100% никто не занимается. У тебя такие серьезные проекты, что позволяют писать там код без код ревью с логикой «Если надо будет поправить — заплатят мне — я поправлю», да-да охотно верю. Если что, лендинги и сайт для соседнего суши — бара, это не серьезные проекты.
                                Volgot And Co. Ltd
                                Volgot And Co. Ltd
                                08 июля 2018, 06:46
                                0
                                ваши pdoTools с 2013 года на хабре обозвали охинеей, их автора аферистом, не читали? пройдите по ссылке поставьте ему ТАМ лайк, а то у бедного за 5 лет вместе с вашими «замечательными тулзАми» всего 5 плюсиков ))
                                habr.com/post/199062/

                                p.s. слышь, дите из Нахичевани, мой профайл посмотри сначала, где я живу и работаю, где ты (у меня рядом «суши баров» нет, одни шотбулеры)
                      Volgot And Co. Ltd
                      Volgot And Co. Ltd
                      08 июля 2018, 05:48
                      0
                      Напишите с помощью pdoResources вывод списка ордеров 3-мя (максимум пятью) строчками текста — включая php, html, запрос к базе, и вывод на страницу вместе с дизайном — всё вместе чтобы не превышало 3-5 строк, и прикрепите здесь, очень интересно

                      У меня в примере весь код, включая все чанки, сниппеты, дизайн, бакенд, фронтенд и пдо запросы в 5-и (пяти) строчках. Больше ничего нет и не требуется :)
                        Pavel Zarubin
                        08 июля 2018, 05:52
                        0
                        Классный аргумент, строчками мерится это конечно показатель профессионализма, да. Может на символы пересчитаем? Уверен что по символам у pdoResource будет в разы меньше и читаемость в разы лучше чем в вашем говнопримере. Делать запросы в базу даже без учета денамического префикса (который к слову может в любой момент измениться другим разработчиком — это сильно)
                        Вы правы, вы слишком талантливы чтобы учить людей, а также чтобы что-то выкладывать на гитхаб или писать компоненты, не стоит вам этого делать
                          Volgot And Co. Ltd
                          Volgot And Co. Ltd
                          08 июля 2018, 06:08
                          -1
                          слово дИнамический пишется через И ))

                          вставь $table_prefix -> SELECT * FROM $table_prefix_ms2_orders

                          а, вы настолько талантливы, что можете только критиковать то, что другие даром выкладывают? ))) поделитесь вашим примером, я вам его оплачу

                          зы если вы включите моск или купите очки, то заметите, что мой запрос использует pdo модикса, хотя я мог его сделать совсем напрямую через mysqli_connect() и даже вообще через shell exec(«sudo mysql ***») :D
                            Pavel Zarubin
                            08 июля 2018, 06:11
                            0
                            а, вы настолько талантливы, что можете только критиковать то, что другие даром выкладывают? ))) поделитесь вашим примером, я вам его оплачу
                            Я вам ссылку скинул на свою статью как бы. Можете в профиль зайти, там их еще несколько.

                            зы если вы включите моск или купите очки, то заметите, что мой запрос использует pdo модикса
                            Я это вижу, но это тут причем? К слову pdoTools как раз НЕ имспользует xpdo модикса
                              Volgot And Co. Ltd
                              Volgot And Co. Ltd
                              08 июля 2018, 06:18
                              0
                              а, ну тогда всё ясно
                              вам тут за каждую строчку рекламы платят? ))
                              личше этот свой кривой сайт починили бы, на котором даже ЛОГИНЫ из соцсетей НЕ РАБОТАЮТ )))))))))))
                                Pavel Zarubin
                                08 июля 2018, 06:20
                                0
                                1) Это не мой сайт
                                2) А я что то рекламирую? Или все в жизни упирается в деньги?)
                                  Volgot And Co. Ltd
                                  Volgot And Co. Ltd
                                  08 июля 2018, 06:38
                                  0
                                    Volgot And Co. Ltd
                                    Volgot And Co. Ltd
                                    08 июля 2018, 06:44
                                    0
                                    ваши pdoTools с 2013 года на хабре обозвали охинеей, их автора аферистом, не читали? пройдите по ссылке поставьте ему ТАМ лайк, а то у бедного за 5 лет вместе с вашими «замечательными тулзАми» всего 5 плюсиков ))
                          Volgot And Co. Ltd
                          Volgot And Co. Ltd
                          08 июля 2018, 06:38
                          -4
                          Можно вопрос: вы занимаетесь изобретением собственного языка программирования? ))
                          Чем вас не устраивает чистый php и чистые запросы к базе — потому что вы их не изучали и не знаете? )

                          И последний вопрос, на засыпку: КАКОЙ запрос к базе используют САМИ pdoResources и сам Modx?

                          Если я вам сейчас покажу, что сам Modx (и любой другой cms, framework, и даже facebook Цукерберга) и даже ваш pdoTools делает запрос к базе данных «напрямую» — вы спать сможете спокойно, или будете ворочаться? )))))))

                          Давайте процитируем самого товарища Безумкина, аффтара этого шедевра: «К сожалению, xPDO не может похвастаться скоростью вывода (как, наверное, вообще любая ORM), поэтому я попробовал совместить её плюсы с обычным PDO, добавить лучшую работу с чанками и сделать удобную библиотеку для MODX.

                          Основные особенности:
                          Быстрая работа с БД. Все запросы составляются на xPDO, а выбираются без объектов — на PDO» < — вау, ваш pdoResources использует МОЙ прямой «говнозапрос»? какая неожиданность ))

                          А терь посмотрим комментарии к вашему аффтару, который «дурачит простачков»:

                          «И вот опять вот эта ахинея… «Мое прелестное дополнение»…

                          Это не просто твое прелестное дополнение. Это самое великое из того, что ты сделал — самый великий блеф! Тебе по прежнему удается простачков дурачить тем, что ты офигенный компонент написал и много-много его дорабатываешь. И многие верят (не хватает же мозгов проверить). И главное — сколько уже ты на него из СимплДрима денег вытянул? :-) Ведь тебе оплачивается твое рабочее время

                          В общем, это никакая не замена xPDO (хорошо хоть давно уже перестал это говорить, понял, что ляпнул не подумавши). Это простой синтаксический сахар, при чем не просто сомнительный, а конкретно ничего под собой не имеющий»

                          habr.com/post/199062/

                          Так что, гуляй, Паша, с простачками ))
                            Pavel Zarubin
                            08 июля 2018, 06:47
                            0
                            Ой дебил блять) Других слов нет) Я честно не знаю что было в 2013ом году, я тогда был еще на другой версии modx, но сейчас pdoTools это огромная экосистема, которая вносит изменения в родной парсер, которая содержит шаблонизатор отличный от родного, которая позволяет сделать файловую структуру проекта, а главное работает в несколько раз быстрее, чем xpdo. И да, я прекрасно знаю что под капотом под pdoTools. Про чистый php и почему я считаю что он тут не уместен я уже писал, повторятся не стану. Можешь не отвечать на этот коммент, надоело с дурачками общаться
                            Raimei
                            08 июля 2018, 13:17
                            0
                            Всё таки не зря попкорн рядом стоит. Интересно почитать таких вот «залетевших случайно» на modx.pro

                            Про pdoTools. Просто его удобно юзать. Предсказуемость результатов и маловероятный шанс что вызов сломается. Если ты не понял, хлебушка кусочек.

                            Про твоё и Павла решение. Без токсика написать не? Сложно? Ай, как же я мог забыть, ты же программист 1000000$ в наносекунду. Так и быть, тебе можно (нет).
                        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                        38