Files
esun3d/app/code/Esun/Translation/Model/Product/TranslatableFieldProvider.php
T
2026-09-15 10:35:56 +08:00

109 lines
3.2 KiB
PHP

<?php
declare(strict_types=1);
namespace Esun\Translation\Model\Product;
use Esun\Translation\Model\Config;
use Magento\Catalog\Api\ProductAttributeRepositoryInterface;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Catalog\Model\ResourceModel\Eav\Attribute;
class TranslatableFieldProvider
{
public function __construct(
private readonly Config $config,
private readonly ProductRepositoryInterface $productRepository,
private readonly ProductAttributeRepositoryInterface $attributeRepository
) {
}
/**
* @param int[] $targetStoreIds
* @return array<int, array<string, mixed>>
*/
public function getFields(int $productId, array $targetStoreIds = []): array
{
$sourceProduct = $this->productRepository->getById($productId, false, $this->config->getSourceStoreId());
$targetProduct = $targetStoreIds !== []
? $this->productRepository->getById($productId, false, (int)reset($targetStoreIds))
: null;
$fields = [];
foreach ($this->getAttributes() as $attribute) {
$code = (string)$attribute->getAttributeCode();
$sourceValue = (string)($sourceProduct->getData($code) ?? '');
$targetValue = $targetProduct ? (string)($targetProduct->getData($code) ?? '') : '';
$fields[] = [
'code' => $code,
'label' => (string)$attribute->getDefaultFrontendLabel() ?: $code,
'source_value' => $sourceValue,
'target_value' => $targetValue,
'is_html' => $this->isHtmlAttribute($attribute),
];
}
return $fields;
}
/**
* @return Attribute[]
*/
public function getAttributes(): array
{
$attributes = [];
foreach ($this->config->getTranslatableAttributeCodes() as $code) {
try {
$attribute = $this->attributeRepository->get($code);
} catch (\Throwable) {
continue;
}
if (!$attribute instanceof Attribute) {
continue;
}
if (!in_array((string)$attribute->getFrontendInput(), ['text', 'textarea'], true)) {
continue;
}
if ($attribute->isScopeGlobal()) {
continue;
}
$attributes[$code] = $attribute;
}
return array_values($attributes);
}
public function isAttributeAllowed(string $code): bool
{
foreach ($this->getAttributes() as $attribute) {
if ((string)$attribute->getAttributeCode() === $code) {
return true;
}
}
return false;
}
public function isHtmlAttributeCode(string $code): bool
{
foreach ($this->getAttributes() as $attribute) {
if ((string)$attribute->getAttributeCode() === $code) {
return $this->isHtmlAttribute($attribute);
}
}
return false;
}
private function isHtmlAttribute(Attribute $attribute): bool
{
return (bool)$attribute->getIsWysiwygEnabled()
|| in_array((string)$attribute->getAttributeCode(), ['description', 'short_description'], true);
}
}