/** * Парсинг 1 товара * @param CMSPluginUrl $itemUrl * @param CMSTableBrand $brand * @return bool|void */ private function parseItem(CMSPluginUrl $itemUrl, CMSTableBrand $brand) { $http = $this->getHttp(); $itemExternalId = $itemUrl->getParamValue('productId'); echo "-----Parse item by:\n -------{$itemUrl} \n"; if (!$http->doGet($itemUrl)) { echo "GET URL Item FAIL!\n"; return; } $content = $http->getContents(); // пока есть два варианта ошибок на этом этапе // 1 - в ответ приходит пустая строка // 2 - страница с текстом ошибки (предположительно закончилась сессия) if (!$content) { echo "Error. Content is empty.\n"; $this->doReLogin(); $this->parseItem($itemUrl, $brand); return; } if ($this->isError($content)) { echo "Error. May be session end.\n"; $this->doReLogin(); $this->parseItem($itemUrl, $brand); return; } echo "\n-------Clear cart.\n"; $this->clearCart(); echo "\n-------Get item main params.\n"; $itemParams = $this->getItemTitleAndCategoryParams($content); $variations = $this->getVariations($content); // определяем тип очков $typeItem = $this->getItemType($itemParams['categoryType']); foreach ($variations as $key => $variation) { $upcCode = $this->getUpcCode($itemParams['title'], $variation['colorCode'], $variation['sizes']['one']); echo "\n"; echo "----------brand - {$brand->getTitle()}\n"; echo "----------model_name - {$itemParams['title']}\n"; echo "----------external_id - {$itemExternalId}\n"; echo "----------color_title - {$variation['color']}\n"; echo "----------color_code - {$variation['colorCode']}\n"; echo "----------size 1 - {$variation['sizes']['one']}\n"; echo "----------size 2 - {$variation['sizes']['two']}\n"; echo "----------size 3 - {$variation['sizes']['three']}\n"; echo "----------image - {$variation['img']}\n"; echo "----------price - {$variation['price']}\n"; echo "----------type - {$itemParams['categoryType']}\n"; echo "----------upc - {$upcCode}\n"; echo "----------stock - {$variation['stock']}\n\n"; echo "----------country - {$variation['country']}\n"; echo "----------cartStock - {$variation['cartStock']}\n"; echo "--------------------------------------------\n"; $imgFile = $this->getImgFile($variation['img']); // continue; // создаем обьект модели и синхронизируем $item = new CMSClassGlassesParserItem(); $item->setBrand($brand); $item->setTitle($itemParams['title']); $item->setExternalId($itemExternalId); $item->setColor($variation['color']); $item->setColorCode($variation['colorCode']); $item->setSize($variation['sizes']['one']); $item->setSize2($variation['sizes']['two']); $item->setSize3($variation['sizes']['three']); $item->setPrice($variation['price']); $item->setType($typeItem); $item->setStockCount($variation['cartStock']); $item->setIsValid(1); if ($variation['country'] == self::COUNTRY_ITALY) { $item->setSellFrom(1); } if ($imgFile) { $item->setImgFile($imgFile->getFile()); } if ($upcCode && $upcCode != '') { $item->setUpc($upcCode); } $result[] = $item; } echo "\n=============================================================================================\n"; $this->syncingResult($result); echo "\n=============================================================================================\n"; }
/** * Парсинг страницы модели * @param array $product_link_arr массив с названием модели, ссылкой и типом * @param CMSTableBrand $brand */ private function parseItem($product_link_arr, CMSTableBrand $brand) { $variation_links_arr = array(); $variations = array(); $result = array(); $item_name = $product_link_arr['name']; $item_url = $product_link_arr['href']; $item_type = $product_link_arr['type']; $variation_links_arr = $this->getVariationLinks($item_url); // не нашлось вариаций if (!$variation_links_arr) { return; } // определяем тип очков if ($item_type === "eye") { $type = CMSLogicGlassesItemType::getInstance()->getEye(); } else { $type = CMSLogicGlassesItemType::getInstance()->getSun(); } $variations = $this->getVariations($variation_links_arr); // формируем массив обьектов foreach ($variations as $key => $variation) { $external_id = $variation['item_code'] . " prov " . $this->getProviderId(); $final_item_name = $item_name . " " . $variation['item_code']; // небольшой лог echo "\n--------url - " . $item_url . "\n"; echo "--------item title - " . $final_item_name . "\n"; echo "--------item ext id - " . $external_id . "\n"; echo "--------item code - " . $variation['item_code'] . "\n"; echo "--------color code - " . $variation['color_code'] . "\n"; echo "--------type - " . $item_type . "\n"; echo "--------item sizes - " . $variation['size'] . "/0/0\n"; echo "--------color title - " . $variation['color'] . "\n"; echo "--------item image - " . $variation['image'] . "\n"; echo "--------stock - " . $variation['stock'] . "\n"; echo "--------price - " . $variation['price'] . "\n\n"; if (!$variation['stock']) { echo "--------Variation {$variation['color']} ({$variation['color_code']}) not in stock. (not parse!)\n"; echo "==================================================================\n"; continue; } if (!$variation['image']) { echo "--------Variation {$variation['color']} ({$variation['color_code']}) hasnt image.\n"; // костыль // смотим есть ли эта деталь уже в базе и есть ли у нее изображение // если да то предполагаем что на сайте пропала картинка и синхронизируем $query = "SELECT `d`.`file_id`\n FROM `amz_glasses_item` AS `i`\n LEFT JOIN `amz_glasses_item_detail` AS `d` ON `d`.`item_id` = `i`.`item_id`\n WHERE `i`.`item_ext_id` = :item_ext_id\n AND `d`.`detail_color_code` = :detail_color_code"; $q = CMSPluginDb::getInstance()->getQuery($query); $q->setText('item_ext_id', $external_id); $q->setText('detail_color_code', $variation['color_code']); $row = $q->execute()->getFirstRecord(); if (!$row) { echo "----------Variation hasnt image in base too.(not parse!)\n"; echo "==================================================================\n"; continue; } } $this->count_variations++; // это несколько иной метод получения картинки, который предпочтительнее для sftp $imgFile = CMSLogicGlassesFileCache::getInstance()->getOneMarchon($variation['image'], true, clone $this->getHttp()); echo "==================================================================\n"; $item = new CMSClassGlassesParserItem(); $item->setTitle($final_item_name); $item->setBrand($brand); $item->setExternalId($external_id); $item->setImg($variation['image']); if ($imgFile) { $item->setImgFile($imgFile->getFile()); } $item->setType($type); $item->setColor($variation['color']); $item->setColorCode($variation['color_code']); $item->setStockCount(1); $item->setPrice($variation['price']); $item->setSize($variation['size']); $item->setSize2(0); $item->setSize3(0); $item->setIsValid(1); $result[] = $item; } if (empty($result)) { echo "\n--------No one variation to parse.\n\n"; return; } $this->count_items++; foreach ($result as $item) { if ($item instanceof CMSClassGlassesParserItem) { $item->sync(); echo "ok\n"; } } }