Files
esun3d/app/code/Esun/Catalog/Model/MixStepPricing/AttributeWriter.php
T
2026-09-15 10:35:56 +08:00

60 lines
2.0 KiB
PHP

<?php
declare(strict_types=1);
namespace Esun\Catalog\Model\MixStepPricing;
use Esun\Catalog\Setup\Patch\Data\AddMixStepPricesAttribute;
use Magento\Catalog\Model\Product;
use Magento\Catalog\Model\Product\Action;
use Magento\Framework\App\CacheInterface;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\Serialize\Serializer\Json;
class AttributeWriter
{
public function __construct(
private readonly Action $productAction,
private readonly ResourceConnection $resourceConnection,
private readonly Json $json,
private readonly CacheInterface $cache
) {
}
public function write(array $groups, bool $delete): array
{
$connection = $this->resourceConnection->getConnection();
$writtenGroups = 0;
$writtenStoreViews = 0;
$connection->beginTransaction();
try {
foreach ($groups as $group) {
$value = $this->json->serialize($delete ? [] : $group['rules']);
foreach ($group['store_ids'] as $storeId) {
$this->productAction->updateAttributes(
[(int)$group['product_id']],
[AddMixStepPricesAttribute::ATTRIBUTE_CODE => $value],
(int)$storeId
);
$writtenStoreViews++;
}
$writtenGroups++;
}
$connection->commit();
$productIds = array_unique(array_map(
static fn(array $group): int => (int)$group['product_id'],
$groups
));
$this->cache->clean(array_map(
static fn(int $productId): string => Product::CACHE_TAG . '_' . $productId,
$productIds
));
} catch (\Throwable $exception) {
$connection->rollBack();
throw $exception;
}
return ['groups' => $writtenGroups, 'store_views' => $writtenStoreViews];
}
}