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

466 lines
15 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 Product - edit the static section
############################################ biksenonovye-linzy-dlya-audi-a3-bl01
class ProductAdmin extends Simpla
{
public function fetch()
{
$options = array();
$product_categories = array();
$variants = array();
$images = array();
$product_features = array();
$related_products = array();
$related_articles = array();
if($this->request->method('post') && !empty($_POST))
{
$product->id = $this->request->post('id', 'integer');
$product->name = $this->request->post('name');
$product->visible = $this->request->post('visible', 'boolean');
$product->featured = $this->request->post('featured');
$product->brand_id = $this->request->post('brand_id', 'integer');
$product->ym = $this->request->post('ym', 'boolean');
$product->url = $this->request->post('url', 'string');
$product->meta_title = $this->request->post('meta_title');
$product->meta_keywords = $this->request->post('meta_keywords');
$product->meta_description = $this->request->post('meta_description');
$product->product_h1 = $this->request->post('product_h1');
$product->annotation = $this->request->post('annotation');
$product->body = $this->request->post('body');
// Варианты товара
if($this->request->post('variants'))
foreach($this->request->post('variants') as $n=>$va) foreach($va as $i=>$v)
$variants[$i]->$n = $v;
// Категории товара
$product_categories = $this->request->post('categories');
if(is_array($product_categories))
{
foreach($product_categories as $c)
$pc[]->id = $c;
$product_categories = $pc;
}
// Свойства товара
$options = $this->request->post('options');
if(is_array($options))
{
foreach($options as $f_id=>$val)
{
$po[$f_id]->feature_id = $f_id;
$po[$f_id]->value = $val;
}
$options = $po;
}
// Связанные товары
if(is_array($this->request->post('related_products')))
{
foreach($this->request->post('related_products') as $p)
{
$rp[$p]->product_id = $product->id;
$rp[$p]->related_id = $p;
}
$related_products = $rp;
}
// Связанные Статьи
if(is_array($this->request->post('related_articles')))
{
foreach($this->request->post('related_articles') as $p)
{
$rs[$p]->object_id = $product->id;
$rs[$p]->article_id = $p;
$rs[$p]->type = 'product';
}
$related_articles = $rs;
}
// Не допустить пустое название товара.
if(empty($product->name))
{
$this->design->assign('message_error', 'empty_name');
if(!empty($product->id))
$images = $this->products->get_images(array('product_id'=>$product->id));
}
// Не допустить одинаковые URL разделов.
elseif(($p = $this->products->get_product($product->url)) && $p->id!=$product->id)
{
$this->design->assign('message_error', 'url_exists');
if(!empty($product->id))
$images = $this->products->get_images(array('product_id'=>$product->id));
}
else
{
if(empty($product->id))
{
$product->id = $this->products->add_product($product);
$product = $this->products->get_product($product->id);
$this->design->assign('message_success', 'added');
}
else
{
$this->products->update_product($product->id, $product);
$product = $this->products->get_product($product->id);
$this->design->assign('message_success', 'updated');
}
if($product->id)
{
// Категории товара
$query = $this->db->placehold('DELETE FROM __products_categories WHERE product_id=?', $product->id);
$this->db->query($query);
if(is_array($product_categories))
{
foreach($product_categories as $i=>$category)
$this->categories->add_product_category($product->id, $category->id, $i);
}
// Варианты
if(is_array($variants))
{
$variants_ids = array();
foreach($variants as $index=>&$variant)
{
if($variant->stock == '∞' || $variant->stock == '')
$variant->stock = null;
// Удалить файл
if(!empty($_POST['delete_attachment'][$index]))
{
$this->variants->delete_attachment($variant->id);
}
// Загрузить файлы
if(!empty($_FILES['attachment']['tmp_name'][$index]) && !empty($_FILES['attachment']['name'][$index]))
{
$attachment_tmp_name = $_FILES['attachment']['tmp_name'][$index];
$attachment_name = $_FILES['attachment']['name'][$index];
move_uploaded_file($attachment_tmp_name, $this->config->root_dir.'/'.$this->config->downloads_dir.$attachment_name);
$variant->attachment = $attachment_name;
}
if($variant->id)
{
$this->variants->update_variant($variant->id, $variant);
}
else
{
$variant->product_id = $product->id;
$variant->id = $this->variants->add_variant($variant);
}
$variant = $this->variants->get_variant($variant->id);
$variants_ids[] = $variant->id;
}
// Удалить непереданные варианты
$current_variants = $this->variants->get_variants(array('product_id'=>$product->id));
foreach($current_variants as $current_variant)
if(!in_array($current_variant->id, $variants_ids))
$this->variants->delete_variant($current_variant->id);
// Отсортировать варианты
asort($variants_ids);
$i = 0;
foreach($variants_ids as $variant_id)
{
$this->variants->update_variant($variants_ids[$i], array('position'=>$variant_id));
$i++;
}
// Добавление значений свойств вариантов
if(is_array($variants))
{
foreach($variants AS $v)
$vars[] = $v;
$this->features->delete_variant_options($product->id);
$options2 = (array)$this->request->post('options2');
foreach($options2 AS $i=>$opts){
$v=0;
foreach($opts AS $opt){
if(($opt) && $opt!='endoptions'){
$temp[$v][$i][] = $opt;
if($vars[$v]->id)
$this->features->update_variant_option($vars[$v]->id, $i, $opt);
}elseif($opt=='endoptions'){
$v++;
}
}
}
//print_r($temp);
}
}
// Удаление изображений
$images = (array)$this->request->post('images');
$current_images = $this->products->get_images(array('product_id'=>$product->id));
foreach($current_images as $image)
{
if(!in_array($image->id, $images))
$this->products->delete_image($image->id);
}
// Порядок изображений
if($images = $this->request->post('images'))
{
$i=0;
foreach($images as $id)
{
$this->products->update_image($id, array('position'=>$i));
$i++;
}
}
// Загрузка изображений
if($images = $this->request->files('images'))
{
for($i=0; $i<count($images['name']); $i++)
{
if ($image_name = $this->image->upload_image($images['tmp_name'][$i], $images['name'][$i]))
{
$this->products->add_image($product->id, $image_name);
}
else
{
$this->design->assign('error', 'error uploading image');
}
}
}
// Загрузка изображений из интернета
if($images = $this->request->post('images_urls'))
{
foreach($images as $url)
{
if(!empty($url) && $url != 'http://')
$this->products->add_image($product->id, $url);
}
}
$images = $this->products->get_images(array('product_id'=>$product->id));
// Характеристики товара
// Удалим все из товара
foreach($this->features->get_product_options($product->id) as $po)
$this->features->delete_option($product->id, $po->feature_id);
// Свойства текущей категории
$category_features = array();
foreach($this->features->get_features(array('category_id'=>$product_categories[0])) as $f)
$category_features[] = $f->id;
if(is_array($options))
foreach($options as $option)
{
if(in_array($option->feature_id, $category_features))
$this->features->update_option($product->id, $option->feature_id, $option->value);
}
// Новые характеристики
$new_features_names = $this->request->post('new_features_names');
$new_features_values = $this->request->post('new_features_values');
if(is_array($new_features_names) && is_array($new_features_values))
{
foreach($new_features_names as $i=>$name)
{
$value = trim($new_features_values[$i]);
if(!empty($name) && !empty($value))
{
$query = $this->db->placehold("SELECT * FROM __features WHERE name=? LIMIT 1", trim($name));
$this->db->query($query);
$feature_id = $this->db->result('id');
if(empty($feature_id))
{
$feature_id = $this->features->add_feature(array('name'=>trim($name)));
}
$this->features->add_feature_category($feature_id, reset($product_categories)->id);
$this->features->update_option($product->id, $feature_id, $value);
}
}
// Свойства товара
$options = $this->features->get_product_options($product->id);
}
// Связанные товары
$query = $this->db->placehold('DELETE FROM __related_products WHERE product_id=?', $product->id);
$this->db->query($query);
if(is_array($related_products))
{
$pos = 0;
foreach($related_products as $i=>$related_product)
$this->products->add_related_product($product->id, $related_product->related_id, $pos++);
}
// Связанные Статьи
$query = $this->db->placehold('DELETE FROM __article_objects WHERE object_id=?', $product->id);
$this->db->query($query);
if(is_array($related_articles))
{
$pos = 0;
foreach($related_articles as $i=>$related_article)
$this->articles->add_related_object($related_article->article_id, $product->id, $related_article->type);
}
}
}
$options2 = $this->features->get_product_variant_options($product->id);
//header('Location: '.$this->request->url(array('message_success'=>'updated')));
}
else
{
$product->id = $this->request->get('id', 'integer');
$product = $this->products->get_product(intval($product->id));
//print_r($product);die;
if($product && $product->id)
{
// Категории товара
$product_categories = $this->categories->get_categories(array('product_id'=>$product->id));
// Варианты товара
$variants = $this->variants->get_variants(array('product_id'=>$product->id));
// Изображения товара
$images = $this->products->get_images(array('product_id'=>$product->id));
// Свойства товара
$options = $this->features->get_options(array('product_id'=>$product->id));
$options2 = $this->features->get_product_variant_options($product->id);
// Связанные товары
$related_products = $this->products->get_related_products(array('product_id'=>$product->id));
// Связанные товары
$related_articles = $this->articles->get_related_articles(array('id'=>$product->id,'type'=>'product'));
}
else
{
// Сразу активен
$product->visible = 1;
}
}
if(empty($variants))
$variants = array(1);
if(empty($product_categories))
{
if($category_id = $this->request->get('category_id'))
$product_categories[0]->id = $category_id;
else
$product_categories = array(1);
}
if(empty($product->brand_id) && $brand_id=$this->request->get('brand_id'))
{
$product->brand_id = $brand_id;
}
if(!empty($related_products))
{
foreach($related_products as &$r_p)
$r_products[$r_p->related_id] = &$r_p;
$temp_products = $this->products->get_products(array('id'=>array_keys($r_products)));
foreach($temp_products as $temp_product)
$r_products[$temp_product->id] = $temp_product;
$related_products_images = $this->products->get_images(array('product_id'=>array_keys($r_products)));
foreach($related_products_images as $image)
{
$r_products[$image->product_id]->images[] = $image;
}
}
if(is_array($options))
{
$temp_options = array();
foreach($options as $option)
$temp_options[$option->feature_id] = $option;
$options = $temp_options;
}
$this->design->assign('product', $product);
$this->design->assign('product_categories', $product_categories);
$this->design->assign('product_variants', $variants);
$this->design->assign('product_images', $images);
$this->design->assign('options', $options);
$this->design->assign('related_products', $related_products);
// Все бренды
$brands = $this->brands->get_brands();
$this->design->assign('brands', $brands);
// Все категории
$categories = $this->categories->get_categories_tree();
$this->design->assign('categories', $categories);
// Все свойства
$features = $this->features->get_features();
$this->design->assign('features', $features);
if($product_categories){
$cat = reset($product_categories);
$features2 = $this->features->get_features(array('category_id'=>$cat->id,'in_variant'=>1));
}else{
$features2 = array();
}
//print_r($features2);
$this->design->assign('features2', $features2);
if(is_array($options2))
{
foreach($options2 as $option)
$temp_options[$option->id_veriant][$option->feature_id][] = $option;
$options2 = $temp_options;
}
$this->design->assign('options2', $options2);
// Связка категорий со свойствами
$categories_features = array();
$query = $this->db->placehold('SELECT category_id, feature_id FROM __categories_features');
$this->db->query($query);
$c_f = $this->db->results();
foreach($c_f as $i)
{
$categories_features[$i->category_id][] = $i->feature_id;
}
$this->design->assign('categories_features', $categories_features);
//$this->design->assign('message_success', $this->request->get('message_success', 'string'));
//$this->design->assign('message_error', $this->request->get('message_error', 'string'));
if(!empty($related_articles)) {
foreach($related_articles as $related_a)
$r_articles[$related_a->article_id] = $related_a;
$temp_articles = $this->articles->get_articles(array('id'=>array_keys($r_articles)));
foreach($temp_articles as $temp_article)
$r_articles[$temp_article->id] = $temp_article;
}
$this->design->assign('related_articles', $r_articles);
return $this->design->fetch('product.tpl');
}
}