163 lines
4.9 KiB
PHP
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;
|
|
}
|
|
}
|