Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

[Решено] Как удалить атрибут, если он присвоен товару?


VladBlad

Recommended Posts

Пытаюсь удалить атрибут, пишет сообщение:

Этот атрибут не может быть удален, так как назначен 2 товарам!

Как найти эти товары, которым присвоен данный атрибут?

Надіслати
Поділитися на інших сайтах


  • 8 months later...

Если товаров не много, я делал так:

1. Качаем SQL БД,

2. Ищем в "oc_product_attribute" нужный атрибут и  смотрим id товара,

Пример: INSERT INTO `oc_product_attribute` (`product_id`, `attribute_id`, `language_id`, `text`) VALUES ('68', '12', '1', 'металл');

 

3. Дальше ищем в БД "product_id=11111", где "11111" - это id нужного товара

4. Там же рядом "product_id=..." есть значение, напримет "korobka-2" - это урл товара,

 

Выглядит строчка так 

INSERT INTO `oc_url_alias` (`url_alias_id`, `query`, `keyword`) VALUES ('849', 'product_id=68', 'korobka-2');

  • +1 1
Надіслати
Поділитися на інших сайтах


определяем id атрибута

 

SELECT * FROM `oc_product_attribute` where `attribute_id`=

 

Если совсем не нужен, то

DELETE FROM `oc_product_attribute`  where `attribute_id`=

 

И удаляем атрибут из админки
 

  • +1 3
Надіслати
Поділитися на інших сайтах

определяем id атрибута

 

SELECT * FROM `oc_product_attribute` where `attribute_id`=

 

Если совсем не нужен, то

DELETE FROM `oc_product_attribute`  where `attribute_id`=

 

И удаляем атрибут из админки

 

 

Можно подробнее про удаление из админки?

Есть 300 товаров с атрибутом "а", как бы его везде удалить?

 

p.s. и 300 это не предел)) реструктуризация карточек товара однако  :ugeek:

Надіслати
Поділитися на інших сайтах


Можно подробнее про удаление из админки?

Есть 300 товаров с атрибутом "а", как бы его везде удалить?

 

p.s. и 300 это не предел)) реструктуризация карточек товара однако  :ugeek:

Из админки удаляется сам атрибут

Сначала нужно удалить атрибут из товара в phpmyadmin

Надіслати
Поділитися на інших сайтах

вы можете определить id атрибута?

Да.

Я имел ввиду, если без команд через панель myadmin, просто выгрузить через сам ocStoree и перезалить.

там точно ничего не накроется?

Надіслати
Поділитися на інших сайтах


  • 2 years later...
  • 3 years later...
В 04.04.2014 в 15:50, chukcha сказал:

определяем id атрибута

 

SELECT * FROM `oc_product_attribute` where `attribute_id`=

 

Если совсем не нужен, то

DELETE FROM `oc_product_attribute`  where `attribute_id`=

 

И удаляем атрибут из админки
 


Прошу прощения, можете уточнить где это вводить?

Надіслати
Поділитися на інших сайтах


  • 11 months later...
В 04.04.2014 в 16:39, dst сказал:

Всё разобрался.

 

Если и правда разобрались поделитесь опытом, тоже очень нужно определить товары с ненужным атрибутом и во всех его удалить

Надіслати
Поділитися на інших сайтах


3 часа назад, Danishevskiy сказал:

 

Если и правда разобрались поделитесь опытом, тоже очень нужно определить товары с ненужным атрибутом и во всех его удалить

 

Заходим в админку сайта, далее Каталог - Характеристики - Характеристики, выбираем нужный атрибут и редактируем.

 

В адресной строке есть айди атрибута: http://joxi.ru/vAWnevYH3kPq12

 

Когда имеем айди, делаем запрос в базу данных как описано выше.

 

В 04.04.2014 в 14:50, chukcha сказал:

определяем id атрибута

 

SELECT * FROM `oc_product_attribute` where `attribute_id`=

 

Если совсем не нужен, то

DELETE FROM `oc_product_attribute`  where `attribute_id`=

 

И удаляем атрибут из админки
 

 

Перед всеми действиями в базе данных рекомендую сделать бекап базы данных!

  • +1 2
Надіслати
Поділитися на інших сайтах

Почему нельзя сразу удалить Атрибут/ы в даминке? - а всё потому, что перед удалением идет проверка на наличие Атрибутов у Товаров

в файле - admin/controller/catalog/attribute.php

Метод -

protected function validateDelete() {
	if (!$this->user->hasPermission('modify', 'catalog/attribute')) {
		$this->error['warning'] = $this->language->get('error_permission');
	}

	$this->load->model('catalog/product');
	//здесь проверка
	foreach ($this->request->post['selected'] as $attribute_id) {
		$product_total = $this->model_catalog_product->getTotalProductsByAttributeId($attribute_id);

		if ($product_total) {
			$this->error['warning'] = sprintf($this->language->get('error_product'), $product_total);
		}
	}

	return !$this->error;
}

 

обойти это просто (чтоб не использовать выше предложенные решения, которые для Новачка возможно будут сложными, да и по времени затратные).

 

Решение - закончить проверку в данном Методе раньше до проверки на наличие Атрибутов в Товарах -

protected function validateDelete() {
	if (!$this->user->hasPermission('modify', 'catalog/attribute')) {
		$this->error['warning'] = $this->language->get('error_permission');
	}
	//fix решение
	return !$this->error;
	$this->load->model('catalog/product');

	foreach ($this->request->post['selected'] as $attribute_id) {
		$product_total = $this->model_catalog_product->getTotalProductsByAttributeId($attribute_id);

		if ($product_total) {
			$this->error['warning'] = sprintf($this->language->get('error_product'), $product_total);
		}
	}

	return !$this->error;
}

 

и удалить в таблице `product_attribute` (если будут данные атрибуты)

в файле admin/model/catalog/attribute.php

Метод -

public function deleteAttribute($attribute_id) {

	//fix del_control
	$this->db->query("DELETE FROM `".DB_PREFIX."product_attribute` WHERE `attribute_id` = ".(int)$attribute_id);
		
	$this->db->query("DELETE FROM " . DB_PREFIX . "attribute WHERE attribute_id = '" . (int)$attribute_id . "'");
	$this->db->query("DELETE FROM " . DB_PREFIX . "attribute_description WHERE attribute_id = '" . (int)$attribute_id . "'");

}

 

можно и модификатором (для Opencart 2.x.x и 3.0.x)

сам код модификатора -

<?xml version="1.0" encoding="utf-8"?>
<modification>
    <name><![CDATA[FIX delAttribute for Opencart 2.x.x - 3.0.x]]></name>
    <code>delattribute</code>
    <version>1.0</version>
    <author>Vier</author>
    <link>#</link>
	<file path="admin/controller/catalog/attribute.php">
        <operation>
			<search><![CDATA[function validateDelete()]]></search>
			<add position="after" offset="4"><![CDATA[
		/*fix_delattribute*/
		return !$this->error;
        /*end fix_delattribute*/
            ]]></add>
		</operation>
    </file>
    <file path="admin/model/catalog/attribute.php">
        <operation>
			<search><![CDATA[function deleteAttribute($attribute_id]]></search>
			<add position="after" offset="2"><![CDATA[
		/*fix_delattribute*/
		$this->db->query("DELETE FROM `".DB_PREFIX."product_attribute` WHERE `attribute_id` = ".(int)$attribute_id);
        /*end fix_delattribute*/
            ]]></add>
		</operation>
    </file>
</modification>

 

сам модификатор для Opencart 2.x.x -

fix_del_attribute.ocmod.xml

 

 

для Opencart 3.0.x (если устанавливать через админку.) -

fix_del_attribute_3.ocmod.zip

 

( А если записать в папку /system/, то можно использовать для Opencart 2.x.x )

 

потом же не забыть обновить модификаторы в админке!

(если не нарушены методы validateDelete() и deleteAttribute($attribute_id), то модификатор станет без проблем, а иначе возможно надо будет подогнать код)

 

так же в целях случайного НЕ удаления, используйте модификатор временно.

 

Змінено користувачем vier
не дописал пост (отвлекли)
  • +1 1
Надіслати
Поділитися на інших сайтах

2 часа назад, vier сказал:

Решение - закончить проверку в данном Методе раньше до проверки на наличие Атрибутов в Товарах -

Вы это серьезно? Ваше "решение"  - даже не эталон говнокода, это его апофеоз...
А чего просто не предложили в БД удалить без всяких проверок? Подумаешь, потом будут ошибки во всех товарах, где этот атрибут был, зачем нам лишние проверки.

  • +1 1
Надіслати
Поділитися на інших сайтах


4 часа назад, vier сказал:

в файле admin/model/catalog/attribute.php

Метод -


public function deleteAttribute($attribute_id) {

	//fix del_control
	$this->db->query("DELETE FROM `".DB_PREFIX."product_attribute` WHERE `attribute_id` = ".(int)$attribute_id);
		
	$this->db->query("DELETE FROM " . DB_PREFIX . "attribute WHERE attribute_id = '" . (int)$attribute_id . "'");
	$this->db->query("DELETE FROM " . DB_PREFIX . "attribute_description WHERE attribute_id = '" . (int)$attribute_id . "'");

}

 

 

странно, почему изначально в Opencart для контроля нет данного удаления атрибутов в таблице `product_attribute`

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.