request->get('page', 'integer')); $filter['limit'] = $this->settings->products_num_admin; // Категории $categories = $this->categories->get_categories_tree(); $this->design->assign('categories', $categories); // Текущая категория $category_id = $this->request->get('category_id', 'integer'); if($category_id && $category = $this->categories->get_category($category_id)) $filter['category_id'] = $category->children; // Бренды категории $brands = $this->brands->get_brands(array('category_id'=>$category_id)); $this->design->assign('brands', $brands); // Все бренды $all_brands = $this->brands->get_brands(); $this->design->assign('all_brands', $all_brands); // Текущий бренд $brand_id = $this->request->get('brand_id', 'integer'); if($brand_id && $brand = $this->brands->get_brand($brand_id)) $filter['brand_id'] = $brand->id; // Текущий фильтр if($f = $this->request->get('filter', 'string')) { if($f == 'featured') $filter['featured'] = 1; elseif($f == 'discounted') $filter['discounted'] = 1; $this->design->assign('filter', $f); } // Поиск $keyword = $this->request->get('keyword'); if(!empty($keyword)) { $filter['keyword'] = $keyword; $this->design->assign('keyword', $keyword); } // Обработка действий if($this->request->method('post')) { // Сохранение цен и наличия $prices = $this->request->post('price'); $stocks = $this->request->post('stock'); foreach($prices as $id=>$price) { $stock = $stocks[$id]; if($stock == '∞' || $stock == '') $stock = null; $this->variants->update_variant($id, array('price'=>$price, 'stock'=>$stock)); } // Сортировка $positions = $this->request->post('positions'); $ids = array_keys($positions); sort($positions); $positions = array_reverse($positions); foreach($positions as $i=>$position) $this->products->update_product($ids[$i], array('position'=>$position)); // Действия с выбранными $ids = $this->request->post('check'); if(!empty($ids)) switch($this->request->post('action')) { case 'disable': { $this->products->update_product($ids, array('visible'=>0)); break; } case 'enable': { $this->products->update_product($ids, array('visible'=>1)); break; } case 'set_featured': { $this->products->update_product($ids, array('featured'=>1)); break; } case 'unset_featured': { $this->products->update_product($ids, array('featured'=>0)); break; } case 'delete': { foreach($ids as $id) $this->products->delete_product($id); break; } case 'duplicate': { foreach($ids as $id) $this->products->duplicate_product(intval($id)); break; } case 'move_to_page': { $target_page = $this->request->post('target_page', 'integer'); // Сразу потом откроем эту страницу $filter['page'] = $target_page; // До какого товара перемещать $limit = $filter['limit']*($target_page-1); if($target_page > $this->request->get('page', 'integer')) $limit += count($ids)-1; else $ids = array_reverse($ids, true); $temp_filter = $filter; $temp_filter['page'] = $limit+1; $temp_filter['limit'] = 1; $target_product = array_pop($this->products->get_products($temp_filter)); $target_position = $target_product->position; // Если вылезли за последний товар - берем позицию последнего товара в качестве цели перемещения if($target_page > $this->request->get('page', 'integer') && !$target_position) { $query = $this->db->placehold("SELECT distinct p.position AS target FROM __products p LEFT JOIN __products_categories AS pc ON pc.product_id = p.id WHERE 1 $category_id_filter $brand_id_filter ORDER BY p.position DESC LIMIT 1", count($ids)); $this->db->query($query); $target_position = $this->db->result('target'); } foreach($ids as $id) { $query = $this->db->placehold("SELECT position FROM __products WHERE id=? LIMIT 1", $id); $this->db->query($query); $initial_position = $this->db->result('position'); if($target_position > $initial_position) $query = $this->db->placehold(" UPDATE __products set position=position-1 WHERE position>? AND position<=?", $initial_position, $target_position); else $query = $this->db->placehold(" UPDATE __products set position=position+1 WHERE position=?", $initial_position, $target_position); $this->db->query($query); $query = $this->db->placehold("UPDATE __products SET __products.position = ? WHERE __products.id = ?", $target_position, $id); $this->db->query($query); } break; } case 'move_to_category': { $category_id = $this->request->post('target_category', 'integer'); $filter['page'] = 1; $category = $this->categories->get_category($category_id); $filter['category_id'] = $category->children; foreach($ids as $id) { $query = $this->db->placehold("DELETE FROM __products_categories WHERE category_id=? AND product_id=? LIMIT 1", $category_id, $id); $this->db->query($query); $query = $this->db->placehold("UPDATE IGNORE __products_categories set category_id=? WHERE product_id=? ORDER BY position DESC LIMIT 1", $category_id, $id); $this->db->query($query); if($this->db->affected_rows() == 0) $query = $this->db->query("INSERT IGNORE INTO __products_categories set category_id=?, product_id=?", $category_id, $id); } break; } case 'move_to_brand': { $brand_id = $this->request->post('target_brand', 'integer'); $brand = $this->brands->get_brand($brand_id); $filter['page'] = 1; $filter['brand_id'] = $brand_id; $query = $this->db->placehold("UPDATE __products set brand_id=? WHERE id in (?@)", $brand_id, $ids); $this->db->query($query); // Заново выберем бренды категории $brands = $this->brands->get_brands(array('category_id'=>$category_id)); $this->design->assign('brands', $brands); break; } } } // Отображение if(isset($brand)) $this->design->assign('brand', $brand); if(isset($category)) $this->design->assign('category', $category); $products_count = $this->products->count_products($filter); // Показать все страницы сразу if($this->request->get('page') == 'all') $filter['limit'] = $products_count; $pages_count = ceil($products_count/$filter['limit']); $filter['page'] = min($filter['page'], $pages_count); $this->design->assign('products_count', $products_count); $this->design->assign('pages_count', $pages_count); $this->design->assign('current_page', $filter['page']); $products = array(); foreach($this->products->get_products($filter) as $p) $products[$p->id] = $p; if(!empty($products)) { // Товары $products_ids = array_keys($products); foreach($products as &$product) { $product->variants = array(); $product->images = array(); $product->properties = array(); } $variants = $this->variants->get_variants(array('product_id'=>$products_ids)); foreach($variants as &$variant) { $products[$variant->product_id]->variants[] = $variant; } $images = $this->products->get_images(array('product_id'=>$products_ids)); foreach($images as $image) $products[$image->product_id]->images[$image->id] = $image; } $this->design->assign('products', $products); return $this->design->fetch('products.tpl'); } }