/** * Takes a product id and product image id and modifies the sorting values of all affected product images to "move this image after another image" * * @param ISC_ADMIN_REMOTE $remote */ public function remoteMoveImageAfterOtherImage(ISC_ADMIN_REMOTE $remote) { // this method is used instead of simply receiving a full serialize of the new product order, it allows us to update more efficiently by knowing which image was moved and only updating the affected sort orders $response = array(); $productId = false; $productHash = false; if (isset($_POST['product'])) { $productId = (int)@$_POST['product']; if (!isId($productId) || !ProductExists($productId)) { $response[] = $remote->MakeXMLTag('error', GetLang('ProductDoesntExist'), true); } else if (!$GLOBALS["ISC_CLASS_ADMIN_AUTH"]->HasPermission(AUTH_Edit_Products)) { $response[] = $remote->MakeXMLTag('error', GetLang('Unauthorized'), true); } } else if (isset($_POST['hash']) && $_POST['hash']) { $productHash = $_POST['hash']; if (!$GLOBALS["ISC_CLASS_ADMIN_AUTH"]->HasPermission(AUTH_Create_Product)) { $response[] = $remote->MakeXMLTag('error', GetLang('Unauthorized'), true); } } else { $response[] = $remote->MakeXMLTag('error', GetLang('ProductDoesntExist'), true); } if (!empty($response)) { $remote->SendXMLHeader(); $remote->SendXMLResponse($response); die(); } $moveId = (int)$_POST['move']; try { $moveImage = new ISC_PRODUCT_IMAGE($moveId); } catch (ISC_PRODUCT_IMAGE_INVALIDID_EXCEPTION $e) { $response[] = $remote->MakeXMLTag('error', sprintf(GetLang('ProductImageInvalidId'), $moveId), true); } catch (ISC_PRODUCT_IMAGE_RECORDNOTFOUND_EXCEPTION $e) { $response[] = $remote->MakeXMLTag('error', sprintf(GetLang('ProductImageNotFound'), $moveId), true); } catch (Exception $e) { $response[] = $remote->MakeXMLTag('error', GetLang('ProductImageMoveDatabaseError'), true); } if (!empty($response)) { $remote->SendXMLHeader(); $remote->SendXMLResponse($response); die(); } $moveSort = $moveImage->getSort(); if ($productId && $moveImage->getProductId() !== $productId || $productHash && $moveImage->getProductHash() !== $productHash) { // provided image id does not belong to provided product id $response[] = $remote->MakeXMLTag('error', sprintf(GetLang('ProductImageMismatchError'), $moveId, $productId), true); $remote->SendXMLHeader(); $remote->SendXMLResponse($response); die(); } if (isset($_POST['after'])) { $afterId = (int)$_POST['after']; try { $afterImage = new ISC_PRODUCT_IMAGE($afterId); } catch (ISC_PRODUCT_IMAGE_INVALIDID_EXCEPTION $e) { $response[] = $remote->MakeXMLTag('error', sprintf(GetLang('ProductImageInvalidId'), $afterId), true); $remote->SendXMLHeader(); $remote->SendXMLResponse($response); die(); } catch (ISC_PRODUCT_IMAGE_RECORDNOTFOUND_EXCEPTION $e) { $response[] = $remote->MakeXMLTag('error', sprintf(GetLang('ProductImageNotFound'), $afterId), true); $remote->SendXMLHeader(); $remote->SendXMLResponse($response); die(); } catch (Exception $e) { $response[] = $remote->MakeXMLTag('error', GetLang('ProductImageMoveDatabaseError'), true); $remote->SendXMLHeader(); $remote->SendXMLResponse($response); die(); } if ($productId && $afterImage->getProductId() !== $productId || $productHash && $afterImage->getProductHash() !== $productHash) { // provided image id does not belong to provided product id $response[] = $remote->MakeXMLTag('error', sprintf(GetLang('ProductImageMismatchError'), $afterId, $productId), true); $remote->SendXMLHeader(); $remote->SendXMLResponse($response); die(); } $afterSort = $afterImage->getSort(); } else { $after = false; $afterSort = -1; } if ($moveImage->getProductHash()) { if (!$GLOBALS["ISC_CLASS_ADMIN_AUTH"]->HasPermission(AUTH_Create_Product)) { $response[] = GetLang('Unauthorized'); $remote->SendXMLHeader(); $remote->SendXMLResponse($response); die(); } } else { if (!$GLOBALS["ISC_CLASS_ADMIN_AUTH"]->HasPermission(AUTH_Edit_Products)) { $response[] = GetLang('Unauthorized'); $remote->SendXMLHeader(); $remote->SendXMLResponse($response); die(); } } // create an sql query to shift all sorting values between the two anchor points if ($moveSort > $afterSort) { $sql = "UPDATE `[|PREFIX|]product_images` SET imagesort = imagesort + 1 WHERE imageprodid = " . $moveImage->getProductId() . " AND imagesort > " . $afterSort . " AND imagesort < " . $moveSort; $newSort = $afterSort + 1; } else { $sql = "UPDATE `[|PREFIX|]product_images` SET imagesort = imagesort - 1 WHERE imageprodid = " . $moveImage->getProductId() . " AND imagesort > " . $moveSort . " AND imagesort <= " . $afterSort; $newSort = $afterSort; } $db = $GLOBALS['ISC_CLASS_DB']; $db->Query("SET autocommit = 0"); $db->Query("LOCK TABLES `[|PREFIX|]product_images` WRITE"); $result = $db->Query($sql); if ($result) { $moveImage->setSort($newSort); try { $moveImage->saveToDatabase(false); $db->Query("COMMIT"); $response[] = $remote->MakeXMLTag('success', GetLang('ProductImagesSortOrderChanged'), true); } catch (Exception $e) { $db->Query("ROLLBACK"); $response[] = $remote->MakeXMLTag('success', GetLang('ProductImageMoveDatabaseError'), true); } $db->Query("UNLOCK TABLES"); } else { $db->Query("ROLLBACK"); $db->Query("UNLOCK TABLES"); $response[] = $remote->MakeXMLTag('success', GetLang('ProductImageMoveDatabaseError'), true); } $remote->SendXMLHeader(); $remote->SendXMLResponse($response); die(); }