private:koding:hostcms:modules:shop:useful:merge_properties:merge_properties.php
<?php
 
require_once(dirname(__FILE__) . '/' . 'bootstrap.php');
 
header('Content-Type: text/html; charset=utf-8');
 
$oShop = Core_Entity::factory('Shop', 3);
$aLog = array();
$bSafeMode = TRUE;
 
// ----------------------------------------------------------------------------
 
$oShopItemPropertyList = Core_Entity::factory('Shop_Item_Property_List', $oShop->id);
 
// Берем все свойства в порядке возрастания типа
$oProperties = $oShopItemPropertyList->Properties;
$oProperties->queryBuilder()
	->orderBy('properties.type', 'ASC');
$aoProperties = $oProperties->findAll();
 
// Находим свойства с повторяющимся названием
$aTmpProperties = array();
foreach ($aoProperties as $oProperty)
{
	$propertyKey = mb_strtoupper($oProperty->name);
 
	if (!isset($aTmpProperties[$propertyKey]))
	{
		$aTmpProperties[$propertyKey] = array();
	}
 
	$aTmpProperties[$propertyKey][] = $oProperty;
}
 
$aTmpProperties = array_filter($aTmpProperties, function ($aProperty) {
	return count($aProperty) > 1;
});
 
// Выполняем объединение
foreach ($aTmpProperties as $propertyKey => $aProperty)
{
	// Объявляем свойство по умолчанию
	$oDefaultProperty = current($aProperty);
 
	$aPropertyLog = array(
		'name' => $oDefaultProperty->name,
		'merges' => array()
	);
 
	// Обходим по очереди другие свойства
	while (next($aProperty) !== FALSE)
	{
		$oDuplicateProperty = current($aProperty);
 
		// Если свойства одного типа
		if ($oDefaultProperty->type == $oDuplicateProperty->type && in_array($oDefaultProperty->type, array(0, 1, 11, 7)))
		{
			$aPropertyLog['merges'][] = "Свойства с одинаковым типом: {$oDuplicateProperty->id}{$oDefaultProperty->id}";
 
			if (!$bSafeMode)
			{
				$oPropertyValue = Property_Controller_Value::factory($oDuplicateProperty->type)
					->setProperty($oDuplicateProperty)
					->getPropertyValueObject();
 
				// Обновляем все значения одним запросом
				$tableName = $oPropertyValue->getTableName();
 
				$oCoreQueryBuilderUpdate = Core_QueryBuilder::update()
					->table($tableName)
					->set($tableName . '.property_id', $oDefaultProperty->id)
					->where($tableName . '.property_id', '=', $oDuplicateProperty->id)
					->execute();
 
				// Удаляем свойство
				$oDuplicateProperty->markDeleted();
			}
		}
		// Иначе
		else
		{
			$propertiesKey = $oDefaultProperty->type . ',' . $oDuplicateProperty->type;
 
			switch ($propertiesKey)
			{
				// Строка → Список
				case '1,3':
					// Меняем местами
					$oTmpProperty = $oDefaultProperty;
					$oDefaultProperty = $oDuplicateProperty;
					$oDuplicateProperty = $oTmpProperty;
 
					$aPropertyLog['merges'][] = "Строка → Список: {$oDuplicateProperty->id}{$oDefaultProperty->id}";
 
					if (!$bSafeMode)
					{
						// Получаем все значения
						$aoPropertyValues = Property_Controller_Value::factory($oDuplicateProperty->type)
							->setProperty($oDuplicateProperty)
							->getPropertyValueObject()
							->findAll();
 
						// Переписываем значения
						foreach ($aoPropertyValues as $oPropertyValue)
						{
							$oListItem = $oDefaultProperty->List->List_Items->getByValue($oPropertyValue->value, FALSE);
 
							if (!$oListItem)
							{
								$oListItem = Core_Entity::factory('List_Item');
								$oListItem->value = $oPropertyValue->value;
								$oListItem->add($oDefaultProperty->List);
							}
 
							$oDefaultPropertyValue = $oDefaultProperty->createNewValue($oPropertyValue->entity_id);
							$oDefaultPropertyValue->value = $oListItem->id;
							$oDefaultPropertyValue->save();
						}
 
						// Удаляем свойство
						$oDuplicateProperty->markDeleted();
					}
				break;
 
				// Строка → Целое число
				case '0,1':
					$aPropertyLog['merges'][] = "Строка → Целое число: {$oDuplicateProperty->id}{$oDefaultProperty->id}";
 
					if (!$bSafeMode)
					{
						// Получаем все значения
						$aoPropertyValues = Property_Controller_Value::factory($oDuplicateProperty->type)
							->setProperty($oDuplicateProperty)
							->getPropertyValueObject()
							->findAll();
 
						// Переписываем значения
						foreach ($aoPropertyValues as $oPropertyValue)
						{
							$oDefaultPropertyValue = $oDefaultProperty->createNewValue($oPropertyValue->entity_id);
							$oDefaultPropertyValue->value = $oPropertyValue->value;
							$oDefaultPropertyValue->save();
						}
 
						// Удаляем свойство
						$oDuplicateProperty->markDeleted();
					}
				break;
 
				// Строка → Вещественное число
				case '1,11':
					// Меняем местами
					$oTmpProperty = $oDefaultProperty;
					$oDefaultProperty = $oDuplicateProperty;
					$oDuplicateProperty = $oTmpProperty;
 
					$aPropertyLog['merges'][] = "Строка → Вещественное число: {$oDuplicateProperty->id}{$oDefaultProperty->id}";
 
					if (!$bSafeMode)
					{
						// Получаем все значения
						$aoPropertyValues = Property_Controller_Value::factory($oDuplicateProperty->type)
							->setProperty($oDuplicateProperty)
							->getPropertyValueObject()
							->findAll();
 
						// Переписываем значения
						foreach ($aoPropertyValues as $oPropertyValue)
						{
							$oDefaultPropertyValue = $oDefaultProperty->createNewValue($oPropertyValue->entity_id);
							$oDefaultPropertyValue->value = $oPropertyValue->value;
							$oDefaultPropertyValue->save();
						}
 
						// Удаляем свойство
						$oDuplicateProperty->markDeleted();
					}
				break;
 
				// Строка → Чекбокс
				case '1,7':
					// Меняем местами
					$oTmpProperty = $oDefaultProperty;
					$oDefaultProperty = $oDuplicateProperty;
					$oDuplicateProperty = $oTmpProperty;
 
					$aPropertyLog['merges'][] = "Строка → Чекбокс: {$oDuplicateProperty->id}{$oDefaultProperty->id}";
 
					if (!$bSafeMode)
					{
						// Получаем все значения
						$aoPropertyValues = Property_Controller_Value::factory($oDuplicateProperty->type)
							->setProperty($oDuplicateProperty)
							->getPropertyValueObject()
							->findAll();
 
						// Переписываем значения
						foreach ($aoPropertyValues as $oPropertyValue)
						{
							$oDefaultPropertyValue = $oDefaultProperty->createNewValue($oPropertyValue->entity_id);
							$oDefaultPropertyValue->value = (boolean) $oPropertyValue->value;
							$oDefaultPropertyValue->save();
						}
 
						// Удаляем свойство
						$oDuplicateProperty->markDeleted();
					}
				break;
 
				default:
					$aPropertyLog['merges'][] = "Объединить не удалось ({$propertiesKey}): {$oDuplicateProperty->id}{$oDefaultProperty->id}";
				break;
			}
		}
	}
 
	// Основное свойство делаем множественным
	if (!$bSafeMode)
	{
		$oDefaultProperty->multiple = 1;
		$oDefaultProperty->save();
	}
 
	$aLog[] = $aPropertyLog;
}
 
if (count($aLog))
{
	?>
		<pre><?php var_dump($aLog); ?></pre>
	<?php
}
else
{
	print "Не удалось найти свойства с одинковыми значениями.";
}
private/koding/hostcms/modules/shop/useful/merge_properties/merge_properties.php.txt · Last modified: 05.03.18 в 09:56 by maximzasorin_gmail.com