Files
admin_hura_8/inc/Hura8/Components/ConfigGroup/Model/ConfigGroupModel.php
2024-01-31 11:36:25 +07:00

501 lines
17 KiB
PHP

<?php
namespace Hura8\Components\ConfigGroup\Model;
use Hura8\Components\Product\Model\ProductModel;
use Hura8\Interfaces\AppResponse;
use Hura8\System\Model\aEntityBaseModel;
class ConfigGroupModel extends aEntityBaseModel
{
protected $tb_config_group = "";
protected $tb_config_group_product = "tb_config_group_product";
protected $tb_config_group_product_cache = "tb_config_group_product_cache";
protected $tb_config_group_attribute = "tb_config_group_attribute";
protected $tb_config_group_attribute_value = "tb_config_group_attribute_value";
public function __construct() {
parent::__construct('config_group');
$this->tb_config_group = $this->tb_entity;
}
protected function extendedFilterOptions() : array
{
return [
// empty for now
];
}
protected function updateGroupAttributeCount($group_id) {
$this->db->runQuery(
"UPDATE `".$this->tb_config_group."` SET
`attribute_count` = ( SELECT COUNT(*) FROM `".$this->tb_config_group_attribute."` WHERE `group_id` = ? )
WHERE `id` = ? LIMIT 1 ",
['d', 'd'], [ $group_id, $group_id ]
);
}
protected function updateGroupProductCount($group_id) {
$this->db->runQuery(
"UPDATE `".$this->tb_config_group."` SET
`item_count` = ( SELECT COUNT(*) FROM `".$this->tb_config_group_product."` WHERE `group_id` = ? )
WHERE `id` = ? LIMIT 1 ",
['d', 'd'], [ $group_id, $group_id ]
);
}
//attribute value
public function deleteAttributeValue($att_value_id) {
$attr_id = 0;
$query = $this->db->runQuery("SELECT `attr_id` FROM `".$this->tb_config_group_attribute_value."` WHERE `id` = ? LIMIT 1 ", ['d'], [ $att_value_id ]);
if ($info = $this->db->fetchAssoc($query)) {
$attr_id = $info['attr_id'];
}
$group_id = $this->getGroupIdFromAttribute($attr_id);
$this->db->runQuery("DELETE FROM `".$this->tb_config_group_attribute_value."` WHERE `id` = ? LIMIT 1 ", ['d'], [ $att_value_id ]);
$this->resetProductConfigCache($group_id);
$this->updateAttributeValueCount($attr_id);
}
protected function updateAttributeValueCount($attr_id) {
$this->db->runQuery(
"UPDATE `".$this->tb_config_group_attribute."` SET
`value_count` = ( SELECT COUNT(*) FROM `".$this->tb_config_group_attribute_value."` WHERE `attr_id` = ? )
WHERE `id` = ? LIMIT 1 ",
['d', 'd'],
[$attr_id, $attr_id ]
);
}
public function updateAttributeValue($id, $info) {
$updated_info = $info;
$updated_info['last_update'] = CURRENT_TIME;
$updated_info['last_update_by'] = ADMIN_NAME;
$this->db->update(
$this->tb_config_group_attribute_value,
$updated_info,
[
"id" => $id,
]
);
$group_id = $this->getGroupIdFromAttributeValue($id);
$this->resetProductConfigCache($group_id);
}
public function createAttributeValue($info) {
$updated_info = $info;
$updated_info['create_time'] = CURRENT_TIME;
$updated_info['create_by'] = ADMIN_NAME;
$updated_info['last_update'] = CURRENT_TIME;
$updated_info['last_update_by'] = ADMIN_NAME;
$this->db->insert($this->tb_config_group_attribute_value, $updated_info );
$group_id = $this->getGroupIdFromAttribute($info['attr_id']);
$this->resetProductConfigCache($group_id);
$this->updateAttributeValueCount($info['attr_id']);
}
//attribute
public function deleteAttribute($id, $group_id = 0) {
if(!$group_id) $group_id = $this->getGroupIdFromAttribute($id);
$this->db->runQuery("DELETE FROM `".$this->tb_config_group_attribute."` WHERE `id` = ? LIMIT 1 ", ['d'], [ $id ]);
$this->db->runQuery("DELETE FROM `".$this->tb_config_group_attribute_value."` WHERE `attr_id` = ? LIMIT 1 ", ['d'], [ $id ]);
$this->updateGroupAttributeCount($group_id);
//todo: update for product attribute_config ?
$this->resetProductConfigCache($group_id);
}
public function updateAttribute($id, $info) {
$updated_info = $info;
$updated_info['last_update'] = CURRENT_TIME;
$updated_info['last_update_by'] = ADMIN_NAME;
$this->db->update(
$this->tb_config_group_attribute,
$updated_info,
[
'id' => $id,
]
);
$group_id = $this->getGroupIdFromAttribute($id);
$this->resetProductConfigCache($group_id);
}
public function createAttribute($info) {
$updated_info = $info;
$updated_info['create_time'] = CURRENT_TIME;
$updated_info['create_by'] = ADMIN_NAME;
$updated_info['last_update'] = CURRENT_TIME;
$updated_info['last_update_by'] = ADMIN_NAME;
$this->db->insert($this->tb_config_group_attribute, $updated_info );
$this->resetProductConfigCache($info['group_id']);
$this->updateGroupAttributeCount($info['group_id']);
return $this->db->get_insert_id();
}
private function getGroupIdFromAttributeValue($att_value_id) {
$attr_id = 0;
$query = $this->db->runQuery("SELECT `attr_id` FROM `".$this->tb_config_group_attribute_value."` WHERE `id` = ? LIMIT 1 ", ['d'], [ $att_value_id ]);
if ($info = $this->db->fetchAssoc($query)) {
$attr_id = $info['attr_id'];
}
return $this->getGroupIdFromAttribute($attr_id);
}
private function getGroupIdFromAttribute($attr_id) {
$group_id = 0;
$query = $this->db->runQuery("SELECT `group_id` FROM `".$this->tb_config_group_attribute."` WHERE `id` = ? LIMIT 1 ", ['d'], [ $attr_id ]);
if ($info = $this->db->fetchAssoc($query)) {
$group_id = $info['group_id'];
}
return $group_id;
}
//create or update product in a group
public function createProduct($product_id, $group_id, array $attribute_config) {
if($this->isProductInGroup($product_id, $group_id)) {
$this->updateProduct($product_id, $group_id, $attribute_config);
}else {
$updated_info = [
"product_id" => $product_id,
"group_id" => $group_id,
"attribute_config" => json_encode($attribute_config),
"create_time" => CURRENT_TIME,
"create_by" => ADMIN_NAME,
"last_update" => CURRENT_TIME,
"last_update_by" => ADMIN_NAME,
];
$this->db->insert($this->tb_config_group_product, $updated_info );
$this->updateGroupProductCount($group_id);
}
$this->resetProductConfigCache($group_id);
}
public function deleteProduct($product_id, $group_id) {
$this->db->runQuery(
"DELETE FROM `".$this->tb_config_group_product."` WHERE `product_id` = ? AND `group_id` = ? LIMIT 1 ",
['d', 'd'], [ $product_id, $group_id ]
);
$this->deleteProductConfigCache($product_id);
$this->updateGroupProductCount($group_id);
}
public function updateProduct($product_id, $group_id, array $attribute_config, $product_name_in_group = '') {
$this->db->update(
$this->tb_config_group_product,
[
"attribute_config" => json_encode($attribute_config),
"product_name_in_group" => substr($product_name_in_group, 0, 140),
"last_update" => CURRENT_TIME,
"last_update_by" => ADMIN_NAME,
],
[
"product_id" => $product_id,
"group_id" => $group_id,
]
);
$this->resetProductConfigCache($group_id);
return true;
}
//we want to reset all caches for products in a group
//we need to do this when we make changes to group's attributes, or create new products/ update product in group
protected function resetProductConfigCache($group_id) {
$query = $this->db->runQuery("SELECT `product_id` FROM `".$this->tb_config_group_product."` WHERE `group_id` = ? ", ['d'], [$group_id]) ;
$product_list = array();
foreach( $this->db->fetchAll($query) as $item ){
$product_list[] = $item['product_id'];
}
if(sizeof($product_list)) {
$this->db->query("UPDATE `".$this->tb_config_group_product_cache."` SET
`value` = NULL
WHERE `product_id` IN (".join(",", $product_list).") ") ;
}
}
protected function deleteProductConfigCache($product_id) {
$this->db->runQuery("DELETE FROM `".$this->tb_config_group_product_cache."` WHERE `product_id` = ? LIMIT 1 ", ['d'], [$product_id]) ;
}
public function saveProductConfigCache($product_id, $value) {
$query = $this->db->runQuery(
"SELECT `product_id` FROM `".$this->tb_config_group_product_cache."` WHERE `product_id` = ? LIMIT 1 ",
['d'], [$product_id]
) ;
if($this->db->fetchAssoc($query)){
$this->db->runQuery(
"UPDATE `".$this->tb_config_group_product_cache."` SET
`value` = '".$this->db->escape(json_encode($value))."'
WHERE `product_id` = ? LIMIT 1 ",
['d'], [$product_id]
) ;
}else{
$this->db->runQuery("INSERT INTO `".$this->tb_config_group_product_cache."` (`product_id`, `value`)
VALUES ('". (int) $product_id."', '".$this->db->escape(json_encode($value))."') ") ;
}
}
public function getProductConfigCache($product_id) {
$query = $this->db->runQuery("SELECT `value` FROM `".$this->tb_config_group_product_cache."` WHERE `product_id` = ? LIMIT 1 ", ['d'], [$product_id]) ;
if($item_info = $this->db->fetchAssoc($query)){
return ($item_info['value']) ? \json_decode($item_info['value'], true) : false;
}
return false;
}
//get all group config
public function getGroupConfig($group_id) {
$query = $this->db->runQuery(
"SELECT
a.id AS attribute_id ,
a.name AS attribute_name ,
a.ordering AS attr_ordering ,
v.id AS value_id ,
v.name AS value_name ,
v.image AS image ,
v.color_code AS color ,
v.ordering ,
v.description AS description
FROM `".$this->tb_config_group_attribute."` a
LEFT JOIN `".$this->tb_config_group_attribute_value."` v ON a.id = v.attr_id
WHERE a.group_id = ?
ORDER BY attr_ordering DESC, `ordering` DESC
",
['d'], [$group_id]
);
$group_attribute = array();
foreach ( $this->db->fetchAll($query) as $info ) {
if(!isset($group_attribute[$info['attribute_id']])) {
$group_attribute[$info['attribute_id']] = array(
'id' => $info['attribute_id'],
'name' => $info['attribute_name'],
'ordering' => $info['attr_ordering'],
'list' => array(),
);
}
if($info['value_id']) {
$group_attribute[$info['attribute_id']]['list'][] = array(
'id' => $info['value_id'],
'name' => $info['value_name'],
'image' => $info['image'],
'color' => $info['color'],
'ordering' => $info['ordering'],
'description' => $info['description'],
);
}
}
return $group_attribute;
}
public function getProductConfigGroupId($product_id) {
$query = $this->db->runQuery(
"SELECT `group_id` FROM `".$this->tb_config_group_product."` WHERE `product_id` = ? LIMIT 1 ",
['d'], [$product_id]
) ;
if($item_info = $this->db->fetchAssoc($query)){
return $item_info['group_id'];
}
return 0;
}
public function getProductInGroup($group_id){
$query = $this->db->runQuery(
"SELECT `product_id`, `product_name_in_group`, `attribute_config`
FROM `".$this->tb_config_group_product."`
WHERE `group_id` = ?
",
['d'], [$group_id]
);
$product_list = array();
$product_ids = array();
foreach ( $this->db->fetchAll($query) as $info ) {
$product_ids[] = $info['product_id'];
$product_list[$info['product_id']] = array(
"id" => $info['product_id'],
"name" => "",
"product_name_in_group" => $info['product_name_in_group'],
"attribute" => \json_decode($info['attribute_config'], true),
"url" => "",
"sku" => "",
"price" => 0,
"image" => "",
"status" => "",
);
}
//find product urls
if(sizeof($product_ids)) {
$objProductModel = new ProductModel();
$product_list_info = $objProductModel->getListByIds($product_ids);
// debug_var($product_list_info);
// update $product_list
foreach ($product_list as $_pro_id => $_info) {
$_pro_info = $product_list_info[$_pro_id] ?? null;
if($_pro_info) {
$product_list[$_pro_id]['name'] = $_pro_info['title'];
$product_list[$_pro_id]['price'] = $_pro_info['price'];
$product_list[$_pro_id]['sku'] = $_pro_info['sku'];
$product_list[$_pro_id]['image'] = $_pro_info['thumbnail'];
$product_list[$_pro_id]['url'] = $_pro_info['request_path'];
$product_list[$_pro_id]['status'] = $_pro_info['status'];
}
}
}
return $product_list;
}
protected function isProductInGroup($product_id, $group_id) {
$query = $this->db->runQuery(
"SELECT * FROM `".$this->tb_config_group_product."` WHERE `product_id` = ? AND `group_id` = ? LIMIT 1 ",
['d', 'd'],
[$product_id, $group_id]
) ;
return ($this->db->fetchAssoc($query));
}
protected function _buildQueryConditionExtend(array $filter_condition) : ?array
{
/*$condition = array(
"q" => "",
"numPerPage" => 20,
"order_by" => '',
);*/
$catCondition = "";
return [
$catCondition,
[],
[]
];
}
protected function beforeCreateItem(array $input_info): AppResponse
{
$info = $input_info;
$info['create_time'] = CURRENT_TIME;
$info['create_by'] = ADMIN_NAME;
$info['last_update'] = CURRENT_TIME;
$info['last_update_by'] = ADMIN_NAME;
return new AppResponse('ok', null, $info);
}
protected function afterCreateItem($new_item_id, $new_item_info)
{
// TODO: Implement afterCreateItem() method.
}
protected function beforeUpdateItem($item_id, $current_item_info, $new_input_info):AppResponse
{
$info = $new_input_info;
$info['last_update'] = CURRENT_TIME;
$info['last_update_by'] = ADMIN_NAME;
return new AppResponse('ok', null, $info);
}
protected function afterUpdateItem($item_id, $old_item_info, $new_item_info)
{
// TODO: Implement afterUpdateItem() method.
}
protected function beforeDeleteItem($item_id, $item_info):AppResponse
{
return new AppResponse('ok' );
}
protected function afterDeleteItem($item_id, $item_info)
{
$query = $this->db->runQuery("SELECT `id` FROM `".$this->tb_config_group_attribute."` WHERE `group_id` = ? ", ['d'], [$item_id]);
foreach ( $this->db->fetchAll($query) as $info ) {
$this->deleteAttribute($info['id'], $item_id);
}
$this->db->runQuery(
"DELETE FROM `".$this->tb_config_group_product_cache."` WHERE `product_id` IN (SELECT product_id FROM config_group_product WHERE `group_id` = ? ) ",
['d'], [$item_id]
) ;
$this->db->runQuery("DELETE FROM `".$this->tb_config_group_product."` WHERE `group_id` = ? ", ['d'], [$item_id]) ;
}
}