Files
xstore/inc/Hura8/Components/Product/Model/ProductAttributeModel.php
2025-10-04 11:46:59 +07:00

176 lines
5.4 KiB
PHP

<?php
namespace Hura8\Components\Product\Model;
use Hura8\Interfaces\AppResponse;
use Hura8\System\Language;
use Hura8\System\Model\aEntityBaseModel;
use Hura8\Interfaces\iEntityModel;
use Hura8\Interfaces\EntityType;
use Hura8\System\Security\DataClean;
use Hura8\System\Security\DataType;
class ProductAttributeModel extends aEntityBaseModel {
protected $tb_product_category = "tb_product_category";
protected $tb_attribute_value = "tb_attribute_value";
protected $tb_product_spec_group = "tb_product_spec_group";
protected $tb_attribute_per_spec_group = "tb_attribute_per_spec_group";
protected $tb_attribute_per_category = "tb_attribute_per_category";
public function __construct() {
parent::__construct(EntityType::PRODUCT_ATTRIBUTE);
}
protected function extendedFilterOptions() : array
{
return [
// empty for now
];
}
// SPEC-GROUP
public function getSpecGroupAttributeWithValues($group_id) {
$query = $this->db->runQuery(
"SELECT
a.title,
a.summary,
a.is_filter,
a.value_match_all,
a.filter_code,
a.is_display,
a.is_header,
a.is_multi, a.in_summary,
a.value_count,
g.attr_id,
g.ordering,
g.status
FROM ".$this->tb_attribute_per_spec_group." g, ".$this->tb_entity." a
WHERE g.`group_id`= ? AND g.`attr_id`= a.`id`
ORDER BY g.`ordering` DESC, a.`ordering` DESC ",
['d'],
[$group_id]
) ;
$attribute_ids = [];
$value_per_attribute_ids = [];
$result = [];
foreach ($this->db->fetchAll($query) as $item) {
$attribute_ids[] = $item['attr_id'];
$value_per_attribute_ids[$item['attr_id']] = [];
$result[$item['attr_id']] = [
"attribute_info" => $item,
"attribute_values" => &$value_per_attribute_ids[$item['attr_id']],
];
}
if(!sizeof($attribute_ids)) {
return [];
}
// now get all values for each attribute
list($parameterized_ids, $bind_types) = create_bind_sql_parameter_from_value_list($attribute_ids, "int");
$query = $this->db->runQuery(
"SELECT * FROM ".$this->tb_attribute_value."
WHERE `attribute_id` IN (".$parameterized_ids.")
ORDER BY `ordering` DESC, `title` ASC ",
$bind_types,
$attribute_ids
) ;
foreach ($this->db->fetchAll($query) as $item) {
$value_per_attribute_ids[$item['attribute_id']][] = $item;
}
return $result;
}
public function getSpecGroupAttribute($group_id) {
$query = $this->db->runQuery(
"SELECT
a.title,
a.summary,
a.is_filter,
a.value_match_all,
a.filter_code,
a.is_display,
a.is_header, a.is_multi, a.value_count,
g.attr_id,
g.ordering,
g.status
FROM ".$this->tb_attribute_per_spec_group." g, ".$this->tb_entity." a
WHERE g.`group_id`= ? AND g.`attr_id`= a.`id`
ORDER BY g.`ordering` DESC, a.`ordering` DESC ",
['d'],
[$group_id]
) ;
return $this->db->fetchAll($query);
}
public function getProductMatchAllAttributeValueIds(array $_att_value_list) {
/*$query = $this->db->runQuery("
SELECT `pro_id` , COUNT(*) AS num_pro
FROM ".TB_PRODUCT_ATTRIBUTE."
WHERE " . join(" OR ", array_map(function ($_item){ return " `attr_value_id` = '".intval($_item['id'])."' "; }, $_att_value_list )) ."
GROUP BY pro_id
HAVING num_pro = ".sizeof($_att_value_list)."
LIMIT 10000
");
return array_map(function ($item){
return $item["pro_id"];
}, $this->db->fetchAll($query));*/
return [];
}
public function getProductMatchAttributeValue(array $value_ids) {
$product_filter_id_match = array();
// todo:
/*if(sizeof($query_attr_id)) {
$query = $this->db->runQuery("
SELECT DISTINCT pro_id , COUNT(*) as num_pro
FROM ".TB_PRODUCT_ATTRIBUTE."
WHERE attr_value_id IN (".join(',', $query_attr_id).")
GROUP BY pro_id
HAVING num_pro = ".$count_filter."
LIMIT 10000
");
foreach ( $this->db->fetchAll($query) as $rs ) {
$product_filter_id_match[] = $rs["pro_id"];
}
}*/
return $product_filter_id_match;
}
protected function _buildQueryConditionExtend(array $filter_condition) : ?array
{
/*$condition = array(
"q" => "",
"letter" => "",
"status" => 0,
);*/
$catCondition = [];
$bind_types = [];
$bind_values = [];
return array( join(" ", $catCondition), $bind_types, $bind_values);
}
}