From f20c9cc2a624cad67fe8d17b689896baea9ce8f6 Mon Sep 17 00:00:00 2001 From: fomichev Date: Fri, 8 Nov 2024 17:41:59 +0300 Subject: [PATCH] =?utf8?q?=D0=9C=D0=B5=D1=80=D0=B6=20=D1=81=20=D0=B4=D0=B5?= =?utf8?q?=D0=B2=D0=BE=D0=BC=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=20Marketplac?= =?utf8?q?eService.php?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/services/MarketplaceService.php | 282 ++++++++++++++++++++++++++ 1 file changed, 282 insertions(+) diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index 31517c92..c0ddbc2e 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -164,4 +164,286 @@ class MarketplaceService return Json::encode($availableGuids); } + + /** + * Статический метод для получения всей информации по продуктам, которая необходима для создания фида. + * + * @return array + */ + public static function getAllProductsInfo($id) + { + $parents = ProductsClass::find() + ->select('category_id') + ->where(['tip' => 'marketplace']) + ->column(); + + $products = Products1c::find() + ->where(['tip' => 'products']) + ->andWhere(['not', ['components' => '']]) + ->andWhere(['parent_id' => $parents]) + ->all(); + + $count = (int)$id; + $selectedProducts = array_slice($products, 0, $count); + + $result = []; + + foreach ($selectedProducts as $product) { + $price = self::getProductPrice($product->id); + + // Логируем ошибку и пропускаем продукт, если цена равна 0 + if ($price == 0) { + $message = "Product ID {$product->id} has zero price and will be excluded from the feed."; + Yii::error($message, __METHOD__); + + // Запись ошибки в таблицу InfoLogs + InfoLogService::setInfoLog( + __FILE__, + __LINE__, + $message, + 'Zero price error' + ); + continue; // пропускаем продукт + } + + $components = json_decode($product->components, true); + $composition = []; + + foreach ($components as $componentId => $quantity) { + $component = Products1c::findOne(['id' => $componentId]); + if ($component && $quantity > 0) { + $composition[] = [ + 'name' => $component->name, + 'quantity' => $quantity, + 'unit' => 'шт' + ]; + } + } + + $result[] = [ + 'id' => $product->id, + 'name' => $product->name, + 'pictures' => self::getProductPictureUrl($product->id), + 'price' => $price, + 'oldprice' => self::getProductOldPrice($product->id), + 'description' => self::getProductDescription($product->id), + 'qty' => self::getProductQty($product->id), + 'amount' => self::getProductQty($product->id), + 'weight' => self::getProductWeight($product->id), + 'minorder' => self::getProductMinOrder($product->id), + 'composition' => $composition, + 'available' => self::getProductAvailability($product->id), + 'category_id' => self::getProductCategory($product->id), + 'params' => self::getProductParams($product->id) + ]; + } + + return $result; + } + + + /** + * Статический метод для получения информации о заданном количестве продуктов. + * + * @param int $limit Количество продуктов, которые нужно получить. + * @return array + */ + public static function getSomeProductsInfo($limit) + { + $products = Products1c::find() + ->where(['tip' => 'products']) + ->andWhere(['not', ['components' => '']]) + ->limit($limit) + ->all(); + + $result = []; + + foreach ($products as $index => $product) { + $components = json_decode($product->components, true); + $composition = []; + + foreach ($components as $componentId => $quantity) { + $component = Products1c::findOne(['id' => $componentId]); + if ($component && $quantity > 0) { + $composition[] = [ + 'name' => $component->name, + 'quantity' => $quantity, + 'unit' => 'шт' + ]; + } + } + + $result[] = [ + 'id' => $product->id, + 'name' => $product->name, + 'pictures' => self::getProductPictureUrl($product->id), + 'price' => self::getProductPrice($product->id), + 'oldprice' => self::getProductOldPrice($product->id), + 'description' => self::getProductDescription($product->id), + 'qty' => self::getProductQty($product->id), + 'amount' => self::getProductQty($product->id), + 'weight' => self::getProductWeight($product->id), + 'minorder' => self::getProductMinOrder($product->id), + 'composition' => $composition, + 'available' => self::getProductAvailability($product->id), + 'category_id' => self::getProductCategory($product->id), + 'params' => self::getProductParams($product->id) // Добавление параметров продукта + ]; + } + + return $result; + } + + /** + * Статический метод для создания XML-фида на основе информации о продуктах. + * + * @param array $productsInfo + * @return string + */ + public static function createXMLFeed($productsInfo) + { + $xml = new \SimpleXMLElement(''); + $xml->addAttribute('date', date('Y-m-d H:i')); + + $shop = $xml->addChild('shop'); + $shop->addChild('name', 'Интернет магазин База Цветов 24'); + $shop->addChild('company', 'Интернет магазин База Цветов 24'); + $shop->addChild('url', 'https://bazacvetov24.ru'); + $shop->addChild('platform', 'BSM/Yandex/Market'); + + // Добавление валюты + $currencies = $shop->addChild('currencies'); + $currency = $currencies->addChild('currency'); + $currency->addAttribute('id', 'RUB'); + $currency->addAttribute('rate', '1'); + + // Добавление категорий (пример добавления нескольких категорий) + $categories = $shop->addChild('categories'); + $category1 = $categories->addChild('category', 'Букеты'); + $category1->addAttribute('id', '1'); + $category2 = $categories->addChild('category', 'Цветы'); + $category2->addAttribute('id', '2'); + + // Добавление офферов (продуктов) + $offers = $shop->addChild('offers'); + foreach ($productsInfo as $product) { + $offer = $offers->addChild('offer'); + $offer->addAttribute('id', $product['id']); + $offer->addAttribute('available', $product['available'] ? 'true' : 'false'); + + // Добавление URL продукта + $offer->addChild('url', 'https://bazacvetov24.ru/product/' . $product['id']); + + // Добавление цены и валюты + $offer->addChild('price', $product['price']); + $offer->addChild('oldPrice', $product['oldprice']); + $offer->addChild('currencyId', 'RUB'); + $offer->addChild('categoryId', $product['category_id']); // Здесь нужно указать правильный ID категории для продукта + + // Добавление доступности доставки + $offer->addChild('delivery', 'true'); + + // Описание продукта + if (!empty($product['description'])) { + $offer->addChild('description', htmlspecialchars($product['description'])); + } + + // Добавление веса и количества + $offer->addChild('weight', $product['weight']); + // $offer->addChild('qty', $product['qty']); + // $offer->addChild('amount', $product['amount']); + // $offer->addChild('cost', $product['amount']); + + foreach ($product['composition'] as $component) { + $consist = $offer->addChild('consist', $component['quantity']); + $consist->addAttribute('name', $component['name']); + $consist->addAttribute('unit', $component['unit']); + // $consist->addAttribute('cost', 12); + } + + // Добавление параметров + if (!empty($product['params'])) { + foreach ($product['params'] as $paramName => $paramValue) { + $param = $offer->addChild('param', htmlspecialchars($paramValue)); + $param->addAttribute('name', htmlspecialchars($paramName)); + } + } + + // Название продукта + $offer->addChild('name', htmlspecialchars($product['name'])); + + // Добавление изображений продукта + if (!empty($product['pictures'])) { + foreach ($product['pictures'] as $picture) { + $offer->addChild('picture', $picture); + } + } + } + + return $xml->asXML(); + } + + + + private static function getProductPictureUrl($productId) { + return ['https://bazacvetov24.ru/products/8798/29-krasnykh-i-belykh-roz_10919_lg.jpg', 'https://bazacvetov24.ru/products/5339/51-roza-premium_3326_md.jpg']; + } + private static function getProductPrice($productId) { + $price = Prices::find() + ->where(['product_id' => $productId]) + ->one(); + return $price['price'] ?? 0; + } + private static function getProductOldPrice($productId) { return 300; } + private static function getProductDescription($productId) { return 'Описание'; } + private static function getProductQty($productId) { return 9; } + private static function getProductWeight($productId) { + return 0.5; + } + private static function getProductCategory($productId) { + return 1; + } + private static function getProductMinOrder($productId) { + return 1; + } + private static function getProductAvailability($productId) { + return true; + } + + private static function getProductMaterial($productId) + { + // Здесь можно реализовать логику получения материала продукта + return 'Цветы'; // Пример значения + } + + private static function getProductWidth($productId) + { + // Здесь можно реализовать логику получения ширины продукта + return 18; // Пример значения + } + + private static function getProductHeight($productId) + { + // Здесь можно реализовать логику получения высоты продукта + return 20; // Пример значения + } + + private static function getProductLength($productId) + { + // Здесь можно реализовать логику получения длины продукта + return 9; // Пример значения + } + + private static function getProductParams($productId) + { + return [ + + 'Ширина, См' => self::getProductWidth($productId), + 'Высота, См' => self::getProductHeight($productId), + + ]; + } + + + } \ No newline at end of file -- 2.39.5