This commit is contained in:
Alan
2026-02-14 19:34:54 +03:00
commit 5c3329238b
867 changed files with 214778 additions and 0 deletions

View File

@@ -0,0 +1,198 @@
<?php
/**
* Simpla CMS
*
* @copyright 2012 Denis Pikusov
* @link http://simplacms.ru
* @author Denis Pikusov
*
*/
require_once('Rest.php');
class RestProducts extends Rest
{
public function get()
{
$items = array();
$filter = array();
// id
$filter['id'] = array();
foreach(explode(',', $this->request->get('id')) as $id)
if(($id = intval($id)) > 0)
$filter['id'][] = $id;
// Сортировка
$filter['sort'] = $this->request->get('sort');
// Категория
$filter['category_id'] = $this->request->get('category');
// Дата последнего изменения
$filter['modified_from'] = $this->request->get('modified_from');
// Бренд
$filter['brand_id'] = $this->request->get('brand');
// Страница
$filter['page'] = $this->request->get('page');
// Количество элементов на странице
$filter['limit'] = $this->request->get('limit');
// Какие поля отдавать
if($fields = $this->request->get('fields'))
$fields = explode(',', $fields);
// Выбираем
foreach($this->products->get_products($filter) as $item)
{
$items[$item->id] = new stdClass();
if($fields)
{
foreach($fields as $field)
if(isset($item->$field))
$items[$item->id]->$field = $item->$field;
}
else
$items[$item->id] = $item;
}
if(empty($items))
return false;
// Выбранные id
$items_ids = array_keys($items);
// Присоединяемые данные
if($join = $this->request->get('join'))
{
$join = explode(',', $join);
// Изображения
if(in_array('images', $join))
{
foreach($this->products->get_images(array('product_id'=>$items_ids)) as $i)
if(isset($items[$i->product_id]))
$items[$i->product_id]->images[] = $i;
}
// Варианты
if(in_array('variants', $join))
{
foreach($this->variants->get_variants(array('product_id'=>$items_ids)) as $v)
if(isset($items[$v->product_id]))
$items[$v->product_id]->variants[] = $v;
}
// Категории
$categories_ids = array();
if(in_array('categories', $join))
{
foreach($this->categories->get_products_categories(array('product_id'=>$items_ids)) as $pc)
{
if(isset($items[$pc->product_id]))
{
$c = $pc;
$c = $this->categories->get_category(intval($pc->category_id));
unset($c->path);
unset($c->subcategories);
unset($c->children);
$items[$pc->product_id]->categories[] = $c;
$categories_ids[] = $pc->category_id;
}
}
}
// Свойства
if(in_array('features', $join))
{
$features_ids = array();
foreach($this->features->get_options(array('product_id'=>$items_ids)) as $o)
{
if(isset($items[$o->product_id]))
{
$options[$o->feature_id] = $o;
$features_ids[] = $o->feature_id;
}
}
foreach($this->features->get_features(array('id'=>$features_ids)) as $f)
{
if(isset($options[$f->id]))
{
$f->value = $o->value;
$items[$o->product_id]->features[] = $f;
}
}
}
}
return array_values($items);
}
public function post()
{
$product = json_decode($this->request->post());
print_r($product);
$variants = $product->variants;
unset($product->variants);
$id = $this->products->add_product($product);
if(!empty($variants))
{
foreach($variants as $v)
{
$v->product_id = $id;
$varinat_id = $this->variants->add_variant($v);
}
}
if(!$id)
return false;
else
return $id;
header("Content-type: application/json");
header("Location: ".$this->config->root_url."/simpla/rest/products/".$id, true, 201);
}
public function put()
{
$id = intval($this->request->get('id'));
if(empty($id) || !$this->products->get_product($id))
{
header("HTTP/1.0 404 Not Found");
exit();
}
$product = json_decode($this->request->post());
$variants = $product->variants;
unset($product->variants);
$id = $this->products->update_product($id, $product);
if(!empty($variants))
{
$variants_ids = array();
foreach($variants as $v)
{
$v->product_id = $id;
if($v->stock == '∞' || $v->stock == '')
$v->stock = null;
if($v->id)
$this->variants->update_variant($v->id, $v);
else
{
$v->product_id = $id;
$v->id = $this->variants->add_variant($v);
}
$variants_ids[] = $v->id;
// Удалить непереданные варианты
$current_variants = $this->variants->get_variants(array('product_id'=>$id));
foreach($current_variants as $current_variant)
if(!in_array($current_variant->id, $variants_ids))
$this->variants->delete_variant($current_variant->id);
}
}
if(!$id)
return false;
else
return $id;
header("Content-type: application/json");
header("Location: ".$this->config->root_url."/simpla/rest/products/".$id, true, 201);
}
}