Блог
Преобразование строчных дополнительных свойств в списочные для HostCMS
Скрипт был разработан для преобразования строчных свойств интернет-магазина в списочные. Это может быть полезно при повышении редакции до "Малый бизнес" или при необходимости внедрения адаптивных фильтров, которые работают преимущественно со списками.
Чтобы его использовать, необходимо:
- Сделать бекап базы данных.
- Создать новый элементы структуры.
- Типом для него выбрать "Динамическая страница".
- Поместить код, данный ниже в Код динамической страницы.
- Заполнить массив aProperties ID-шниками дополнительных свойств, которые будут преобразованы.
- Разместить файл property.php в папке /modules/kad/
- Сохранить элемент структуры и перейти по ссылке на созданный элемент структуры.
<? /** * Преобразование строчных дополнительных свойств в списочные * Создает копии доп. свойств типа "Список" * Создает список с названием доп. свойств * Создает значения для доп. свойств * * Требует Kad_Property * * @author Kuts Artem, KAD::Systems (©) 2014 * @date 23-05-2014 */ // Массив с ID дополнительных свойств, которые будут преобразованы $aProperties = array(69, 70, 71, 72, 73, 75); // ID Интернет-магазина $shop_id = 1; $oShop = Core_Entity::factory('shop', $shop_id); foreach ($aProperties as $property_id) { $oProperty = Core_Entity::factory('property', $property_id); $oList = Core_Entity::factory('list'); $oList->queryBuilder()->where('site_id', '=', CURRENT_SITE)->where('name', '=', $oProperty->name); $oList = $oList->find(); if (!$oList->id) { $oList = Core_Entity::factory('list'); $oList->name = $oProperty->name; $oList->site_id = CURRENT_SITE; $oList->save(); } $list_id = $oList->id; // Ищем новое свойство или создаем $oNewProperty->queryBuilder() ->leftJoin('shop_item_properties', 'shop_item_properties.property_id', '=', 'properties.id') ->where('shop_item_properties.shop_id', '=', $shop_id) ->where('properties.name', '=', $oProperty->name) ->where('properties.id', '!=', $property_id); $oNewProperty = $oNewProperty->find(); if (!$oNewProperty->id) { $oNewProperty = Core_Entity::factory('property'); $oNewProperty->name = $oProperty->name; $oNewProperty->type = 3; $oNewProperty->list_id = $list_id; $oNewProperty->tag_name = $oProperty->tag_name . "_list"; $oNewProperty->sorting = $oProperty->sorting; $oNewProperty->property_dir_id = $oProperty->property_dir_id; $oNewProperty->save(); $oNewProperty->add(clone $oProperty->Shop_Item_Property); } $property_new_id = $oNewProperty->id; // Получить все товары $oItems = Core_Entity::factory('shop_item'); $aoItems = $oItems->findAll(); // Пройтись по каждому foreach ($aoItems as $oItem) { // Получить значение доп. свойства $oValue = Kad_Property::getValue($oItem, $property_id); if ($oValue && $oValue->value != "") { $value = $oValue->value; $value = ucfirst($value); // Проверить наличие значения в списке $oValue = Core_Entity::factory('list_item'); $oValue->queryBuilder()->where('list_id', '=', $list_id)->where('value', '=', $value); $oValue = $oValue->find(); // Добавить, если нет if (!$oValue->id) { $oValue = Core_Entity::factory('list_item'); $oValue->list_id = $list_id; $oValue->value = $value; $oValue->save(); } // Установить значение для товара if ($oValue->id) { Kad_Property::setValue($oItem, $property_new_id, $oValue->id); echo $oItem->id . " " . $oItem->name . " OK
"; } } } } ?>
Если не сработало, напишите об этом в комментариях.
-
-
Добрый. когда то у меня этот скрипт срабатывал, сейчас перестал, возможно что то изменилось в системе?!?
Список создался, а вот доп свойства нету, как и значений для него соответственно. -
-
Добрый вечер. К сожалению, не подскажу. Давно не использовали этот скрипт, обновлений нет.
-
-
поддержка сегодня помогла:
Вероятно у вас несколько магазинов на сайте и в одном из них есть свойства с такими же названиями. В итоге они попадают под это условие и новые свойства не создаются:
$oNewProperty->queryBuilder()
->where('name', '=', $oProperty->name)
->where('id', '!=', $property_id);
Чтобы добавить условие по магазину замените на:
$oNewProperty->queryBuilder()
->leftJoin('shop_item_properties', 'shop_item_properties.property_id', '=', 'properties.id')
->where('shop_item_properties.shop_id', '=', $shop_id)
->where('properties.name', '=', $oProperty->name)
->where('properties.id', '!=', $property_id); -
-
Спасибо! Заменил в коде. Сам не проверял, надеюсь код рабочий.
-
-
Для большого количества товаров необходимо сделать следующее улучшение:
$offset = 0;
$limit = 1000;
do {
// Получить все товары
$oItems = Core_Entity::factory('shop_item');
$oItems->queryBuilder()
->clearOrderBy()
->orderBy('shop_items.id', 'ASC')
->limit($limit)
->offset($offset);
$aoItems = $oItems->findAll(FALSE);
// Пройтись по каждому
foreach ($aoItems as $oItem)
{
// Получить значение доп. свойства
$oValue = Kad_Property::getValue($oItem, $property_id);
if ($oValue && $oValue->value != "")
{
$value = $oValue->value;
$value = ucfirst($value);
// Проверить наличие значения в списке
$oValue = Core_Entity::factory('list_item');
$oValue->queryBuilder()->where('list_id', '=', $list_id)->where('value', '=', $value);
$oValue = $oValue->find();
// Добавить, если нет
if (!$oValue->id)
{
$oValue = Core_Entity::factory('list_item');
$oValue->list_id = $list_id;
$oValue->value = $value;
$oValue->save();
}
// Установить значение для товара
if ($oValue->id)
{
Kad_Property::setValue($oItem, $property_new_id, $oValue->id);
echo $oItem->id . " " . $oItem->name . " OK
";
}
}
}
$offset += $limit;
} while(count($aoItems)); -
-
Спасибо за дополнение!
-