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 version="1.0" encoding="UTF-8"?><yml_catalog/>');
+ $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