Преобразование строчных дополнительных свойств в списочные для HostCMS

Скрипт был разработан для преобразования строчных свойств интернет-магазина в списочные. Это может быть полезно при повышении редакции до "Малый бизнес" или при необходимости внедрения адаптивных фильтров, которые работают преимущественно со списками. 

Чтобы его использовать, необходимо:

  1. Сделать бекап базы данных. 
  2. Создать новый элементы структуры.
  3. Типом для него выбрать "Динамическая страница".
  4. Поместить код, данный ниже в Код динамической страницы.
  5. Заполнить массив aProperties ID-шниками дополнительных свойств, которые будут преобразованы.
  6. Разместить файл property.php в папке /modules/kad/
  7. Сохранить элемент структуры и перейти по ссылке на созданный элемент структуры.
<?
 
/**
* Преобразование строчных дополнительных свойств в списочные
* Создает копии доп. свойств типа "Список"
* Создает список с названием доп. свойств
* Создает значения для доп. свойств
*
* Требует 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
"; } } } } ?>

Если не сработало, напишите об этом в комментариях.

comments powered by Disqus


  • Добрый. когда то у меня этот скрипт срабатывал, сейчас перестал, возможно что то изменилось в системе?!?
    Список создался, а вот доп свойства нету, как и значений для него соответственно.

    • Добрый вечер. К сожалению, не подскажу. Давно не использовали этот скрипт, обновлений нет.

      • поддержка сегодня помогла:
        Вероятно у вас несколько магазинов на сайте и в одном из них есть свойства с такими же названиями. В итоге они попадают под это условие и новые свойства не создаются:

        $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));

    • Спасибо за дополнение!

Следующий "Увеличено количество часов работ на всех тарифах технической поддержки: " К списку Предыдущий "Решения от партнеров в KAD::Market"