<?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 "Не удалось найти свойства с одинковыми значениями."; }