query($sqlStmt);
if (DB::isError($result)) die ("$PHP_SELF: " . $result->getMessage());
while ($row = $result->fetch_assoc()):
$retArray[$row["at_id_special"]] = $row["atb_bundlequantity"];
endwhile;
$result->free();
endif;
return $retArray;
}
// Checks for an article being a bundle (at least one "subarticle" does exist)
// $atId : Article id to be checked
function isBundledArticle($atId) {
$retBool = false;
if ($atId != "" && is_numeric($atId)) :
$tmpArray = getBundledArticles($atId);
$keys = array_keys($tmpArray);
$keysLen = count($keys);
if ($keysLen > 0) :
$retBool = true;
endif;
endif;
return $retBool;
}
// Updates the quantity of an existing bundled article
// $atId : Parent article id to be checked
// $atId2 : Child article id to be checked
// $bundleQuantity : Quantity to be added to the existing quantity
function updateQuantityOfExistingBundledArticle($atId, $atId2, $bundleQuantity) {
global $db, $PHP_SELF;
$retBool = false;
if ($atId != "" && is_numeric($atId) && $atId2 != "" && is_numeric($atId2) && is_numeric($bundleQuantity) && $bundleQuantity > 0) :
$sqlStmt = "SELECT atb.atb_bundlequantity FROM articlebundle AS atb WHERE atb.at_id = '" . $atId . "' AND atb.at_id2 = '" . $atId2 . "' ";
$result = $db->query($sqlStmt);
if (DB::isError($result)) die ("$PHP_SELF: " . $result->getMessage());
$tmpBundleQuantity = 0;
while ($row = $result->fetch_assoc()):
$tmpBundleQuantity = $row["atb_bundlequantity"];
endwhile;
$result->free();
// Add quantities and update
$tmpBundleQuantity = $tmpBundleQuantity + $bundleQuantity;
updateStmt("articlebundle","at_id",$atId,array("atb_bundlequantity", $tmpBundleQuantity),"at_id2 = '" . $atId2 . "'");
$retBool = true;
endif;
return $retBool;
}
// Checks for cycles starting with a specified bundle (bottom up recursion)
// $currAtId : Current Article to get the path(s) bottom up to root
// $atIdToBeChecked : Bundled article to be checked for cycle along the path(s)
function checkForCycle($currAtId, $atIdToBeChecked) {
global $db, $PHP_SELF;
global $noCycle, $recurseCount;
// Number of recursions
$recurseCount++;
if ($noCycle) :
if ($expandedBundleQuantitiy == "") : $expandedBundleQuantitiy = 1; endif;
// Select bundled articles
$tmpArray = getBundledArticles($currAtId, "1"); // Get parent(s)
$keys = array_keys($tmpArray);
$keysLen = count($keys);
if ($keysLen > 0) :
// Iterate current article being a bundle article
for ($i = 0; $i < $keysLen; $i++) :
$tmpAtId = $keys[$i];
// Prepare to abort because cycle found
// Check first current article (in $articleId [has to be defined]) is NOT a bundled article (<=> it is a leaf of the tree)
// ONLY BUNDLED ARTICLES have to be checked for an existing cycle !!!
if ($atIdToBeChecked == $tmpAtId) :
// Cycle detected
$noCycle = false;
endif;
// Recursion ...
checkForCycle($tmpAtId, $atIdToBeChecked);
endfor;
endif;
endif;
}
// Gets all articles of a specified bundle and gets all piece quantities (top down recursion)
// Following global parameters have to be set before: "atArray", "bundleArray", "noCycle"
// $atId : Article id to be requested
function getTreeOfBundledArticles($atId, $bundleQuantity, $expandedBundleQuantitiy) {
global $db, $PHP_SELF;
global $atArray, $noCycle, $recurseCount;
// Number of recursions
$recurseCount++;
if ($noCycle && $recurseCount < 2000) :
if ($expandedBundleQuantitiy == "") : $expandedBundleQuantitiy = 1; endif;
// Select bundled articles
$tmpArray = getBundledArticles($atId); // Get children
$keys = array_keys($tmpArray);
$keysLen = count($keys);
if ($keysLen > 0) :
// Iterate current article being a bundle article
for ($i = 0; $i < $keysLen; $i++) :
$tmpAtId = $keys[$i];
// Recursion ...
getTreeOfBundledArticles($tmpAtId, $tmpArray[$tmpAtId], ($expandedBundleQuantitiy * $tmpArray[$tmpAtId]));
endfor;
else :
// Current article is NOT a bundle article
if ($atArray[$atId] == "") :
// Get quantity explicitly
$atArray[$atId] = 0;
endif;
// $atArray[$atId] = $atArray[$atId] + ($bundleQuantity * $expandedBundleQuantitiy);
$atArray[$atId] = $atArray[$atId] + $expandedBundleQuantitiy;
endif;
endif;
}
// Init globals for bundle recursion
$atArray = array();
$bundleArray = array();
$bundleArray[$articleId] = 0; // Init with current article
$noCycle = true;
$recurseCount = 0;
// getTreeOfBundledArticles($articleId, 0, 1);
// REMARK ...
/*
if ($noCycle) :
// OK, no cycle found ...
echo "
";
echo "recurseCount: " . $recurseCount . "
";
echo "atArray:
";
$keys = array_keys($atArray);
$keysLen = count($keys);
for ($i = 0; $i < $keysLen; $i++) :
$tmpAtId = $keys[$i];
echo $tmpAtId . " : " . $atArray[$tmpAtId] . "
";
endfor;
echo "----------------
";
echo "bundleArray:
";
$keys = array_keys($bundleArray);
$keysLen = count($keys);
for ($i = 0; $i < $keysLen; $i++) :
$tmpAtId = $keys[$i];
echo $tmpAtId . " : " . $bundleArray[$tmpAtId] . "
";
endfor;
else :
echo "Cycle detected !!!
";
endif;
*/
?>