Files
kupshop/bundles/KupShop/AdminBundle/Util/ListColumns.php
2025-08-02 16:30:27 +02:00

163 lines
4.9 KiB
PHP

<?php
namespace KupShop\AdminBundle\Util;
use Query\Operator;
class ListColumns
{
private $columnsCache = [];
public function orderTableDef($tableDef, $listName, $adminFilter)
{
$fields = $tableDef['fields'] ?? [];
$index = 0;
// fill options
foreach ($fields as $columnName => &$field) {
$columnOptions = $this->getColumnOptions($columnName, $listName, $adminFilter);
// backward compatibility kvuli prekladovym headerum listu
if (isset($field['translate']) && $columnOptions === null && isset($field['title'])) {
$columnOptions = $this->getColumnOptions($field['title'], $listName, $adminFilter);
}
$field['position'] = $columnOptions['position'] ?? $index;
$field['visible'] = $columnOptions['visible'] ?? ((isset($field['visible'])) ? $field['visible'] : 'Y');
$field['multiplier'] = $columnOptions['size'] ?? 1;
$size = $field['size'] ?? 1;
if (is_numeric($size)) {
$field['size'] = $size * $field['multiplier'];
} else {
// Handle size in px
$field['size'] = (intval($size) * $field['multiplier']).'px';
}
$index++;
}
// sort by position
uasort($fields, function ($a, $b) {
return $a['position'] <=> $b['position'];
});
$tableDef['fields'] = $fields;
return $tableDef;
}
public function getColumnOptions($columnName, $listName, $idFilter)
{
if ($columnOptions = $this->getListOptions($listName, $idFilter)) {
if (isset($columnOptions[$columnName])) {
return $columnOptions[$columnName];
}
}
return null;
}
public function getListOptions($listName, $idFilter)
{
$adminID = $this->getAdminID();
$columns = $this->getAdminFiltersColumn('columns', $listName, $adminID, $idFilter);
if ($columns) {
return json_decode($columns, true);
}
return null;
}
public function setListOptions(array $options, $listName, $idFilter = null)
{
$adminID = $this->getAdminID();
$options = json_encode($options);
if (!$adminID && !isSuperuser()) {
return false;
}
$idFilter = intval($idFilter);
$id = $idFilter ?: $this->getAdminFiltersColumn('id', $listName, $adminID, $idFilter);
if ($id) {
sqlQueryBuilder()
->update('admin_filters')
->directValues(['columns' => $options])
->where(
Operator::equals([
'id' => $id,
])
)->execute();
return $id;
} else {
sqlQueryBuilder()->insert('admin_filters')->directValues([
'name' => translate('default', 'filters'),
'type' => $listName,
'id_admin' => $adminID,
'default_filter' => 'Y',
'columns' => $options,
])->execute();
return sqlInsertID();
}
}
public function resetListOptions($listName, $idAdminFilter)
{
$adminID = $this->getAdminID();
if (!$adminID && !isSuperuser()) {
return false;
}
if ($id = $this->getAdminFiltersColumn('id', $listName, $adminID, $idAdminFilter)) {
sqlQueryBuilder()->delete('admin_filters')->where(Operator::equals([
'id' => $id,
]))->execute();
}
return true;
}
private function getAdminFiltersColumn($field, $listName, $adminID, $idAdminFilter)
{
$cacheName = $field.'-'.$listName.'-'.$adminID.'-'.$idAdminFilter;
if (isset($this->columnsCache[$cacheName])) {
return $this->columnsCache[$cacheName];
}
$adminFilterQB = sqlQueryBuilder()
->select($field)
->from('admin_filters');
$adminFilterQBTmp = sqlQueryBuilder()
->select($field)
->from('admin_filters');
if ($idAdminFilter) {
$adminFilterQBTmp->andWhere('id=:id')->setParameter('id', $idAdminFilter);
$columns = $adminFilterQBTmp->execute()->fetchColumn();
if ($columns) {
return $this->columnsCache[$cacheName] = $columns;
}
}
$adminFilterQB->andWhere(Operator::equalsNullable(['type' => $listName, 'default_filter' => 'Y']))
->andWhere(Operator::equalsNullable(['global' => 'Y', 'id_admin' => $adminID], 'OR'))
->orderBy('global = "Y"');
return $this->columnsCache[$cacheName] = $adminFilterQB->execute()->fetchColumn();
}
private function getAdminID()
{
$adminID = getAdminUser()['id'];
if ($adminID === 0 && isSuperuser()) {
$adminID = null;
}
return $adminID;
}
}