Автоматическое создание артикула
Может кому пригодится.
Если храним артикул в ТВ и не охото заморачиватся с прописыванием каждого артикула в ручную.
Если нет изначальных артикулов, а их надо придумать.
Артикулы получаются типа: pl-38125 или 438125 во второй версии плагина.
Создаем ТВ с именем например articul, привязываем к шаблону карточки товара.
Создаем плагин с именем например CreateArticul, который проверяет если ТВ артикула пустое то при сохранении документа он будет создан.
Вешаем плагин на событие: OnDocFormSave
Не много модифицировал плагин под числовые значения:
Если храним артикул в ТВ и не охото заморачиватся с прописыванием каждого артикула в ручную.
Если нет изначальных артикулов, а их надо придумать.
Артикулы получаются типа: pl-38125 или 438125 во второй версии плагина.
Создаем ТВ с именем например articul, привязываем к шаблону карточки товара.
Создаем плагин с именем например CreateArticul, который проверяет если ТВ артикула пустое то при сохранении документа он будет создан.
Вешаем плагин на событие: OnDocFormSave
<?php
if ($modx->event->name=="OnDocFormSave") // Плагин срабатывает при сохранении ресурса
{
$tv = 'articul'; // ТВ артикула
$id = $resource->get('id'); // Получаем id ресурса
$parent = $resource->get('parent'); // Получаем id родительского ресурса
$alias = $resource->get('alias'); // Получаем alias ресурса
$tvv = $resource->getTVValue($tv); // Получаем ТВ
if (empty($tvv)) // Если ТВ пустое то создаем артикул
{
$articul = substr($alias,0,2).'-'.$parent.$id; // Создаем артикул
$resource->setTVValue($tv, $articul); // Записываем артикул в ТВ
}
}Артикулы получаются типа: pl-38125Не много модифицировал плагин под числовые значения:
<?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);
}
}Артикулы получаются в числовом формате типа: 438125 Комментарии: 14
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Но в этом плагине смущают меня два момента:
1. Зачем снова получаем объект ресурса, если он есть в переменной $resource? По-моему, все функции, типа save() и clearCache() в нём тоже доступны.
2. Плагин выполняет код после сохранения страницы. При сохранении страницы чистится кэш (по умолчанию). И создаётся он только тогда, когда к странице снова обратятся на фронтенде (насколько я знаю). Зачем тогда снова чистить кэш после сохранения поля?
Кеш можно так же отключить плагином, что бы не чистился при сохранении каждого ресурса например.
Так что подстраховка, если кеш не отключен плагином то можно строку $res->clearCache(); закомментировать или удалить, хотя вреда от нее нет никакого. ;)
И просто скопировал модифицированный мой вариант предложенный Сергей Фещуков.
Спросите автора минишопа Василий Наумкин как правильно получить объект товара.
Потому что в коде выше:
rtfm.modx.com/revolution/2.x/developing-in-modx/basic-development/plugins/system-events/ondocformsave
Проверено только что.
Версия ModX — 1.0.15. Каталог товаров организован через ресурсы. В чем может быть проблема? Использовал все возможные вариации кода плагина.