РЕШЕНО! Уникальность поля артикул
Всем привет!
Люди подскажите, как сделать проверку на уникальность поля артикул при создании товара в minishop2. Что бы не давало сохранить и уведомляло что такое значение уже есть!
Я так понимаю нужно сделать плагин, не разу не делал — подскажите как.
Финансовое спасибо пришлю!
Люди подскажите, как сделать проверку на уникальность поля артикул при создании товара в minishop2. Что бы не давало сохранить и уведомляло что такое значение уже есть!
Я так понимаю нужно сделать плагин, не разу не делал — подскажите как.
Финансовое спасибо пришлю!
Комментарии: 10
<?php
if ($modx->event->name == 'OnBeforeDocFormSave') {
if($resource->get('class_key') !== 'msProduct') {return;}
$article = $resource->get('article');
if(empty($article)) {return;}
if($count = $modx->getCount('msProductData', array('article' => $article ))) {
$response = array(
'success' => false,
'message' => 'Продукт с таким артикулом уже существует',
'data' => array(),
);
echo $modx->toJSON($response);
exit;
}
}
Огромное спасибо!!!
Напишите пожалуйста куда спасибо послать на dark@darkbsd.net
Напишите пожалуйста куда спасибо послать на dark@darkbsd.net
А что если пересохранять товар с одним и тем же артикулом — разве не вылезет алерт?
ага, точно, про это я чет не подумал )
тогда вот так можно
тогда вот так можно
<?php
if ($modx->event->name == 'OnBeforeDocFormSave') {
if($resource->get('class_key') !== 'msProduct') {return;}
$article = $resource->get('article');
if(empty($article)) {return;}
$q = $modx->newQuery('msProductData', array('article' => $article ));
$q->where(array(
'msProductData.id:!=' => $resource->get('id')
));
foreach ($modx->getIterator('msProductData', $q) as $re) {
$response = array(
'success' => false,
'message' => 'Продукт с таким артикулом уже существует',
'data' => array(),
);
echo $modx->toJSON($response);
exit;
}
}
Цикл не нужен:
$q = $modx->newQuery('msProductData', array('article' => $article ));
// Если это обновление ресурса - исключаем его из условия
if ($mode == 'upd') {
$q->where(array('id:!=' => $resource->get('id')));
}
if ($modx->getCount('msProductData', q)) {
// ... Возврат ошибки
}
Подскажите, как это можно применить для такой проблемы
я по теме нашел еще это, только там если пользователя нет — то происходит регистрация, и идёт проверка по одному полю
я по теме нашел еще это, только там если пользователя нет — то происходит регистрация, и идёт проверка по одному полю
если несколько языков (контекстов) и при создании перевода для товара, появляется ошибка. можно как-то проверять только по текущему контексту?
По-моему самый простой вариант — указать в БД, что INDEX уникальный для колонки с артикулами… Правда не знаю, как будет тогда в админке выводиться ошибка в случае дублирования… Нужен все таки будет отдельный плагин или внутри самого MODx все уже предусмотренно для вывода оповещений о подобных ошибках…
Как бы оно не было, но в любом случае для ускорения работы БД сделать индекс уникальным будет не лишним точно…
Как бы оно не было, но в любом случае для ускорения работы БД сделать индекс уникальным будет не лишним точно…
UPD: Сам предложил — сам и опровергну. Для увеличения скорости БД, помимо указания того, что индекс уникальный, дополнительно нужно произвести еще ряд доработок в плане оптимизации… К примеру, перенести физическое расположение колонки артикулов на второе место после колонки с ID… Более того, скорее всего нужно будет оптимизировать ряд SQL запросов, в противном случае эффект от дополнительного уникального индекса может не быть никакого эффекта… Ну и еще ряд нюансов… Реально, кроме железо-бетонной уникальности самих артикулов без оптимизации может не быть никакого толку… Более того, бессмысленно вырастет количество МБ, требуемое для физического хранения БД. И даже еще из-за увеличения размера может вообще в случае совсем здоровых таблиц получиться обратный эффект и наоборот снизится скорость работы… Поэтому стоит признать, что мое предложение не самое лучшее…
…
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.