Автоматическое создание артикула для miniShop2 (с проверкой на уникальность)

Три года назад этот вопрос поднимался вот здесь.
В результате есть работающий код:
<?php
if ( $modx->event->name != "OnDocFormSave" || $resource->get('class_key') != 'msProduct' || !empty($resource->get('article')) ) return;
$resource->set('article', substr($resource->get('alias'),0,2).'-'.$resource->get('parent').$resource->get('id'));
$resource->save();
$resource->clearCache();
Артикулы получаются типа: pl-38125
Также есть вариант для TV генерирующий артикулы в числовом виде.
<?php
if ($modx->event->name == "OnDocFormSave") 
{    
    $tv = 'articul';
    $id = $resource->get('id');
    $parent = $resource->get('parent');
    $tvv = $resource->getTVValue($tv);
    
    if (empty($tvv))
    {
	   switch ($str=strlen($parent.$id))
       {
         case ($str <= 4): $article = mt_rand(0, 9).mt_rand(0, 9).$parent.$id; break;     
         case ($str == 5): $article = mt_rand(0, 9).$parent.$id; break;   
         case ($str == 6): $article = $parent.$id; break;
         case ($str >= 7): $article = substr($parent.$id, 1); break;
       }		
               $resource->setTVValue($tv, $article);
    }
}
Просьба специалистам в PHP модифицировать первый код так, чтобы в miniShop2 можно было создавать артикулы в цифровом виде.
Ну а если этот плагин будет ещё проверять на уникальность артикула, ему вообще цены не будет ))

РЕШЕНИЕ (чтобы не копаться в комментах).
Артикулы получаются уникальные типа: 38125 — ID категории и товара
<?php
if ( $modx->event->name != "OnDocFormSave" || $resource->get('class_key') != 'msProduct' || !empty($resource->get('article')) ) return;
$resource->set('article', $resource->get('parent').$resource->get('id'));
$resource->save();
$resource->clearCache();
Также есть вариант артикула формата: Случайное число от 0 до 999-IDродитель-IDтовара
<?php
if ( $modx->event->name != "OnDocFormSave" || $resource->get('class_key') != 'msProduct' || !empty($resource->get('article')) ) return;

// Создаем артикул формата Случайное число от 0 до 999-IDродитель-IDтовара
$resource->set('article', mt_rand(0, 999).$resource->get('parent').$resource->get('id'));
$resource->save();
$resource->clearCache();
Благодарность iWatchYouFromAfar и Николай приветствуется ))
websfera
04 мая 2019, 11:44
modx.pro
2
1 344
-2

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

Андрей
04 мая 2019, 13:52
+4
Просьба специалистам в PHP модифицировать первый код так, чтобы в miniShop2 можно было создавать артикулы в цифровом виде.
Просьба перенести топик в раздел Работа, тогда специалисты в PHP с радостью всё модифицируют =)
    websfera
    05 мая 2019, 10:20
    0
    Хм… Вот уж не думал, что просьба может вызвать такую реакцию. Всегда думал, что помогать друг другу это как-то по-человечески, особенно, если это занимает пару минут твоего времени. Но если (по моему невежеству) это оказалась какая-то серьёзная работа, приношу свои извинения многоуважаемым специалистам PHP проминусовавшим данный топик.
      Николай
      05 мая 2019, 10:45
      +2
      Если тебе надо убрать буквы из артикула — за это отвечает
      substr($resource->get('alias'),0,2).'-'
      А уникальность итак уже есть, там же id товара используется он уже уникальный.
        websfera
        05 мая 2019, 13:47
        0
        Действительно, всё, оказывается, просто. Благодарю!
          websfera
          07 мая 2019, 20:00
          0
          Николай, а как должна выглядеть строка:
          $resource->set('article', substr($resource->get('alias'),0,2).'-'.$resource->get('parent').$resource->get('id'));
          без первых двух символов алиаса ресурса и дефиски.
          а то у меня синтаксеррор…
            Николай
            07 мая 2019, 22:05
            +1
            Видимо так
            $resource->set('article', $resource->get('parent').$resource->get('id'));
          Михаил
          05 мая 2019, 11:49
          +3
          Просто вы вопрос так поставили. Нужно было вот так:
          Как я могу модифицировать код...
          Чувствуете разницу))
            websfera
            05 мая 2019, 13:49
            -1
            Учту, а приседать и говорить Ку! при этом не нужно? )))
              Михаил
              05 мая 2019, 15:06
              +1
              Ну вы видать разницу даже не понимаете
                websfera
                06 мая 2019, 09:45
                0
                Михаил, ну посудите сами, как я могу модифицировать код PHP, если ничего в этом не понимаю. Нет знаний. Поэтому есть два варианта — учить PHP, или обратиться за помощью к тому, кто уже его знает. И ладно, была бы это уникальная ситуация, никому кроме меня не нужная, тогда бы я написал кому-то из знакомых на почту и всё. Так нет, подумал вдруг это кому-то, такому же как я, пригодится, как пригодился мне тот код трёхлетней давности, который я привёл в ссылке.
                Я же не задал вопрос, решение которого уже много раз приводилось на сайте, не удосужившись немного поискать.
                Вот и вся разница. Что здесь понимать.
                  iWatchYouFromAfar
                  08 мая 2019, 01:35
                  +2
                  Нужно сделать много вещей которые пригодились бы многим. Много решений для минишопа уже есть тут, есть сам бесплатный компонент, есть документация, даже бесплатные компоненты к нему есть.

                  Вот вы написали — знаний у вас нет. Эти знания, это хлеб для разработчика. Он их не купил и не получил с рождения. А развивал их, тратил на это время своей жизни. Подсказать это одно, а выдать вам готовый вариант — другое. Вам никто не запрещает оплатить труд разработчика и выложить готовое решение на этом ресурсе в нужный раздел.

                  P.S.
                  Числовой артикул, уникальный, потому что id ресурса.
                  <?php
                  if ( $modx->event->name != "OnDocFormSave" || $resource->get('class_key') != 'msProduct' || !empty($resource->get('article')) ) return;
                  
                  // Создаем артикул формата Случайное число от 0 до 999-IDродитель-IDтовара
                  $resource->set('article', mt_rand(0, 999).$resource->get('parent').$resource->get('id'));
                  $resource->save();
                  $resource->clearCache();
                    websfera
                    08 мая 2019, 13:20
                    0
                    Вот вы написали — знаний у вас нет. Эти знания, это хлеб для разработчика.
                    В PHP знаний нет. Но в чём я специалист, я с радостью делюсь своими знаниями совершенно безплатно, когда ко мне обращаются. И беднее от этого не стал. Потому что, уважение за деньги не купишь. И ни от кого подобного не требую. Это дело добровольное.
                    Эти знания, это хлеб для разработчика.
                    Не хлебом единым… Но если у человека нет внутренней потребности помогать нуждающемуся, то тут конечно хлеб, хлеб и только хлеб.
                    Мда, уже в который раз пожалел, что создал этот топик. А создал не для того, чтобы получить безплатно готовый вариант и отобрать у кого-то его хлеб, а чтобы задача получила законченное решение и осталась здесь для тех, кто нуждается.
                    А иначе, зачем раздел help?
                    К тому же, это была просьба, высказанная в вежливой форме. Не упрёк, не требование, не наезд. Но оказалось — не по форме вопрос задал. Форма — всё, человеческое отношение ничто. А снисходить к непонимающему карма не позволяет?
                    К тому же, оплатить труд разработчика я могу в платном разделе Modstore (что уже неоднократно делал, и ещё не раз сделаю).
                      iWatchYouFromAfar
                      08 мая 2019, 13:38
                      0
                      Я тоже за добро, мир, дружбу и жвачку. И тут этого полно, это очень дружелюбное сообщество, тут помогают и очень часто. Наверное это потому что оно не очень большое и многие друг друга давно знают.

                      Нуждающиеся находятся не здесь, а в больницах, дет. домах и т.д. А тут люди сайтики делают, многие за деньги. Так что, не такая уж и проблема закинуть человеку на кошелек 300р. Специалист не станет миллиардером, вы беднее не станете, а специалиста это мотивирует помогать. Иногда он даже бесплатно будет это делать.

                      Ну и напоследок. Знания — это то, что человек продает. Когда люди под нож хирургу ложатся, они ему платят за его знания и навыки. За то, чему он учился половину своей жизни. Вам вон выше подсказали, но вы не смогли просто грамотно убрать из строчки указанный код. Это значит что у вас даже начальных знаний нет, вы хотите готовое решение.

                      Так почему бы не предложить человеку, который вам дал готовое решение — деньги? Наверное потому что вам жалко тратить на такой пустяк деньги, тут работы на 5 минут да? Если вы работаете с сфере создания сайтов, вы должны понимать что это неправильно. Мы не росой и лучами солнышка питаемся, а едой, которую нужно покупать за деньги, а деньги разработчики зарабатывают знаниями.
                        websfera
                        08 мая 2019, 14:41
                        0
                        не такая уж и проблема закинуть человеку на кошелек 300р.
                        Для меня проблема. Не в рублёвой зоне. Даже чтобы дополнение здесь купить приходится обращаться к друзьям из России.
                        Знания — это то, что человек продает.
                        Мы с вами как из разных человечеств )))
                        Для меня знания не товар, а скорее дар. Поэтому, мне так легко и естественно его дарить. Учусь всю жизнь, но по PHP есть хороший друг, поэтому мне всегда было легче спросить или попросить, чем изучать.
                        вы хотите готовое решение.
                        Да уже никто ничего не хочет )) Получил минусов полную корзину ))
                        А готовое решение было в том посте 3-хлетней давности в виде «pl-38125», что меня вполне бы устроило.
                        Мы не росой и лучами солнышка питаемся, а едой, которую нужно покупать за деньги, а деньги разработчики зарабатывают знаниями.
                        Так кто же спорит. Любой труд должен быть достойно вознаграждён.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        14