РЕШЕНО! Уникальность поля артикул

Всем привет!
Люди подскажите, как сделать проверку на уникальность поля артикул при создании товара в minishop2. Что бы не давало сохранить и уведомляло что такое значение уже есть!

Я так понимаю нужно сделать плагин, не разу не делал — подскажите как.
Финансовое спасибо пришлю!
Алексей Марченко
05 февраля 2015, 11:47
modx.pro
4
1 660
+1

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

Володя
05 февраля 2015, 19:53
2
+3
<?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;
        
    }

}
    Алексей Марченко
    05 февраля 2015, 20:06
    0
    Огромное спасибо!!!
    Напишите пожалуйста куда спасибо послать на dark@darkbsd.net
      Максим Кузнецов
      05 февраля 2015, 21:29
      +1
      А что если пересохранять товар с одним и тем же артикулом — разве не вылезет алерт?
        Володя
        05 февраля 2015, 21:54
        1
        +2
        ага, точно, про это я чет не подумал )
        тогда вот так можно
        <?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;
            }
        
        }
          Василий Наумкин
          05 февраля 2015, 22:08
          1
          0
          Цикл не нужен:
          $q = $modx->newQuery('msProductData', array('article' => $article ));
          // Если это обновление ресурса - исключаем его из условия
          if ($mode == 'upd') {
          	$q->where(array('id:!=' => $resource->get('id')));
          }
          if ($modx->getCount('msProductData', q)) {
          	// ... Возврат ошибки
          }
            Илья
            06 июля 2015, 10:31
            0
            Подскажите, как это можно применить для такой проблемы

            я по теме нашел еще это, только там если пользователя нет — то происходит регистрация, и идёт проверка по одному полю
              Владимир
              21 февраля 2019, 18:36
              0
              если несколько языков (контекстов) и при создании перевода для товара, появляется ошибка. можно как-то проверять только по текущему контексту?
            Волков Николай
            05 июля 2017, 02:22
            0
            По-моему самый простой вариант — указать в БД, что INDEX уникальный для колонки с артикулами… Правда не знаю, как будет тогда в админке выводиться ошибка в случае дублирования… Нужен все таки будет отдельный плагин или внутри самого MODx все уже предусмотренно для вывода оповещений о подобных ошибках…

            Как бы оно не было, но в любом случае для ускорения работы БД сделать индекс уникальным будет не лишним точно…
              Волков Николай
              05 июля 2017, 02:49
              0
              UPD: Сам предложил — сам и опровергну. Для увеличения скорости БД, помимо указания того, что индекс уникальный, дополнительно нужно произвести еще ряд доработок в плане оптимизации… К примеру, перенести физическое расположение колонки артикулов на второе место после колонки с ID… Более того, скорее всего нужно будет оптимизировать ряд SQL запросов, в противном случае эффект от дополнительного уникального индекса может не быть никакого эффекта… Ну и еще ряд нюансов… Реально, кроме железо-бетонной уникальности самих артикулов без оптимизации может не быть никакого толку… Более того, бессмысленно вырастет количество МБ, требуемое для физического хранения БД. И даже еще из-за увеличения размера может вообще в случае совсем здоровых таблиц получиться обратный эффект и наоборот снизится скорость работы… Поэтому стоит признать, что мое предложение не самое лучшее…
            Denis
            05 июля 2017, 02:03
            0
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              10