Files
AtomicOld/simpla/ProductsAdmin.php
2026-02-14 19:34:54 +03:00

253 lines
8.4 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?PHP
require_once('api/Simpla.php');
class ProductsAdmin extends Simpla
{
function fetch()
{
$filter = array();
$filter['page'] = max(1, $this->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<? AND 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');
}
}