isSupportedType($entityType) || $entityId <= 0 || $storeId <= 0) { return []; } $connection = $this->getConnection(); $select = $connection->select() ->from( $this->resource->getTableName(self::TABLE_NAME), ['field_name', 'translated_value'] )->where('entity_type = ?', $entityType) ->where('entity_id = ?', $entityId) ->where('store_id = ?', $storeId); if ($fields !== []) { $select->where('field_name IN (?)', $fields); } return (array)$connection->fetchPairs($select); } public function saveTranslations(int $entityId, int $storeId, string $entityType, array $translations): void { if (!$this->isSupportedType($entityType) || $entityId <= 0 || $storeId <= 0) { return; } $connection = $this->getConnection(); $tableName = $this->resource->getTableName(self::TABLE_NAME); $now = date('Y-m-d H:i:s'); $rows = []; foreach ($translations as $field => $value) { if (!$field) { continue; } $rows[] = [ 'entity_type' => $entityType, 'entity_id' => $entityId, 'store_id' => $storeId, 'field_name' => (string)$field, 'translated_value' => is_string($value) ? $value : (string)$value, 'created_at' => $now, 'updated_at' => $now, ]; } if ($rows === []) { return; } $connection->insertOnDuplicate( $tableName, $rows, ['translated_value', 'updated_at'] ); } /** @return array> */ public function getTranslationsForEntities( array $entityIds, int $storeId, string $entityType, array $fields = [] ): array { $entityIds = array_values(array_unique(array_filter(array_map('intval', $entityIds)))); if (!$this->isSupportedType($entityType) || $entityIds === [] || $storeId <= 0) { return []; } $select = $this->getConnection()->select() ->from( $this->resource->getTableName(self::TABLE_NAME), ['entity_id', 'field_name', 'translated_value'] )->where('entity_type = ?', $entityType) ->where('entity_id IN (?)', $entityIds) ->where('store_id = ?', $storeId); if ($fields !== []) { $select->where('field_name IN (?)', $fields); } $result = []; foreach ($this->getConnection()->fetchAll($select) as $row) { $result[(int)$row['entity_id']][(string)$row['field_name']] = (string)$row['translated_value']; } return $result; } /** @return array */ public function getTranslatedStoreIdsForEntities(array $entityIds, string $entityType): array { $entityIds = array_values(array_unique(array_filter(array_map('intval', $entityIds)))); if (!$this->isSupportedType($entityType) || $entityIds === []) { return []; } $select = $this->getConnection()->select() ->from( $this->resource->getTableName(self::TABLE_NAME), ['entity_id', 'store_id'] )->where('entity_type = ?', $entityType) ->where('entity_id IN (?)', $entityIds) ->group(['entity_id', 'store_id']); $result = []; foreach ($this->getConnection()->fetchAll($select) as $row) { $result[(int)$row['entity_id']][] = (int)$row['store_id']; } return $result; } public function clearTranslations(int $entityId, int $storeId, string $entityType): void { if (!$this->isSupportedType($entityType) || $entityId <= 0 || $storeId <= 0) { return; } $connection = $this->getConnection(); $connection->delete( $this->resource->getTableName(self::TABLE_NAME), [ 'entity_type = ?' => $entityType, 'entity_id = ?' => $entityId, 'store_id = ?' => $storeId ] ); } public function clearEntityTranslations(int $entityId, string $entityType): void { if (!$this->isSupportedType($entityType) || $entityId <= 0) { return; } $this->getConnection()->delete( $this->resource->getTableName(self::TABLE_NAME), [ 'entity_type = ?' => $entityType, 'entity_id = ?' => $entityId, ] ); } public function deleteTranslations( int $entityId, int $storeId, string $entityType, array $fields ): void { $fields = array_values(array_filter(array_map('strval', $fields))); if (!$this->isSupportedType($entityType) || $entityId <= 0 || $storeId <= 0 || $fields === []) { return; } $connection = $this->getConnection(); $connection->delete( $this->resource->getTableName(self::TABLE_NAME), [ 'entity_type = ?' => $entityType, 'entity_id = ?' => $entityId, 'store_id = ?' => $storeId, 'field_name IN (?)' => $fields, ] ); } private function isSupportedType(string $entityType): bool { return in_array($entityType, [ self::ENTITY_PAGE, self::ENTITY_BLOCK, self::ENTITY_BLOG_POST, self::ENTITY_WIKI_CATEGORY, self::ENTITY_WIKI_HOMEPAGE, ], true); } private function getConnection(): AdapterInterface { return $this->resource->getConnection(); } }