Автоматическое формирование Артикула (SKU) Opencart 2.2

Тема в разделе "Общие вопросы", создана пользователем KIVIn, 8 апр 2016.

  1. KIVIn

    KIVIn Пользователь

    Сообщения:
    38
    Симпатии:
    5
    Помогите разобраться с проблемой.
    При создании товара opencart 2.2 не заполняет поле Артикул(SKU) оставляя его пустым. Я захотел сделать автоматическое заполнение этого поля как при создании нового товара так и при копирование. После поисков в инете использовал такой способ

    Заполнение при создании товара

    admin/controller/catalog/product.php
    находим

    if(isset($this->request->post['sku'])){
    $this->data['sku']= $this->request->post['sku'];
    } elseif (!empty($product_info)){
    $this->data['sku']= $product_info['sku'];
    }else{
    $this->data['sku']='';
    }
    делаем

    if(isset($this->request->post['sku'])){
    $this->data['sku']= $this->request->post['sku'];
    } elseif (!empty($product_info)){
    $this->data['sku']= $product_info['sku'];
    }else{
    $sku_auto = $this->db->query("SELECT MAX(sku) as sku FROM ". DB_PREFIX ."product");
    $this->data['sku']= $sku_auto->row['sku']+1;
    }


    Для того чтобы артикул генерировался при копировании

    admin/model/catalog/product.php

    ищем
    publicfunction copyProduct($product_id)

    куданить тут

    if($query->num_rows){
    $data = array();

    $data = $query->row;

    $data['keyword']='';

    добавим

    $sku_auto = $this->db->query("SELECT MAX(sku) as sku FROM ". DB_PREFIX ."product");
    $data['sku']= $sku_auto->row['sku']+1;


    В итоге при отработки данного изменение в админке я вижу ошибку

    Notice: Indirect modification of overloaded property ControllerCatalogProduct::$data has no effect in /admin/controller/catalog/product.php on line 753

    генерация Артикула не происходит :-(
     
    Последнее редактирование: 1 фев 2017
  2. Ален

    Ален Эксперт

    Сообщения:
    2.056
    Симпатии:
    640
    Не трогайте контроллер. Вам нужно в моделе делать update. Вот как у меня устроено
    PHP:
    $this->db->query("UPDATE " DB_PREFIX "product SET sku = LPAD(product_id,4,'0000') WHERE product_id = ' " . (int)$product_id " ' " );
    т.е данный запрос формирует sku вида id товара с постоянным кол-м цифр. Т.е если id = 12 то sku будет 0012
     
    KIVIn и RoS нравится это.
  3. urnash

    urnash Новичок

    Сообщения:
    1
    Симпатии:
    0

    Подскажите в какую строчку это добавлять ?
     
  4. Ален

    Ален Эксперт

    Сообщения:
    2.056
    Симпатии:
    640
    \admin\model\catalog\product.php

    в начале кода, сразу после
    PHP:
    $product_id $this->db->getLastId();
     
  5. mars1an

    mars1an Специалист

    Сообщения:
    629
    Симпатии:
    516
    Есть грубый мод, дорабатывать нет времени. Задаёт товарам при редактировании и создании артикул вида id производителя 00 + id товара 0000.
    А недоработки в следующем:
    • Во время редактирования поле артикула пустое, это нормально, артикул заполниться после сохранения.
    • Нет возможности задать артикул вручную, после сохранения он всё равно сгенерится по алгоритму.
    На своё менять вот здесь:
    Код:
    CONCAT (LPAD(manufacturer_id,2,'00'), LPAD(product_id,4,'0000'))
     

    Вложения:

    KIVIn нравится это.
  6. eeea

    eeea Новичок

    Сообщения:
    2
    Симпатии:
    0
    Знатоки, подскажите пожалуйста, как сделать такое же с "моделью товара"?
     
  7. Ален

    Ален Эксперт

    Сообщения:
    2.056
    Симпатии:
    640
    выше все указана, нужно только немного подумать применить тоже самое, но к model
     
  8. eeea

    eeea Новичок

    Сообщения:
    2
    Симпатии:
    0
    Спасибо. Уже решил свою задачу иначе.
    Видимо нужно было так: меняем sku на model и убираем "обязательность" поля model в админке.
    Код:
    $this->db->query("UPDATE " . DB_PREFIX . "product SET model = LPAD(product_id,4,'0000') WHERE product_id = ' " . (int)$product_id . " ' " );
    Поправьте, пожалуйста, если не так, чтобы не дезинформировать ищущего решение
     
    Последнее редактирование: 8 янв 2017
  9. mazioka

    mazioka Новичок

    Сообщения:
    3
    Симпатии:
    0
    для ocStore 2.3.0.2.3 данное решение не подходит?
     
  10. Ravilr

    Ravilr Специалист

    Сообщения:
    3.864
    Симпатии:
    1.059
    Подходит.
     
  11. SanchoMDA

    SanchoMDA Новичок

    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте, а если id=100034523?

    Чем плох этот способ?
     
    Последнее редактирование: 5 сен 2018
  12. Ravilr

    Ravilr Специалист

    Сообщения:
    3.864
    Симпатии:
    1.059
    Ничем не плох. Тоже сойдет.
     
    SanchoMDA нравится это.
  13. SanchoMDA

    SanchoMDA Новичок

    Сообщения:
    2
    Симпатии:
    0
    Значит буду пользоваться, спс.
     
  14. Sudya

    Sudya Новичок

    Сообщения:
    2
    Симпатии:
    0
    Подскажите, как добавить префикс к артикулу
    Что-то совсем с гуглом сегодня не дружится(((

    есть конструкция в контроллере
    Код:
     if (isset($this->request->post['model'])) {
                $data['model'] = $this->request->post['model'];
            } elseif (!empty($product_info)) {
                $data['model'] = $product_info['model'];
            } else {
                $auto_model = $this->db->query("SELECT LPAD( MAX(product_id) + 1, 4, '0000') FROM " . DB_PREFIX . "product");
                $data['model'] = $auto_model->row["LPAD( MAX(product_id) + 1, 4, '0000')"];
            }
    Получаю например 0115, как добавить префикс слева? чтобы было abc-0115 ?
     
  15. Ravilr

    Ravilr Специалист

    Сообщения:
    3.864
    Симпатии:
    1.059
    Я так понял проблема не в запросе, а в не знании php ??

    $mydata = 'text' . $priv;
     
  16. Sudya

    Sudya Новичок

    Сообщения:
    2
    Симпатии:
    0
    именно, спасибо тебе огромное

    а я ищу всякие merge)) или что-то типа $mydata = 'text' && $priv;