Автоувеличение на единицу в поле "Артикул"

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

Ivan2018 M
Ivan2018 M
Возраст: 45
Репутация: 1
Сообщения: 54
Зарегистрирован: 12.02.2018
С нами: 6 лет 1 месяц

Сообщение #1 Ivan2018 » 04.04.2018, 06:59

На сайте свыше 2 тыс товаров. Артикул начинается так, первый товар Артикул= 1, Артикул= 2, Артикул= 3 ... чисто цифрой, то есть все по порядку.
Необходимо сделать в админке, чтобы в базе находился максимум в этом поле и прибавлялась 1, при создании нового товара.
Т.к. человеческий фактор существует, могут быть допущены ошибки при написании значения в поле Артикул.

makki M
makki M
Репутация: 199
Сообщения: 697
Зарегистрирован: 12.08.2016
С нами: 7 лет 7 месяцев
Откуда: Киев
Сайт

Сообщение #2 makki » 04.04.2018, 08:08

Чтобы прописать Артикул для существующих товаров, сделайте такой запрос в базу данных

Код: Выделить всё

UPDATE ok_variants SET sku=id;

Для того, чтобы при последующем добавлении новых товаров автоматически добавлялся Артикул, в файле api/Variants.php в функции add_variant после строки

Код: Выделить всё

$variant_id = $this->db->insert_id();

добавьте

Код: Выделить всё

if(empty($variant->sku)) {
            $this->db->query("UPDATE __variants SET sku=id WHERE id=?", $variant_id);
        }

Чтобы артикул выглядел так: 100001, 100002 и т.д., поменяйте в запросах sku=id на

Код: Выделить всё

sku=concat('1',substring(concat ('00000',id),-5))
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #3 korshunov » 04.04.2018, 08:22

А почему не попроще
UPDATE `ok_variants` SET `sku` = id;

Или уж, если не хочется маленьких чисел, то
UPDATE `ok_variants` SET `sku` = 1000000+id;

А если непременно при создании надо, то
в api/Variants.php после

public function add_variant($variant) {
$variant = (object)$variant;
$result = $this->languages->get_description($variant, 'variant');

$query = $this->db->placehold("INSERT INTO __variants SET ?%", $variant);
$this->db->query($query);
$variant_id = $this->db->insert_id();

добавить
$query = $this->db->placehold("UPDATE __variants SET sku=1000000+id WHERE id=? LIMIT 1", $variant_id);
$this->db->query($query);

makki M
makki M
Репутация: 199
Сообщения: 697
Зарегистрирован: 12.08.2016
С нами: 7 лет 7 месяцев
Откуда: Киев
Сайт

Сообщение #4 makki » 04.04.2018, 08:36

korshunov писал(а):А почему не попроще
UPDATE `ok_variants` SET `sku` = id;

Или уж, если не хочется маленьких чисел, то
UPDATE `ok_variants` SET `sku` = 1000000+id;
Мне больше нравится когда разрядность у всех артикулов одинаковая :)
Cоздание и расширение функционала интернет-магазина на платформе OkayCMS 2 (с 3-й и 4-й версией не работаю)

Ivan2018 M
Ivan2018 M
Возраст: 45
Репутация: 1
Сообщения: 54
Зарегистрирован: 12.02.2018
С нами: 6 лет 1 месяц

Сообщение #5 Ivan2018 » 04.04.2018, 09:08

korshunov писал(а):добавить
$query = $this->db->placehold("UPDATE __variants SET sku=1000000+id WHERE id=? LIMIT 1", $variant_id);
$this->db->query($query);

Не добавляется артикул, что еще можно сделать? Может кеш удалить из папок
/compiled/
/backend/design/compiled/

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #6 korshunov » 04.04.2018, 11:50

Ivan2018 писал(а):
korshunov писал(а):добавить
Не добавляется артикул, что еще можно сделать?
Про то, что "еще можно сделать", можно книгу толстенную написать на сотни страниц.
Если дадите FTP, могу посмотреть...

Ivan2018 M
Ivan2018 M
Возраст: 45
Репутация: 1
Сообщения: 54
Зарегистрирован: 12.02.2018
С нами: 6 лет 1 месяц

Сообщение #7 Ivan2018 » 05.04.2018, 05:35

При таком раскладе

Код: Выделить всё

$query = $this->db->placehold("UPDATE __variants SET sku=id WHERE id=? LIMIT 1", $variant_id);
$this->db->query($query);

не находит максимальное значение, а пишет число 11031, у меня максимальный артикул 2750,
то есть при сохранении нового товара должно вставляться в ячейку артикула значение: 2751.

В примерах есть такое:
"Как определить наибольшее значение в столбце?"
SELECT MAX(article) AS article FROM shop

Тогда может быть WHERE id=? заменить на WHERE id=MAX(id)

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #8 korshunov » 05.04.2018, 06:27

Пробуйте заменить. Думаю, с гарантией получите ошибку SQL.

Если хотите работать по Вашему примеру, то, чтобы было полностью правильно, надо делать несколько сложнее, так как в поле артикула sku значения, вообще говоря, не числовые, и это надо учитывать.

Если не хотите использовать простые способы типа sku=substring(concat ('000000',id),-5), sku=1000000+id, sku=concat('A',d), дело Ваше. Если непременно хочется сделать из простого вопроса сложный, пробуйте идти своим путем...

Ivan2018 M
Ivan2018 M
Возраст: 45
Репутация: 1
Сообщения: 54
Зарегистрирован: 12.02.2018
С нами: 6 лет 1 месяц

Сообщение #9 Ivan2018 » 05.04.2018, 08:16

Чем проще тем лучше, не принципиально значение артикула, важно что автоматом ставится и последовательно, оставил так

Код: Выделить всё

$query = $this->db->placehold("UPDATE __variants SET sku=id WHERE id=? LIMIT 1", $variant_id);
$this->db->query($query);   

Julius123 M
Julius123 M
Репутация: 20
Сообщения: 225
Зарегистрирован: 05.02.2017
С нами: 7 лет 1 месяц

Сообщение #10 Julius123 » 09.04.2018, 13:18

У меня почему-то запрос "UPDATE `ok_variants` SET `sku` = 1000000+id;" не меняет текущие значения Артикула, все остаётся как и было

Ivan2018 M
Ivan2018 M
Возраст: 45
Репутация: 1
Сообщения: 54
Зарегистрирован: 12.02.2018
С нами: 6 лет 1 месяц

Сообщение #11 Ivan2018 » 09.04.2018, 13:19

Julius123 писал(а):У меня почему-то запрос "UPDATE `ok_variants` SET `sku` = 1000000+id;" не меняет текущие значения Артикула, все остаётся как и было
Сохраните товар и артикул появится

Julius123 M
Julius123 M
Репутация: 20
Сообщения: 225
Зарегистрирован: 05.02.2017
С нами: 7 лет 1 месяц

Сообщение #12 Julius123 » 09.04.2018, 13:21

Ivan2018 писал(а):
Julius123 писал(а):У меня почему-то запрос "UPDATE `ok_variants` SET `sku` = 1000000+id;" не меняет текущие значения Артикула, все остаётся как и было
Сохраните товар и артикул появится
Мне что все несколько тысяч пересохранить? )
но вопрос в другом, я не очень хочу такое длинное значение и ставлю в запрос 100+id "UPDATE `ok_variants` SET `sku` = 100+id;" но не работает, пишет что запрос затронул 0 строк, но если выполнять "UPDATE `ok_variants` SET `sku` = 1000000+id;" тогда работает

Добавлено спустя 5 минут 18 секунд:
Кажется уже разобрался, не совсем понял как работает запрос, думал что будет видать число 100 отдельно и плюс число id товара, а тут просто математическое добавление одного числа к другому

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #13 korshunov » 09.04.2018, 13:31

Все правильно, так и быть должно.
"затронул 0 строк" - это и значит, что сработал.
А если чуть-чуть задумаетесь, то легко понять, почему затронуто 0 строк.
Подсказка: выполните запрос типа "UPDATE `ok_variants` SET `sku` = 200+id;" 2 раза и каждый раз обращайте внимание на отчет о выполнении...

Julius123 M
Julius123 M
Репутация: 20
Сообщения: 225
Зарегистрирован: 05.02.2017
С нами: 7 лет 1 месяц

Сообщение #14 Julius123 » 09.04.2018, 13:41

korshunov писал(а):А если непременно при создании надо, то
в api/Variants.php после

public function add_variant($variant) {
$variant = (object)$variant;
$result = $this->languages->get_description($variant, 'variant');

$query = $this->db->placehold("INSERT INTO __variants SET ?%", $variant);
$this->db->query($query);
$variant_id = $this->db->insert_id();

добавить
$query = $this->db->placehold("UPDATE __variants SET sku=1000000+id WHERE id=? LIMIT 1", $variant_id);
$this->db->query($query);
Еще такой вопрос, вот если например добавление идет не через админку а через импорт, это тоже будет работать?

korshunov
korshunov
Репутация: 146
Сообщения: 1854
Зарегистрирован: 03.12.2015
С нами: 8 лет 3 месяца
Skype

Сообщение #15 korshunov » 09.04.2018, 14:45

Должно работать.
А быстрее было бы Вам самому провести эксперимент за пару минут и узнать точно...

the99dots M
the99dots M
Репутация: 0
Сообщения: 3
Зарегистрирован: 21.12.2022
С нами: 1 год 3 месяца
Откуда: Львів
Сайт Skype

Сообщение #16 the99dots » 21.12.2022, 19:31

Julius123 писал(а):А если непременно при создании надо, то
в api/Variants.php после

Объясните пжлст более подробно, куда именно этот кусок кода вставлять... не нашел в структуре сайта файл Variants.php
или это возможно только через пхп-май-админ?
9 Dots Studio [https://9.lviv.ua]


Название раздела: Вопросы по работе с OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Вопросы по работе с OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 35 гостей