Уникальный SKU (артикул) проверка на дубле при вводе

Тема в разделе "Общие вопросы", создана пользователем mracula, 16 май 2023.

  1. mracula

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

    Сообщения:
    64
    Симпатии:
    2
    Как сделать проверку при вводе артикула (sku) на дубли, уже существующие значения в базе данных?
     
  2. zema50

    zema50 Продвинутый пользователь

    Сообщения:
    852
    Симпатии:
    94
    я бы прописал autocomplete, а так могут быть и другие решения конечно.
     
  3. Blast

    Blast Продвинутый пользователь

    Сообщения:
    215
    Симпатии:
    77
    в модели product нужен метод, который принимает sku как параметр, делает запрос COUNT к таблице oc_product и возвращает либо количество, либо сразу true/false
    в контроллере в методе validateForm вписываем вызов этого метода и если такой sku найден, то пишем ошибку в $this->error
    текст ошибки закидываем в языковой файл.
    ну общий алгоритм примерно такой
     
  4. Tom

    Tom Специалист

    Сообщения:
    716
    Симпатии:
    220
    Код:
    <?xml version="1.0" encoding="utf-8"?>
    <modification>
        <name>UNIK SKU</name>
        <code>UNIK SKU</code>
        <version>1.0</version>
        <author>Tom</author>
        <link>UNIK SKU</link>
       
        <file path="admin/model/catalog/product.php">
            <operation>
                <search><![CDATA[public function getProduct($product_id) {]]></search>
                <add position="before"><![CDATA[
                  public function getTotalProductsBySku($sku, $product_id = 0) {
                  if ($product_id) {
                          $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product WHERE LOWER(sku) = '" . $this->db->escape(utf8_strtolower($sku)) . "' AND product_id != '" . (int)$product_id . "'");
                      } else {
                          $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "product WHERE LOWER(sku) = '" . $this->db->escape(utf8_strtolower($sku)) . "'");
                      }
                      return $query->row;
                  }
                ]]></add>
            </operation>
        </file>
        <file path="admin/controller/catalog/product.php">
            <operation>
                <search><![CDATA[$data['error_keyword'] = '';]]></search>
                <add position="after" offset="1"><![CDATA[
                    if (isset($this->error['sku'])) {
                    $data['error_sku'] = $this->error['sku'];
                    } else {
                    $data['error_sku'] = '';
                }]]></add>
            </operation>
            <operation>
                <search><![CDATA[$this->error['model'] = $this->language->get('error_model');]]></search>
                <add position="after" offset="1"><![CDATA[
                    $this->load->model('catalog/product');
                    if ($this->request->post['sku']) {
                        if (isset($this->request->get['product_id'])) {
                            if ($this->model_catalog_product->getTotalProductsBySku($this->request->post['sku'], $this->request->get['product_id'])) {
                             $this->error['sku'] = $this->language->get('error_sku');
                         }
                        } else {
                            if ($this->model_catalog_product->getTotalProductsBySku($this->request->post['sku'])) {
                               $this->error['sku'] = $this->language->get('error_sku');
                            }
                    }
                }]]></add>
            </operation>
        </file>
        <file path="admin/view/template/catalog/product_form.twig">
            <operation>
                <search><![CDATA[<input type="text" name="sku" value="{{ sku }}" placeholder="{{ entry_sku }}" id="input-sku" class="form-control"/>]]></search>
                <add position="after"><![CDATA[{% if error_sku %}<div class="text-danger">{{ error_sku }}</div>{% endif %}]]></add>
            </operation>
        </file>
        <file path="admin/language/ru-ru/catalog/product.php">
            <operation>
                <search><![CDATA[// Text]]></search>
                <add position="after"><![CDATA[$_['error_sku'] = 'Артикул должен быть уникален, данный артикул уже присутсвует в другом товаре!';]]></add>
            </operation>
        </file>
    </modification>        
     
    Последнее редактирование: 16 май 2023
    Ravilr и Blast нравится это.
  5. Tom

    Tom Специалист

    Сообщения:
    716
    Симпатии:
    220
    Код:
    <?xml version="1.0" encoding="utf-8"?>
    <modification>
      <name>UNIK SKU SIMPLE</name>
      <code>UNIK SKU SIMPLE</code>
      <version>1.0</version>
      <author>Tom</author>
      <link>UNIK SKU SIMPLE</link>
      <file path="admin/controller/catalog/product.php">
        <operation>
          <search><![CDATA[if ((utf8_strlen($this->request->post['model']) < 1) || (utf8_strlen($this->request->post['model']) > 64)) {]]></search>
          <add position="before"><![CDATA[
            if (!empty($this->request->post['sku'])) {
                $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "product WHERE sku LIKE '" . $this->db->escape($this->request->post['sku']) . "'" . (isset($this->request->get['product_id']) ? " AND product_id != '" . (int)$this->request->get['product_id'] . "'" : ""));
                if ($query->row['total'] > 0) $this->error['sku'] = $this->language->get('error_sku');
            }
          ]]></add>
        </operation>
      </file>
          <file path="admin/controller/catalog/product.php">
            <operation>
                <search><![CDATA[$data['error_keyword'] = '';]]></search>
                <add position="after" offset="1"><![CDATA[
                    if (isset($this->error['sku'])) {
                      $data['error_sku'] = $this->error['sku'];
                    } else {
                     $data['error_sku'] = '';
                    }
                ]]></add>
            </operation>
        </file>
        <file path="admin/view/template/catalog/product_form.twig">
            <operation>
                <search><![CDATA[<input type="text" name="sku" value="{{ sku }}" placeholder="{{ entry_sku }}" id="input-sku" class="form-control"/>]]></search>
                <add position="after"><![CDATA[{% if error_sku %}<div class="text-danger">{{ error_sku }}</div>{% endif %}]]></add>
            </operation>
        </file>
        <file path="admin/language/ru-ru/catalog/product.php">
            <operation>
                <search><![CDATA[// Text]]></search>
                <add position="after"><![CDATA[$_['error_sku'] = 'Артикул должен быть уникален, данный артикул уже присутсвует в другом товаре!';]]></add>
            </operation>
            </file>
    </modification>
     
    Последнее редактирование: 16 май 2023
    Ravilr нравится это.