/**
  * @param $title
  * @param $itemUrl
  * @param CMSTableBrand $brand
  */
 private function parseItem($title, $itemUrl, CMSTableBrand $brand)
 {
     $result = array();
     echo "--Parse item " . $title . " [" . $itemUrl . "]. Get sub-items ...\n";
     $subItems = $this->getSubItems($itemUrl);
     echo "---Found " . count($subItems) . " sub-items. Get all variations ...\n";
     $variationsUrls = $this->getAllVariations($subItems);
     echo "----Found " . count($variationsUrls) . " variations. Get data ...\n";
     $variationsData = $this->getVariations($variationsUrls);
     foreach ($variationsData as $variation) {
         $this->countVariation++;
         $size = isset($variation['size']) ? $variation['size'] : 0;
         if ($variation['upc']) {
             $this->countVariationWithUpc++;
         }
         if (!$variation['stock']) {
             echo "\n----------variation {$variation['color']} ({$variation['colorCode']}) not in stock. (not parse!)\n";
             echo "--------------------------------------------\n";
             continue;
         }
         $this->countVariationInStock++;
         echo "\n";
         echo "----------brand         - {$brand->getTitle()}\n";
         echo "----------model_name    - {$title}\n";
         echo "----------external_id   - {$title}\n";
         echo "----------color_title   - {$variation['color']}\n";
         echo "----------color_code    - {$variation['colorCode']}\n";
         echo "----------size 1        - {$size}\n";
         echo "----------size 2        - ~\n";
         echo "----------size 3        - ~\n";
         echo "----------image         - {$variation['img']}\n";
         echo "----------price         - {$variation['price']}\n";
         echo "----------type          - sun\n";
         echo "----------upc           - {$variation['upc']}\n";
         echo "----------stock         - {$variation['stock']}\n\n";
         echo "--------------------------------------------\n";
         // создаем обьект модели и синхронизируем
         $item = new CMSClassGlassesParserItem();
         $item->setBrand($brand);
         $item->setTitle($title);
         $item->setExternalId($title);
         $item->setType(CMSLogicGlassesItemType::getInstance()->getSun());
         $item->setColor($variation['color']);
         $item->setColorCode($variation['colorCode']);
         $item->setStockCount($variation['stock']);
         $item->setPrice($variation['price']);
         $item->setImg($variation['img']);
         $item->setSize($size);
         $item->setIsValid(1);
         if ($variation['upc']) {
             $item->setUpc($variation['upc']);
         }
         $result[] = $item;
     }
     echo "\n=============================================================================================\n";
     $this->syncingResult($result);
     echo "\n=============================================================================================\n";
 }
 /**
  * Парсим модель по ее ссылке
  * @param  string        $href  [ссылка]
  * @param  string        $type  [тип (frames or sun)]
  * @param  CMSTableBrand $brand [бренд]
  */
 private function parsePageItems($href, $type, CMSTableBrand $brand)
 {
     $result = array();
     $http = $this->getHttp();
     $http->doGet($href);
     $content = $http->getContents();
     $dom = str_get_html($content);
     $items_selector = '#carousel-variants .slides li';
     $items = $dom->find($items_selector);
     // Если товары закончились переходим к следующей категории
     // условие важно так как это единственный выход из бесконечного цикла
     if (!count($items)) {
         echo "It no item in carousel ({$href})!!!";
         return;
     }
     foreach ($items as $key => $item) {
         // preg_match("/(\d+).*c\.[ ]*(\d+).*([\d]{2,}\/\d+).*?[ ](.+)/i", $item->title, $matches);
         // из атрибута li[title] строки выделяем основные свойства для модели с помощью регулярки
         // что бы было проще с регуляркой убираем некоторые ненужные фрагменты в строке
         $title = str_replace('w/nosepads', '', $item->title);
         preg_match("/(\\d+).*[c|C]\\.[ ]*(\\d+).*?([A-Za-z].*)/", $title, $matches);
         $item_title_code = trim($matches[1]);
         $color_code = trim($matches[2]);
         // $sizes = trim($matches[3]);
         $color_title = trim($matches[3]);
         $item_title = "Model " . $item_title_code;
         //достаем размеры
         $sizes_selector = "#carousel-detail-3 .carousel-inner div[id={$item->id}] h4 span";
         $cur_item_sizes = $dom->find($sizes_selector);
         if (!count($cur_item_sizes)) {
             echo "No sizes for current item ({$item_title_code}).\n";
             continue;
         }
         $sizes = trim($cur_item_sizes[0]->plaintext);
         $sizes_arr = explode('☐', $sizes);
         $size_1 = $sizes_arr[0];
         $size_2 = $sizes_arr[1];
         $size_3 = 140;
         // достаем ссылку на изображение
         $cur_item_image = $item->find('img.img-responsive');
         if (!count($cur_item_image)) {
             echo "No image for current item ({$item_title_code}).\n";
             continue;
         }
         $item_image = htmlspecialchars_decode(self::URL_BASE . $cur_item_image[0]->src);
         // достаем сток статус
         $stock_selector = ".stockinfo .carousel-inner div[id={$item->id}]";
         $cur_item_stock = $dom->find($stock_selector);
         if (!count($cur_item_stock)) {
             echo "No stock for current item ({$item_title_code}).\n";
             continue;
         }
         $item_stock = trim($cur_item_stock[0]->plaintext);
         // отсекаем те которые out of stock
         if ($item_stock !== "In Stock") {
             continue;
         }
         // определяем тип очков
         if ($type === "frames") {
             $typeItem = CMSLogicGlassesItemType::getInstance()->getEye();
         } else {
             $typeItem = CMSLogicGlassesItemType::getInstance()->getSun();
         }
         // достаем цену
         $price_selector = "#carousel-detail-1 .carousel-inner div[id={$item->id}] .pull-left";
         $cur_item_price = $dom->find($price_selector);
         $item_price = trim(str_replace('$', '', $cur_item_price[0]->plaintext));
         // небольшой лог
         echo "\nurl          - " . $href . "\n";
         echo "item title   - " . $item_title . "\n";
         echo "item ext id  - " . $item_title_code . "\n";
         echo "color code   - " . $color_code . "\n";
         echo "type         - " . $type . "\n";
         echo "item sizes   - " . str_replace("☐", '/', $sizes) . "\n";
         echo "color title  - " . $color_title . "\n";
         echo "item image   - " . $item_image . "\n";
         echo "stock        - " . $item_stock . "\n";
         echo "price        - " . $item_price . "\n";
         echo "==================================================================\n";
         // создаем обьект модели и синхронизируем
         $item = new CMSClassGlassesParserItem();
         $item->setBrand($brand);
         $item->setExternalId($item_title_code);
         $item->setType($typeItem);
         $item->setTitle($item_title);
         $item->setColor($color_title);
         $item->setColorCode($color_code);
         $item->setStockCount(1);
         $item->setPrice($item_price);
         $item->setImg($item_image);
         $item->setSize($size_1);
         $item->setSize2($size_2);
         $item->setSize3($size_3);
         $item->setIsValid(1);
         $result[] = $item;
     }
     $dom->clear();
     foreach ($result as $res) {
         $res->sync();
     }
 }
 /**
  * Парсинг 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 CMSTableBrand $brand
  * @param $itemName
  * @param $itemStyle
  */
 private function parseItem(CMSTableBrand $brand, $itemName, $itemStyle)
 {
     echo "--------Sync item {$itemName}, code - {$itemStyle}.\n";
     $result = array();
     $variations = $this->getItem($itemStyle);
     if (!$variations) {
         echo "----------Where are variations?!\n";
         return;
     }
     // счетчики
     $this->countItem++;
     $this->countAllItem++;
     foreach ($variations as $key => $variation) {
         $stock = 0;
         $this->countVariation++;
         $this->countAllVariation++;
         if ($variation['stockStatus'] == "Available") {
             $stock = 1;
         } else {
             echo "\n----------variation {$variation['color']} ({$variation['colorDescription']}) not in stock. (not parse!)\n";
             echo "==================================================================\n";
             continue;
         }
         $this->countVariationInStock++;
         $this->countAllVariationInStock++;
         $itemImg = self::URL_IMG . $variation['colorImage'];
         // определяем тип очков
         if (stripos($variation['marketingGroupDescription'], "SUN") !== false) {
             $typeItem = CMSLogicGlassesItemType::getInstance()->getSun();
         } else {
             $typeItem = CMSLogicGlassesItemType::getInstance()->getEye();
         }
         // убираем из названия цвета код цвета
         $pattern = "/\\(" . $variation['color'] . "\\)/";
         $variation['colorDescription'] = trim(preg_replace($pattern, '', $variation['colorDescription']));
         preg_match("/(\\d{2})(\\d{2})/", $variation['size'], $matches);
         $size1 = isset($matches[1]) ? $matches[1] : 0;
         $size2 = isset($matches[2]) ? $matches[2] : 0;
         // иногда есть размеры формата 0xxx
         if ($size1[0] == "0" && $variation['SSA']) {
             $size1 = $variation['SSA'];
             $size2 = $variation['SSDBL'];
         }
         $upc = trim($variation['upcNumber']);
         // if(strlen($upc) < 13) {
         //     $upc = "0" . $upc;
         // }
         echo "\n";
         echo "----------brand         - {$brand->getTitle()}\n";
         echo "----------model_name    - {$itemName}\n";
         echo "----------external_id   - {$itemStyle}\n";
         echo "----------color_title   - {$variation['colorDescription']}\n";
         echo "----------color_code    - {$variation['color']}\n";
         echo "----------size 1        - {$size1}\n";
         echo "----------size 2        - {$size2}\n";
         echo "----------size 3        - {$variation['templeLength']}\n";
         echo "----------image         - {$itemImg}\n";
         echo "----------price         - {$variation['retail']}\n";
         echo "----------type          - {$variation['marketingGroupDescription']}\n";
         echo "----------stock         - {$stock}\n";
         echo "----------upc           - {$upc}\n";
         echo "--------------------------------------------\n";
         // создаем обьект модели и синхронизируем
         $item = new CMSClassGlassesParserItem();
         $item->setBrand($brand);
         $item->setTitle($itemName);
         $item->setExternalId($itemStyle);
         $item->setType($typeItem);
         $item->setColor($variation['colorDescription']);
         $item->setColorCode(trim($variation['color']));
         $item->setStockCount($stock);
         $item->setPrice(trim($variation['retail']));
         $item->setImg($itemImg);
         $item->setSize($size1);
         $item->setSize2($size2);
         $item->setSize3($variation['templeLength']);
         $item->setIsValid(1);
         $item->setUpc($upc);
         $result[] = $item;
     }
     echo "============================================\n";
     foreach ($result as $res) {
         $res->sync();
     }
 }
 /**
  * Парсинг страницы модели
  * @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("/&amp;w=(.*)/", '&amp;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();
 }