Files
kupshop/admin/productsVarLabels.php
2025-08-02 16:30:27 +02:00

390 lines
17 KiB
PHP

<?php
use KupShop\AdminBundle\Util\AdminSectionTree;
use KupShop\CatalogBundle\Section\SectionFilter;
use KupShop\CatalogBundle\Util\FilterUtil;
use KupShop\KupShopBundle\Util\Compat\ServiceContainer;
use Query\Operator;
$main_class = 'ProductsVarLabels';
class ProductsVarLabels extends Window
{
protected $tableName = 'products_variations_choices_labels';
protected $nameField = 'label';
protected $template = 'window/productsVarLabels.tpl';
private AdminSectionTree $adminSectionTree;
protected $uniques = ['code'];
public function __construct()
{
$this->adminSectionTree = ServiceContainer::getService(AdminSectionTree::class);
}
public function get_vars()
{
$vars = parent::get_vars();
$pageVars = getVal('body', $vars, []);
$ID = getVal('ID');
$pageVars['product_variations_rights'] = findModule('products_variations');
$pageVars['productsVarLabels']['ID'] = $ID;
$pageVars['tree'] = $this->adminSectionTree->getCategories();
$pageVars['selected'] = $this->adminSectionTree->getSelected($this->getID(), 'products_variations_sections', 'id_label');
$this->adminSectionTree->getOpened($pageVars['tree']);
$pageVars['opened'] = $this->adminSectionTree->opened;
if (getVal('valueId') != null) {
$pageVars['valueId'] = getVal('valueId');
}
if ($this->getAction() == 'edit' && !empty($ID)) {
$pageVars['SQL_row'] = [];
$qbLabelValues = sqlQueryBuilder()
->select('*, COUNT(pvc.id_variation) AS noVariants')
->from('products_variations_choices_values', 'pvcv')
->leftJoin('pvcv', 'products_variations_combination', 'pvc', 'pvc.id_value = pvcv.id')
->where(\Query\Operator::equals(['pvcv.id_label' => $ID]))
->groupBy('pvcv.id')
->orderBy('sort');
foreach ($qbLabelValues->execute() as $row) {
$this->unserializeCustomData($row);
$pageVars['SQL_row'][] = $row;
}
unset($row);
}
if ($this->getAction() == 'deleteValue' && isset($pageVars['valueId']) && is_numeric($pageVars['valueId'])) {
$SQL = sqlQuery('SELECT id_label, value
FROM '.getTableName('products_variations_choices_values')."
WHERE id='{$pageVars['valueId']}'");
$pageVars['Row'] = sqlFetchArray($SQL);
$pageVars['Row']['value'] = htmlspecialchars($pageVars['Row']['value']);
$pageVars['Row']['id_label'] = getVal('IDLabelSel', null, $pageVars['Row']['id_label']);
unset($SQL, $row);
$SQL = sqlQuery('SELECT id, value
FROM '.getTableName('products_variations_choices_values')."
WHERE id_label={$pageVars['Row']['id_label']} AND id!={$pageVars['valueId']}");
while ($row = sqlFetchAssoc($SQL)) {
$pageVars['SQL_variants'][] = $row;
}
unset($SQL, $row);
$SQL = sqlQuery('SELECT pvcl.label, pvcl.id
FROM '.getTableName('products_variations_choices_labels').' pvcl');
while ($row = sqlFetchAssoc($SQL)) {
$pageVars['SQL_moves'][] = $row;
}
unset($SQL, $row);
if (!empty($pageVars['Row']['id_label'])) {
$this->ID = $pageVars['Row']['id_label'];
}
$pageVars['variations_count'] = returnSQLResult('SELECT COUNT(id_value) FROM products_variations_combination WHERE id_value=:id_value', ['id_value' => $pageVars['valueId']]);
$pageVars['data'] = $this->getObject();
}
$pageVars['data']['searchTerm'] = getVal('searchTerm');
$vars['body'] = $pageVars;
unset($vars['type']);
$vars['type'] = 'productsVarLabels';
return $vars;
}
public function handle()
{
try {
$ID = getVal('ID');
$data = $this->getData();
$pvls = getVal('prodLabels', $data, []);
$sort_index = 0;
foreach ($pvls as $key => $row) {
if ($key > 0) {
$sort_index++;
}
}
foreach ($pvls as $id => $pvl) {
$pvl['id_label'] = $ID;
if (!$pvl['code']) {
$pvl['code'] = null;
}
if (empty($pvl['value']) || !empty($pvl['delete']) || (empty($pvl['changed']) && $pvl['id'] > 0)) {
continue;
}
$this->serializeCustomData($pvl);
if ($id < 0) {
$pvl['sort'] = $sort_index++;
$this->insertSQL('products_variations_choices_values', $pvl, ['changed']);
} else {
$this->updateSQL('products_variations_choices_values', $pvl, ['id' => $pvl['id']], ['changed']);
Variations::updateTitle(null, $pvl['id']);
}
}
if (findModule(Modules::INDEXED_FILTER)) {
\KupShop\IndexedFilterBundle\Util\FilterUrlDefaultValue::upgrade_filter_url('products_variations_choices_values');
}
} catch (Doctrine\DBAL\DBALException $e) {
switch (intval($e->getPrevious()->errorInfo[1])) {
case 1062:
$this->returnError('Duplicitní kód!');
// no break
default:
throw $e;
}
}
parent::handle();
}
public function handleUpdate()
{
$sec = getVal('sec', null, []);
$ID = $this->getID();
if (findModule('products_variations')) {
if (FilterUtil::useOrderableFilters()) {
$existingIdsMap = sqlQueryBuilder()
->select('sf.id_source_section', 'sf.id')
->from('sections_filters', 'sf')
->andWhere(Operator::equals(['sf.id_variation_label' => $ID]))
->andWhere('sf.id_source_section IS NOT NULL')
->execute()
->fetchAllKeyValue();
$relationsToDelete = sqlQueryBuilder()
->select('pvs.id_section')
->from('products_variations_sections', 'pvs')
->andWhere(Operator::equals(['pvs.id_label' => $ID]));
if (!empty($sec)) {
$relationsToDelete->andWhere(Operator::not(
Operator::inIntArray(array_keys($sec), 'pvs.id_section'),
));
}
$sectionFilters = [];
// delete
$relationsToDelete = $relationsToDelete->execute()->fetchFirstColumn();
foreach ($relationsToDelete as $sectionIdToDelete) {
$id = $existingIdsMap[$sectionIdToDelete] ?? null;
if ($id === null) {
continue;
}
$sectionFilters[] = SectionFilter::deleteVariation(
id: $id,
variationLabelId: (int) $ID,
sectionId: (int) $sectionIdToDelete,
);
}
// upsert
foreach ($sec as $sectionId => $_) {
$id = $existingIdsMap[$sectionId] ?? null;
$sectionFilters[] = SectionFilter::variation(
id: $id,
variationLabelId: (int) $ID,
sectionId: (int) $sectionId,
enabled: true,
position: FilterUtil::POSITION_LAST,
);
}
if (!empty($sectionFilters)) {
$filterUtil = ServiceContainer::getService(FilterUtil::class);
$filterUtil->updateSectionFilters($sectionFilters);
}
} else {
sqlQueryBuilder()->delete('products_variations_sections')
->where(\Query\Operator::equals(['id_label' => $ID]))
->andWhere(\Query\Operator::not(\Query\Operator::inIntArray(array_keys($sec), 'id_section')))
->execute();
foreach ($sec as $key => $value) {
if (!empty($key)) {
sqlQuery("INSERT IGNORE INTO products_variations_sections
SET id_label='{$ID}', id_section='{$key}' ");
}
}
unset($key, $value);
}
}
$SQL = parent::handleUpdate();
if (empty($ID)) {
$this->setID(sqlInsertID());
}
return $SQL;
}
public function handleSubmitAll()
{
$items = getVal('items');
if (!empty($items)) {
sqlStartTransaction();
$query = '';
foreach ($items as $id => $item) {
$SQL = sqlQuery('UPDATE '.getTableName('products_variations_choices_values').'
SET '.queryCreate(['value' => $item['value'], 'code' => $item['code'], 'sort' => $item['sort']], true)."
WHERE id='{$id}' ");
}
sqlFinishTransaction();
}
}
public function handleSortAlphabet()
{
$ID = $this->getID();
$query = 'UPDATE '.getTableName('products_variations_choices_values').' pvcv
LEFT JOIN (SELECT a.id, a.id_label, a.value, count(*) as rowNumber
FROM '.getTableName('products_variations_choices_values').' a
JOIN '.getTableName('products_variations_choices_values')." b ON a.id_label = b.id_label AND a.value >= b.value
WHERE a.id_label='{$ID}'
GROUP BY a.id_label, a.value) s ON pvcv.id=s.id
SET pvcv.sort=s.rowNumber
WHERE pvcv.id_label='{$ID}'";
$SQL = sqlQuery($query);
$this->returnOK();
// redirect("launch.php?s=productsVarLabels.php&acn=edit&ID=".$ID."&ErrStr=".$ErrStr);
}
public function handleDeleteValue()
{
$IDvalSel = getVal('IDvalSel');
$IDLabelSel = getVal('IDLabelSel');
$valueId = getVal('valueId');
$method = getVal('method');
if (!empty($valueId) && !empty($method)) {
$labelOld = returnSQLResult('SELECT id_label
FROM products_variations_choices_values
WHERE id=:value_id', ['value_id' => $valueId]);
switch ($method) {
case 'delete_values':
sqlQuery('DELETE pv FROM products_variations pv
JOIN products_variations_combination pvc ON pvc.id_variation = pv.id
WHERE id_value=:value_id', ['value_id' => $valueId]);
sqlQuery('DELETE FROM products_variations_choices_values WHERE id=:value_id', ['value_id' => $valueId]);
break;
case 'replace_values':
$IDLabelSel = $labelOld;
sqlQuery('INSERT INTO products_variations_choices_categorization
SELECT pvcc.id_product, :id_label_sel, pvcc.list_order+1
FROM products_variations_choices_categorization pvcc
WHERE id_label=:id_label_old AND (
SELECT COUNT(*)
FROM products_variations_choices_categorization pvcc2
WHERE pvcc2.id_label=:id_label_sel AND pvcc2.id_product=pvcc.id_product
) = 0', ['id_label_old' => $labelOld, 'id_label_sel' => $IDLabelSel]);
sqlQuery('UPDATE IGNORE products_variations_combination SET id_value=:id_val_sel, id_label=:id_label_sel WHERE id_value=:value_id',
['id_val_sel' => $IDvalSel, 'value_id' => $valueId, 'id_label_sel' => $IDLabelSel]);
sqlQuery('DELETE FROM products_variations_choices_values WHERE id=:value_id',
['value_id' => $valueId]);
break;
case 'move_values':
try {
sqlGetConnection()->transactional(function () use ($labelOld, $IDLabelSel, $valueId) {
sqlQuery('
INSERT INTO products_variations_choices_categorization (id_product, id_label, list_order)
SELECT pvcc.id_product, :id_label_sel, pvcc.list_order+1
FROM products_variations_choices_categorization pvcc
JOIN products_variations_combination pvc ON pvc.id_label=pvcc.id_label AND pvc.id_value=:id_value
JOIN products_variations pv ON pv.id = pvc.id_variation AND pvcc.id_product=pv.id_product
WHERE pvcc.id_label=:id_label_old AND (
SELECT COUNT(*)
FROM products_variations_choices_categorization pvcc2
WHERE pvcc2.id_label=:id_label_sel AND pvcc2.id_product=pvcc.id_product
) = 0
GROUP BY pvcc.id_product;
', ['id_label_old' => $labelOld, 'id_label_sel' => $IDLabelSel, 'id_value' => $valueId]);
// check for value if exists in new label
$value = $this->selectSQL('products_variations_choices_values', ['id' => $valueId], ['value'])->fetchColumn();
if ($valueNew = $this->selectSQL('products_variations_choices_values', ['id_label' => $IDLabelSel, 'value' => $value], ['id'])->fetchColumn()) {
sqlQuery('UPDATE products_variations_combination SET id_label = :id_label_sel, id_value = :id_value_new WHERE id_value = :value_id',
['value_id' => $valueId, 'id_value_new' => $valueNew, 'id_label_sel' => $IDLabelSel]);
$this->deleteSQL('products_variations_choices_values', ['id' => $valueId]);
} else {
sqlQuery(
'UPDATE products_variations_combination SET id_label=:id_label_sel WHERE id_value=:value_id',
['value_id' => $valueId, 'id_label_sel' => $IDLabelSel]
);
$position = returnSQLResult('SELECT MAX(pv.sort)+1 FROM products_variations_choices_values AS pv WHERE id_label=:id_label', ['id_label' => $IDLabelSel]);
sqlQuery(
'UPDATE products_variations_choices_values SET id_label=:id_label_sel, sort=:position WHERE id=:value_id',
['value_id' => $valueId, 'position' => $position, 'id_label_sel' => $IDLabelSel]
);
}
sqlQuery('
DELETE pvcc from products_variations_choices_categorization pvcc
WHERE pvcc.id_product NOT IN (
SELECT pv.id_product
FROM products_variations_combination pvc
JOIN products_variations pv on pvc.id_variation = pv.id
WHERE pvc.id_label=pvcc.id_label
)');
});
} catch (Exception $e) {
switch (intval($e->getPrevious()->errorInfo[1])) {
case 1062:
$this->returnError('Hodnota jmenovky s daným kódem je již u cílové jmenovky přiřazena!', null, $labelOld);
// no break
default:
}
}
}
$_REQUEST['flap'] = 'flapVarLabel';
$this->returnError(null, null, $labelOld);
}
}
public function handleDelete()
{
if (sqlQueryBuilder()
->select('*')
->from('products_variations_combination')
->where(\Query\Operator::equals(['id_label' => $this->getID()]))
->execute()->fetch()) {
$this->returnError('Jmenovku nelze smazat, má hodnoty! Nejprve odstraňte nebo přesuňte všechny její hodnoty.');
}
if (findModule(Modules::CONVERTORS)) {
if (sqlQueryBuilder()
->select('*')
->from('convertors_definition')
->where(\Query\Operator::equals(['id_label' => $this->getID()]))
->execute()->fetchOne()) {
$this->returnError('Jmenovku nelze smazat, používá se v převodníku!');
}
}
parent::handleDelete();
}
}