/** * Парсинг страницы модели * @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"; } } }
/** * Достает сток и изображение вариации из корзины, формирует обьект и отправляет на синхронизацию * @param $content * @param CMSTableBrand $brand * @param $type_value * @param $item */ private function parsePageItems($content, CMSTableBrand $brand, $type_value, $item) { $stock = ''; $image = ''; $external_id = ''; $dom = str_get_html($content); // достаем сток $option_stock_dom = $dom->find('#MainContent_ucCart_rptCart_lblAvailMarker_0'); if (count($option_stock_dom)) { $stock_str = trim($option_stock_dom[0]->plaintext); $stock = trim($stock_str) === "IN-STOCK" ? 1 : 0; } // достаем изображение $option_img_dom = $dom->find('#MainContent_ucCart_rptCart_imgFrame_0'); if (count($option_img_dom)) { $image = preg_replace("/&w=(.*)/", '&w=1250', $option_img_dom[0]->src); $image = self::URL_ROOT . $image; } $image = html_entity_decode($image); // разбираемся с размерами $sizes_arr = explode('-', $item['sizes']); $size_1 = isset($sizes_arr[0]) ? $sizes_arr[0] : 0; $size_2 = isset($sizes_arr[1]) ? $sizes_arr[1] : 1; $size_3 = isset($sizes_arr[2]) ? $sizes_arr[2] : 2; // определяем тип очков if ($type_value === "Sun") { $typeItem = CMSLogicGlassesItemType::getInstance()->getSun(); } else { $typeItem = CMSLogicGlassesItemType::getInstance()->getEye(); } // Формируем переменную которая будет уникальным идентификатором каждой модели // Собственно по ней вариации к модели и попадут $external_id = $item['name'] . " prov " . $this->getProviderId(); echo "\n"; echo "--------brand - {$brand->getTitle()}\n"; echo "--------model_name - {$item['name']}\n"; echo "--------color_title - {$item['color_title']}\n"; echo "--------external_id - {$external_id}\n"; echo "--------color_code - {$item['color_code']}\n"; echo "--------sizes - {$item['sizes']}\n"; echo "--------image - {$image}\n"; echo "--------price - {$item['price']}\n"; echo "--------type - {$type_value}\n"; echo "--------stock - {$stock}\n"; echo "--------upc - {$item['upc']}\n\n"; // создаем обьект модели и синхронизируем $sitem = new CMSClassGlassesParserItem(); $sitem->setBrand($brand); $sitem->setExternalId($external_id); $sitem->setType($typeItem); $sitem->setTitle($item['name']); $sitem->setColor($item['color_title']); $sitem->setColorCode($item['color_code']); $sitem->setStockCount($stock); $sitem->setPrice($item['price']); $sitem->setImg($image); $sitem->setSize($size_1); $sitem->setSize2($size_2); $sitem->setSize3($size_3); $sitem->setIsValid(1); $sitem->setUpc($item['upc']); $sitem->sync(); }