| Server IP : 54.36.91.62 / Your IP : 216.73.217.94 Web Server : Apache System : Linux webm013.cluster127.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 User : coopiak ( 151928) PHP Version : 8.3.23 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/coopiak/amisdesseniors-fr/voscatalogues/plugins/system/djc2yootheme/ |
Upload File : |
<?php
/**
* @package DJ-Catalog2-Yootheme
* @copyright Copyright (C) DJ-Extensions.com, All rights reserved.
* @license http://www.gnu.org/licenses GNU/GPL
* @author url: http://dj-extensions.com
* @author email contact@dj-extensions.com
*/
namespace DJExtensions\DJCatalog2\YOOtheme\Builder\Source;
use Joomla\Registry\Registry;
use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
defined('_JEXEC') or die('Restricted access');
class DJC2YooHelper
{
protected static $_categories = array();
protected static $_categoriesFlat = array();
public static function getCategories($parentId = 0)
{
if (!isset(self::$_categories[$parentId])) {
$cid = (($parentId != 0) ? array($parentId) : array());
self::$_categories[$parentId] = self::getCategoriesRecurring($cid);
}
return self::$_categories[$parentId];
}
public static function getCategoriesFlat($parentId = 0)
{
if (!isset(self::$_categoriesFlat[$parentId])) {
$categories = self::getCategories($parentId);
self::$_categoriesFlat[$parentId] = self::buildFlatCategories($categories);
}
return self::$_categoriesFlat[$parentId];
}
protected static function buildFlatCategories(&$categories)
{
foreach ($categories as $category) {
if(isset($category->childs) && count($category->childs)) {
self::buildFlatCategories($category->childs);
foreach ($category->childs as $child) {
$categories[$child->id] = $child;
unset($category->childs[$child->id]);
}
}
unset($category->childs);
}
return $categories;
}
public static function getCategoriesRecurring($cid = array(), $level = 0)
{
$categories = self::getCategoriesByParentId($cid);
if (count($categories)) {
$categoryIds = array_keys($categories);
$childs = self::getCategoriesRecurring($categoryIds);
if (count($childs)) {
foreach ($childs as $child) {
if (isset($categories[$child->parent_id])) {
$categories[$child->parent_id]->childs[$child->id] = $child;
}
}
}
}
return $categories;
}
protected static function getCategoriesByParentId($parentIds)
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query
->select('cat.*')
->from($db->quoteName('#__djc2_categories', 'cat'));
if (count($parentIds)) {
$query->where('cat.parent_id IN (' . implode(',', $parentIds) . ')');
} else {
$query->where('cat.parent_id = 0');
}
$db->setQuery($query);
return $db->loadObjectList('id');
}
static $attributes = array();
static $counters = array();
public static function getData($params, $flat = true)
{
$hash = $params->get('show_counter');
$hash .= ':' . serialize($params->get('fieldgroups'));
$hash .= ':' . $params->get('catsw');
$hash .= ':' . serialize($params->get('categories'));
$hash = md5($hash);
$attributes = self::getAttributes($params, $hash);
$counters = ($params->get('show_counter', 0) == '1') ? self::getCountersPrecise($attributes) : self::getCountersApprox($hash);
$app = Factory::getApplication();
$request = $app->input->getArray($_REQUEST);
foreach($request as $param=>$value) {
if (!array_key_exists('djcf', $request)) {
$request['djcf'] = array();
}
if (strstr($param, 'f_')) {
$qkey = substr($param, 2);
$qval = null;
if (is_array($value)) {
$qval = $value;
} else {
$qval = (strstr($value,',') !== false) ? explode(',',$value) : $value;
}
//$qval = (strstr($value,',') !== false) ? explode(',',$value) : $value;
unset($request[$param]);
$request['djcf'][$qkey] = $qval;
}
}
$filters = $request['djcf'];
$globalSearch = urldecode($app->input->get( 'search','','string' ));
$globalSearch = trim(\Joomla\String\StringHelper::strtolower( $globalSearch ));
if (substr($globalSearch,0,1) == '"' && substr($globalSearch, -1) == '"') {
$globalSearch = substr($globalSearch,1,-1);
}
if (strlen($globalSearch) > 0 && (strlen($globalSearch)) < 3 || strlen($globalSearch) > 20) {
$globalSearch = null;
}
$grouppedattributes = array();
foreach ($attributes as $key=>$attribute) {
$attributes[$key]->alias = str_replace('-', '_', $attribute->alias);
$attributes[$key]->optionsArray = ($attribute->options) ? $attribute->options : array();
$attributes[$key]->optionValuesArray = ($attribute->optionValues) ? $attribute->optionValues : array();
$attributes[$key]->optionCounterArray = array();
$attributes[$key]->selected = false;
$attributes[$key]->selectedOptions = array();
$attributes[$key]->selectedOptionValues = array();
$attributes[$key]->availableOptions = 0;
if ($attribute->type == 'text' && array_key_exists('t_'.$attributes[$key]->id, $counters)) {
$attributes[$key]->availableOptions = $counters['t_'.$attributes[$key]->id]->item_count;
}
foreach ($attributes[$key]->optionsArray as $kk => $vv) {
if (is_array($counters) && !empty($counters)) {
if (array_key_exists($vv, $counters)) {
$attributes[$key]->optionCounterArray[] = $counters[$vv]->item_count;
$attributes[$key]->availableOptions++;
} else {
$attributes[$key]->optionCounterArray[] = 0;
}
} else {
$attributes[$key]->optionCounterArray[] = 0;
}
}
if (!empty($filters[$attribute->alias])) {
$filter = $filters[$attribute->alias];
if (is_scalar($filter) && strpos($filter, ',') !== false) {
$filter = explode(',', $filter);
}
if (is_array($filter)) {
foreach($filter as $k=>$v) {
if (strlen($v) > 0 ) {
$attributes[$key]->selected = true;
$filter[$k] = (int)$v;
} else {
$filter[$k] = null;
}
}
//$attributes[$key]->selected = true;
foreach ($attribute->optionsArray as $o) {
if (in_array($o, $filter)){
$index = array_search($o, $attributes[$key]->optionsArray);
if (array_key_exists($index, $attributes[$key]->optionValuesArray)) {
$attributes[$key]->selectedOptionValues[] = $attributes[$key]->optionValuesArray[$index];
$attributes[$key]->selectedOptions[] = $attributes[$key]->optionsArray[$index];
}
}
}
} else {
$attributes[$key]->selected = true;
foreach ($attribute->optionsArray as $o) {
if ($o == (int)$filter) {
$index = array_search($o, $attributes[$key]->optionsArray);
if (array_key_exists($index, $attributes[$key]->optionValuesArray)) {
$attributes[$key]->selectedOptionValues[] = $attributes[$key]->optionValuesArray[$index];
$attributes[$key]->selectedOptions[] = $attributes[$key]->optionsArray[$index];
}
}
}
}
}
if (empty($grouppedattributes[$attribute->group_id])) {
$grouppedattributes[$attribute->group_id] = new \stdClass();
$grouppedattributes[$attribute->group_id]->group_name = $attribute->group_name;
$grouppedattributes[$attribute->group_id]->attributes = array();
}
$grouppedattributes[$attribute->group_id]->attributes[] = $attribute;
}
return $grouppedattributes;
}
private static function getAttributes(&$params, $hash)
{
if (empty(self::$attributes[$hash])) {
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('CONCAT(\'f_\', f.name) AS name,f.*, g.name as group_name, g.label as group_label');
$query->from('#__djc2_items_extra_fields as f');
$query->join('left', '#__djc2_items_extra_fields_groups as g ON g.id=f.group_id');
$fieldgroups = $params->get('fieldgroups');
$fields = $params->get('fields');
$group_ids = '';
if (!empty($fieldgroups)) {
if (in_array(0, $fieldgroups)) {
$group_ids = ' and (g.id in (' . implode(',', $fieldgroups) . ') OR g.id IS NULL)';
} else {
$group_ids = ' and (g.id in (' . implode(',', $fieldgroups) . '))';
}
}
$field_ids = '';
if (!empty($fields)) {
$field_ids = ' and f.id in (' . implode(',', $fields) . ')';
}
$lang = Factory::getLanguage();
$tag = $lang->getTag();
$query->where('(f.language = ' . $db->quote('*') . ' OR f.language = ' . $db->quote($tag) . ')');
if($group_ids == "" || $field_ids == ""){
$query->where('f.published = 1 AND f.filterable = 1 AND (f.type = \'checkbox\' or f.type = \'radio\' or f.type = \'select\' or f.type = \'text\' or f.type = \'color\' or f.type = \'multicolor\' or f.type = \'multiselect\') ');
}else {
$query->where('f.published = 1 AND f.filterable = 1 AND (f.type = \'checkbox\' or f.type = \'radio\' or f.type = \'select\' or f.type = \'text\' or f.type = \'color\' or f.type = \'multicolor\' or f.type = \'multiselect\') ' . $group_ids ." ". $field_ids);
}
$query->group('f.id');
$query->order('IFNULL(g.ordering,0) asc, g.ordering asc');
$itemIds = $params->get('ids', []);
if(count($itemIds)) {
$query->join('INNER', $db->quoteName('#__djc2_items_extra_fields_values_int', 'fv') . ' ON fv.field_id = f.id AND fv.item_id IN (' . implode(',', $itemIds) . ')');
$query->group('f.id');
}
$db->setQuery($query);
$attributes = $db->loadObjectList('id');
if (count($attributes) > 0) {
$query = $db->getQuery(true);
$query->select('o.*');
$query->from('#__djc2_items_extra_fields_options as o');
$query->where('o.field_id in (' . implode(',', array_keys($attributes)) . ')');
$itemIds = $params->get('ids', []);
if(count($itemIds)) {
$query->join('INNER', $db->quoteName('#__djc2_items_extra_fields_values_int', 'fv') . ' ON fv.field_id = o.field_id AND fv.value = o.id AND fv.item_id IN (' . implode(',', $itemIds) . ')');
$query->select('fv.item_id');
$query->group('o.id');
}
$query->order('field_id asc, ordering asc');
$db->setQuery($query);
$optionslist = $db->loadObjectList();
$query = $db->getQuery(true);
$query->select('distinct *');
$query->from('#__djc2_items_extra_fields_values_text');
$query->where('field_id in (' . implode(',', array_keys($attributes)) . ')');
$query->order('field_id asc, value asc');
$db->setQuery($query);
$textOptionslist = $db->loadObjectList();
foreach ($attributes as $field_id => $field) {
$field_options = array();
$field_optionValues = array();
$field_optionParams = array();
if ($field->type == 'text') {
foreach ($textOptionslist as $k => $option) {
if ($option->field_id == $field_id) {
$field_options[] = $option->id;
$field_optionValues[] = $option->value;
$field_optionParams[] = new Registry();
}
}
} else {
foreach ($optionslist as $k => $option) {
if ($option->field_id == $field_id) {
$field_options[] = $option->id;
$field_optionValues[] = $option->value;
$field_optionParams[] = !empty($option->params) ? new Registry($option->params) : new Registry();
}
}
}
$attributes[$field_id]->options = $field_options;//implode('|', $field_options);
$attributes[$field_id]->optionValues = $field_optionValues;//implode('|', $field_optionValues);
$attributes[$field_id]->optionParams = $field_optionParams;//implode('|', $field_optionValues);
}
}
self::$attributes[$hash] = $attributes;
}
return self::$attributes[$hash];
}
private static function getCountersPrecise($attributes)
{
$db = Factory::getDbo();
$app = Factory::getApplication();
$cparams = \Djcatalog2Helper::getParams();
$params = new Registry();
$params->merge($cparams);
BaseDatabaseModel::addIncludePath(JPATH_BASE . '/components/com_djcatalog2/models');
$model = BaseDatabaseModel::getInstance('Items', 'Djcatalog2Model');
$state = $model->getState();
$params->set('product_catalogue', 0);
$params->set('limit_items_show', 0);
$model->setState('params', $params);
$model->setState('filter.catalogue', false);
$model->setState('list.start', 0);
$model->setState('list.limit', 0);
$model->setState('list.select', 'i.id');
$model->setState('list.ordering', 'i.id');
$model->setState('filter.map.address', false);
$model->setState('filter.map.radius', false);
$filterState = $model->getState('filter.customattribute', array());
$counters = array();
foreach ($attributes as $attribute) {
if (!isset(self::$counters[$attribute->id])) {
$tempState = $filterState;
if (($attribute->type != 'checkbox' || $attribute->type != 'multicolor') && $attribute->filter_type != 'checkbox' && array_key_exists($attribute->alias, $tempState)) {
unset($tempState[$attribute->alias]);
}
$model->setState('filter.customattribute', $tempState);
$items_query = $model->buildQuery();
if ($attribute->type == 'text') {
$query = $db->getQuery(true);
$query->select('ef.id as field_id, ef.name as field_name, "" as option_id, "" as option_value, count(fv.item_id) as item_count');
$query->from('#__djc2_items_extra_fields_values_text as fv');
$query->join('inner', '#__djc2_items_extra_fields as ef on ef.id=fv.field_id AND ef.filterable = 1');
$query->where('ef.id = ' . $attribute->id);
$query->join('inner', '(' . $items_query . ') as item_ids on fv.item_id = item_ids.id');
$query->group('ef.id');
$query->order('ef.name asc');
$db->setQuery($query);
$textCounters = $db->loadObjectList('field_id');
if (isset($textCounters[$attribute->id])) {
self::$counters['t_' . $attribute->id] = $textCounters;
}
} else {
$query = $db->getQuery(true);
$query->select('ef.id as field_id, ef.name as field_name, opt.id as option_id, opt.value as option_value, count(fv.item_id) as item_count');
$query->from('#__djc2_items_extra_fields_values_int as fv');
$query->join('inner', '#__djc2_items_extra_fields as ef on ef.id=fv.field_id');
$query->join('inner', '#__djc2_items_extra_fields_options as opt on opt.field_id=ef.id and opt.id=fv.value');
$query->where('ef.id = ' . $attribute->id);
$query->join('inner', '(' . $items_query . ') as item_ids on fv.item_id = item_ids.id');
$query->group('ef.id, opt.value');
$query->order('ef.name asc');
$db->setQuery($query);
$intCounters = $db->loadObjectList('option_id');
self::$counters[$attribute->id] = $intCounters;
}
}
if (isset(self::$counters[$attribute->id]) && count(self::$counters[$attribute->id])) {
foreach (self::$counters[$attribute->id] as $k => $v) {
$counters[$k] = $v;
}
} else if (isset(self::$counters['t_' . $attribute->id]) && count(self::$counters['t_' . $attribute->id])) {
foreach (self::$counters['t_' . $attribute->id] as $k => $v) {
$counters['t_' . $k] = $v;
}
}
}
return $counters;
}
private static function getCountersApprox($hash)
{
if (empty(self::$counters[$hash])) {
self::$counters[$hash] = array();
$db = Factory::getDbo();
$app = Factory::getApplication();
$cparams = \Djcatalog2Helper::getParams();
$params = new Registry();
$params->merge($cparams);
BaseDatabaseModel::addIncludePath(JPATH_BASE . '/components/com_djcatalog2/models');
$model = BaseDatabaseModel::getInstance('Items', 'Djcatalog2Model');
$state = $model->getState();
$params->set('product_catalogue', 0);
$params->set('limit_items_show', 0);
$model->setState('params', $params);
$model->setState('filter.catalogue', false);
//$model->setState('filter.customattribute', array());
$model->setState('list.start', 0);
$model->setState('list.limit', 0);
$model->setState('list.select', 'i.id');
$model->setState('list.ordering', 'i.id');
$items_query = $model->buildQuery();
$query = $db->getQuery(true);
$query->select('ef.id as field_id, ef.name as field_name, opt.id as option_id, opt.value as option_value, count(fv.item_id) as item_count');
$query->from('#__djc2_items_extra_fields_values_int as fv');
$query->join('inner', '#__djc2_items_extra_fields as ef on ef.id=fv.field_id');
$query->join('inner', '#__djc2_items_extra_fields_options as opt on opt.field_id=ef.id and opt.id=fv.value');
$query->join('inner', '(' . $items_query . ') as item_ids on fv.item_id = item_ids.id');
$query->group('ef.id, opt.value');
$query->order('ef.name asc');
$db->setQuery($query);
$intCounters = $db->loadObjectList('option_id');
$query = $db->getQuery(true);
$query->select('ef.id as field_id, ef.name as field_name, "" as option_id, "" as option_value, count(fv.item_id) as item_count');
$query->from('#__djc2_items_extra_fields_values_text as fv');
$query->join('inner', '#__djc2_items_extra_fields as ef on ef.id=fv.field_id AND ef.filterable = 1');
$query->join('inner', '(' . $items_query . ') as item_ids on fv.item_id = item_ids.id');
$query->group('ef.id');
$query->order('ef.name asc');
$db->setQuery($query);
$textCounters = $db->loadObjectList('field_id');
foreach ($intCounters as $k => $v) {
self::$counters[$hash][$k] = $v;
}
foreach ($textCounters as $k => $v) {
self::$counters[$hash]['t_' . $k] = $v;
}
//self::$counters[$hash] = $db->loadObjectList('option_id');
}
return self::$counters[$hash];
}
public static function getMinMaxPrice()
{
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query
->select(array(
'MIN(i.price) AS min_range',
'MAX(i.price) AS max_range'
))
->from($db->quoteName('#__djc2_items', 'i'))
->where('i.published = 1');
$db->setQuery($query);
return $db->loadObject();
}
public static function buildUrlRequest($request) {
$uri = '';
$initialized = false;
$app = Factory::getApplication();
$catc = $app->input->getRaw('catc');
$search = $app->input->getRaw('search');
foreach ($request as $alias => $values) {
if(!$initialized) {
$uri = $alias . '=' . implode(',', $values);
$initialized = true;
}else {
$uri .= '&' . $alias . '=' . implode(',', $values);
}
}
if($search) {
if($initialized) {
$uri .= '&';
}
$uri .= 'search=' . urlencode($search);
}
if($catc) {
$uri .= '&$catc=true';
}
return $uri;
}
public static function discoverAttributes(&$attributes, $itemIds) {
print_r($attributes);
exit();
}
}