/** * @param $current_stage * @param $count * @param $processed * * @usedby shopYandexmarketPluginRunController::step() */ private function stepCategory(&$current_stage, &$count, &$processed) { static $categories = null; static $model; if ($categories === null) { $model = new shopCategoryModel(); if (empty($this->data['export']['hidden_categories'])) { $categories = $model->getTree(0, null, false, $this->data['domain']); } else { $sql = <<<SQL SELECT c.* FROM shop_category c LEFT JOIN shop_category_routes cr ON (c.id = cr.category_id) WHERE (cr.route IS NULL) OR (cr.route = s:domain) ORDER BY c.left_key SQL; $categories = $model->query($sql, $this->data)->fetchAll($model->getTableId()); } // экспортируется только список статических категорий, поэтому фильтруем данные foreach ($categories as $id => $category) { if ($category['type'] != shopCategoryModel::TYPE_STATIC) { unset($categories[$id]); } } if ($current_stage) { $categories = array_slice($categories, $current_stage); } } $chunk = 100; while (--$chunk >= 0 && ($category = reset($categories))) { if (empty($category['parent_id']) || isset($this->data['categories'][$category['parent_id']])) { $category_xml = $this->dom->createElement("category", str_replace('&', '&', $category['name'])); $category['id'] = intval($category['id']); $category_xml->setAttribute('id', $category['id']); if ($category['parent_id']) { $category_xml->setAttribute('parentId', $category['parent_id']); } $nodes = $this->dom->getElementsByTagName('categories'); $nodes->item(0)->appendChild($category_xml); $this->data['categories'][$category['id']] = $category['id']; if (!empty($category['include_sub_categories']) && $category['right_key'] - $category['left_key'] > 1) { //remap hidden subcategories $descendants = $model->descendants($category['id'], true)->where('type = i:type', array('type' => shopCategoryModel::TYPE_STATIC))->fetchAll('id'); if ($descendants) { $remap = array_fill_keys(array_map('intval', array_keys($descendants)), (int) $category['id']); $this->data['categories'] += $remap; } } ++$processed; } array_shift($categories); ++$current_stage; } }