Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

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


VladBlad
 Поделиться

Рекомендованные сообщения

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

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

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

Ссылка на комментарий
Поделиться на других сайтах


  • 8 месяцев спустя...

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

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 2
Ссылка на комментарий
Поделиться на других сайтах

определяем 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 года спустя...

Добрый вечер! Очень надеюсь на помощь! Можете более подробно написать, как определить ID атрибута и как его удалить? Заранее спасибо!

Ссылка на комментарий
Поделиться на других сайтах


ЗАйти в катлог, атрибуты, найти свой атрибут, в ссылке указан его id

 

attribute_id

Ссылка на комментарий
Поделиться на других сайтах

  • 3 года спустя...
В 04.04.2014 в 15:50, chukcha сказал:

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

 

SELECT * FROM `oc_product_attribute` where `attribute_id`=

 

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

DELETE FROM `oc_product_attribute`  where `attribute_id`=

 

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


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

Ссылка на комментарий
Поделиться на других сайтах


  • 11 месяцев спустя...
В 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 1
Ссылка на комментарий
Поделиться на других сайтах

Огромное спасибо. Разобрался. Кому будет непонятно пишите в ЛС, расскажу что называется "на пальцах"

Ссылка на комментарий
Поделиться на других сайтах


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

в файле - 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 сказал:

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

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

Ссылка на комментарий
Поделиться на других сайтах


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`

Ссылка на комментарий
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.