/** * Unit test for eZProductCollectionItem::cleanupList() * * Outline: * 1) Create 40 eZProductCollectionItem objects with a product_collection_id * from 1 to 4 * 2) Call cleanupList with (1, 2) as a parameter * 4) Check that the 20 matching items have been removed * 5) Check that the 20 other, non-matching items haven't been removed **/ public function testCleanupList() { // Create a few collections $row = array('product_collection_id' => 0, 'contentobject_id' => 1, 'item_count' => 1, 'price' => 50, 'is_vat_inc' => 1, 'vat_value' => 19.6, 'discount' => 0, 'name' => __FUNCTION__); $deleteIDArray = $keepIDArray = array(); for ($i = 1; $i < 40; $i++) { $row['productcollection_id'] = ceil($i / 10); $row['name'] = __FUNCTION__ . ":" . $row['productcollection_id'] . "-{$i}"; $item = new eZProductCollectionItem($row); $item->store(); if ($row['productcollection_id'] <= 2) { $deleteIDArray[] = $item->attribute('id'); } else { $keepIDArray[] = $item->attribute('id'); } } eZProductCollectionItem::cleanupList(array(1, 2)); // Check that each item of deleteIDArray has been removed foreach ($deleteIDArray as $id) { $this->assertNull(eZProductCollectionItem::fetch($id)); } // And check that each item of remainingIDArray hasn't been deleted foreach ($keepIDArray as $id) { $this->assertType('eZProductCollectionItem', eZProductCollectionItem::fetch($id)); } }
static function fetchList($conditions = null, $asObjects = true, $offset = false, $limit = false) { $limitation = null; if ($offset !== false or $limit !== false) { $limitation = array('offset' => $offset, 'length' => $limit); } return eZPersistentObject::fetchObjectList(eZProductCollectionItem::definition(), null, $conditions, null, $limitation, $asObjects); }
function type() { $type = false; // get first product $productCollectionItemList = eZProductCollectionItem::fetchList(array('productcollection_id' => $this->attribute('productcollection_id')), true, 0, 1); if (is_array($productCollectionItemList) && count($productCollectionItemList) === 1) { $product = $productCollectionItemList[0]->attribute('contentobject'); if (is_object($product)) { $type = eZShopFunctions::productTypeByObject($product); } } return $type; }
/** * Removes all product collections based on a product collection ID list * Will also remove the product collection items. * * @param array $productCollectionIDList array of eZProductCollection IDs * * @return void */ static function cleanupList($productCollectionIDList) { $db = eZDB::instance(); $db->begin(); // Purge shipping information associated with product collections being removed. foreach ($productCollectionIDList as $productCollectionID) { eZShippingManager::purgeShippingInfo($productCollectionID); } eZProductCollectionItem::cleanupList($productCollectionIDList); $where = $db->generateSQLINStatement($productCollectionIDList, 'id', false, false, 'int'); $db->query("DELETE FROM ezproductcollection WHERE {$where}"); $db->commit(); }
function collectProductCollections($maxTime = false, $sleepTime = false, $limit = false) { $db = eZDB::instance(); // Create a temporary table for filling in collection ids // that are in use if ($db->databaseName() == 'mysql') { $db->query("DROP TABLE IF EXISTS ezproductcollection_used"); } $db->query("CREATE TABLE ezproductcollection_used ( id int )"); // Fill in collections used by orders $db->query("INSERT INTO ezproductcollection_used (id) SELECT productcollection_id FROM ezorder"); // Fill in collections used by wish lists $db->query("INSERT INTO ezproductcollection_used (id) SELECT productcollection_id FROM ezwishlist"); // Fill in collections used by baskets $db->query("INSERT INTO ezproductcollection_used (id) SELECT productcollection_id FROM ezbasket"); // Create the index for faster selects $db->query("CREATE INDEX ezproductcollection_used_id on ezproductcollection_used( id )"); if ($maxTime === false and $db->hasRequiredServerVersion('4.0', 'mysql')) { // Delete entries which are not in ezproductcollection_used $db->query("DELETE FROM ezproductcollection, ezproductcollection_item, ezproductcollection_item_opt\nUSING ezproductcollection_used\n RIGHT JOIN ezproductcollection\n ON ezproductcollection_used.id = ezproductcollection.id\n LEFT JOIN ezproductcollection_item\n ON ezproductcollection.id = ezproductcollection_item.productcollection_id\n LEFT JOIN ezproductcollection_item_opt\n ON ezproductcollection_item.id = ezproductcollection_item_opt.item_id\nWHERE ezproductcollection_used.id IS NULL"); $db->query($sql); // Remove the temporary table $db->query("DROP TABLE ezproductcollection_used"); return; } // Find all product collections which are not in use if ($db->hasRequiredServerVersion('8', 'oracle')) { $sql = "SELECT ezproductcollection.id\nFROM ezproductcollection_used, ezproductcollection\nWHERE ezproductcollection_used.id = ezproductcollection.id (+) AND\n ezproductcollection_used.id IS NULL"; } else { $sql = "SELECT ezproductcollection.id\nFROM ezproductcollection_used\n RIGHT JOIN ezproductcollection\n ON ezproductcollection_used.id = ezproductcollection.id\nWHERE ezproductcollection_used.id IS NULL"; } if ($limit === false) { $limit = eZDBGarbageCollector::ITEM_LIMIT; } $end = false; if (is_numeric($maxTime)) { $end = time() + $maxTime; } do { $rows = $db->arrayQuery($sql, array('offset' => 0, 'limit' => $limit)); if (count($rows) == 0) { break; } $idList = array(); foreach ($rows as $row) { $idList[] = (int) $row['id']; } eZProductCollectionItem::cleanupList($idList); $ids = implode(', ', $idList); $db->query("DELETE FROM ezproductcollection WHERE id IN ( {$ids} )"); $db->query("DELETE FROM ezproductcollection_used WHERE id IN ( {$ids} )"); // Stop when we used up our time if ($end !== false and time() > $end) { break; } // Sleep a little if required, reduces load on server if ($sleepTime !== false) { sleep($sleepTime); } } while (true); // Remove the temporary table $db->query("DROP TABLE ezproductcollection_used"); }
static function removeItem($itemID) { $item = eZProductCollectionItem::fetch($itemID); $item->remove(); }
/** * Deletes the current object, all versions and translations, and corresponding tree nodes from the database * * Transaction unsafe. If you call several transaction unsafe methods you must enclose * the calls within a db transaction; thus within db->begin and db->commit. */ function purge() { $delID = $this->ID; // Who deletes which content should be logged. eZAudit::writeAudit( 'content-delete', array( 'Object ID' => $delID, 'Content Name' => $this->attribute( 'name' ), 'Comment' => 'Purged the current object: eZContentObject::purge()' ) ); $db = eZDB::instance(); $db->begin(); $attrOffset = 0; $attrLimit = 20; while ( $contentobjectAttributes = $this->allContentObjectAttributes( $delID, true, array( 'limit' => $attrLimit, 'offset' => $attrOffset ) ) ) { foreach ( $contentobjectAttributes as $contentobjectAttribute ) { $dataType = $contentobjectAttribute->dataType(); if ( !$dataType ) continue; $dataType->deleteStoredObjectAttribute( $contentobjectAttribute ); } $attrOffset += $attrLimit; } eZInformationCollection::removeContentObject( $delID ); eZContentObjectTrashNode::purgeForObject( $delID ); $db->query( "DELETE FROM ezcontentobject_tree WHERE contentobject_id='$delID'" ); $db->query( "DELETE FROM ezcontentobject_attribute WHERE contentobject_id='$delID'" ); $db->query( "DELETE FROM ezcontentobject_version WHERE contentobject_id='$delID'" ); $db->query( "DELETE FROM ezcontentobject_name WHERE contentobject_id='$delID'" ); $db->query( "DELETE FROM ezcobj_state_link WHERE contentobject_id=$delID" ); $db->query( "DELETE FROM ezcontentobject WHERE id='$delID'" ); $db->query( "DELETE FROM eznode_assignment WHERE contentobject_id = '$delID'" ); $db->query( "DELETE FROM ezuser_role WHERE contentobject_id = '$delID'" ); $db->query( "DELETE FROM ezuser_discountrule WHERE contentobject_id = '$delID'" ); eZContentObject::fixReverseRelations( $delID, 'remove' ); eZSearch::removeObjectById( $delID ); // Check if deleted object is in basket/wishlist $sql = 'SELECT DISTINCT ezproductcollection_item.productcollection_id FROM ezbasket, ezwishlist, ezproductcollection_item WHERE ( ezproductcollection_item.productcollection_id=ezbasket.productcollection_id OR ezproductcollection_item.productcollection_id=ezwishlist.productcollection_id ) AND ezproductcollection_item.contentobject_id=' . $delID; $rows = $db->arrayQuery( $sql ); if ( count( $rows ) > 0 ) { $countElements = 50; $deletedArray = array(); // Create array of productCollectionID will be removed from ezwishlist and ezproductcollection_item foreach ( $rows as $row ) { $deletedArray[] = $row['productcollection_id']; } // Split $deletedArray into several arrays with $countElements values $splitted = array_chunk( $deletedArray, $countElements ); // Remove eZProductCollectionItem and eZWishList foreach ( $splitted as $value ) { eZPersistentObject::removeObject( eZProductCollectionItem::definition(), array( 'productcollection_id' => array( $value, '' ) ) ); eZPersistentObject::removeObject( eZWishList::definition(), array( 'productcollection_id' => array( $value, '' ) ) ); } } $db->query( 'UPDATE ezproductcollection_item SET contentobject_id = 0 WHERE contentobject_id = ' . $delID ); // Cleanup relations in two steps to avoid locking table for to long $db->query( "DELETE FROM ezcontentobject_link WHERE from_contentobject_id = '$delID'" ); $db->query( "DELETE FROM ezcontentobject_link WHERE to_contentobject_id = '$delID'" ); // Cleanup properties: LastVisit, Creator, Owner $db->query( "DELETE FROM ezuservisit WHERE user_id = '$delID'" ); $db->query( "UPDATE ezcontentobject_version SET creator_id = 0 WHERE creator_id = '$delID'" ); $db->query( "UPDATE ezcontentobject SET owner_id = 0 WHERE owner_id = '$delID'" ); if ( isset( $GLOBALS["eZWorkflowTypeObjects"] ) and is_array( $GLOBALS["eZWorkflowTypeObjects"] ) ) { $registeredTypes =& $GLOBALS["eZWorkflowTypeObjects"]; } else { $registeredTypes = eZWorkflowType::fetchRegisteredTypes(); } // Cleanup ezworkflow_event etc... foreach ( array_keys( $registeredTypes ) as $registeredTypeKey ) { $registeredType = $registeredTypes[$registeredTypeKey]; $registeredType->cleanupAfterRemoving( array( 'DeleteContentObject' => $delID ) ); } $db->commit(); }
foreach ($options as $option) { /* If any option differs, go away: */ if (is_array($optionList[$option['object_attribute_id']]) && !in_array($option['option_item_id'], $optionList[$option['object_attribute_id']]) || !is_array($optionList[$option['object_attribute_id']]) && $option['option_item_id'] != $optionList[$option['object_attribute_id']]) { $theSame = false; break; } } if ($theSame) { $itemID = $item['id']; break; } } } } if ($itemID == false) { $item = eZProductCollectionItem::create($wishList->attribute("productcollection_id")); $item->setAttribute('name', $object->attribute('name')); $item->setAttribute("contentobject_id", $objectID); $item->setAttribute("item_count", 1); //$item->setAttribute( "price", $price ); $db = eZDB::instance(); $db->begin(); $item->store(); //if ( $priceObj->attribute( 'is_vat_included' ) ) //{ // $item->setAttribute( "is_vat_inc", '1' ); //} //else //{ // $item->setAttribute( "is_vat_inc", '0' ); //}
function addToBasket($objectID, $optionList, $quantity) { $object = eZContentObject::fetch($objectID); $nodeID = $object->attribute('main_node_id'); $price = 0.0; $isVATIncluded = true; $attributes = $object->contentObjectAttributes(); $priceFound = false; foreach ($attributes as $attribute) { $dataType = $attribute->dataType(); if (eZShopFunctions::isProductDatatype($dataType->isA())) { $priceObj = $attribute->content(); $price += $priceObj->attribute('price'); $priceFound = true; } } if (!$priceFound) { eZDebug::writeError('Attempted to add object without price to basket.'); return array('status' => eZModuleOperationInfo::STATUS_CANCELLED); } $currency = $priceObj->attribute('currency'); // Check for 'option sets' in option list. // If found each 'option set' will be added as a separate product purchase. $hasOptionSet = false; foreach (array_keys($optionList) as $optionKey) { if (substr($optionKey, 0, 4) == 'set_') { $returnStatus = eZShopOperationCollection::addToBasket($objectID, $optionList[$optionKey]); // If adding one 'option set' fails we should stop immediately if ($returnStatus['status'] == eZModuleOperationInfo::STATUS_CANCELLED) { return $returnStatus; } $hasOptionSet = true; } } if ($hasOptionSet) { return $returnStatus; } $unvalidatedAttributes = array(); foreach ($attributes as $attribute) { $dataType = $attribute->dataType(); if ($dataType->isAddToBasketValidationRequired()) { $errors = array(); if ($attribute->validateAddToBasket($optionList[$attribute->attribute('id')], $errors) !== eZInputValidator::STATE_ACCEPTED) { $description = $errors; $contentClassAttribute = $attribute->contentClassAttribute(); $attributeName = $contentClassAttribute->attribute('name'); $unvalidatedAttributes[] = array("name" => $attributeName, "description" => $description); } } } if (count($unvalidatedAttributes) > 0) { return array('status' => eZModuleOperationInfo::STATUS_CANCELLED, 'reason' => 'validation', 'error_data' => $unvalidatedAttributes); } $basket = eZBasket::currentBasket(); /* Check if the item with the same options is not already in the basket: */ $itemID = false; $collection = $basket->attribute('productcollection'); if (!$collection) { eZDebug::writeError('Unable to find product collection.'); return array('status' => eZModuleOperationInfo::STATUS_CANCELLED); } else { $collection->setAttribute('currency_code', $currency); $collection->store(); $count = 0; /* Calculate number of options passed via the HTTP variable: */ foreach (array_keys($optionList) as $key) { if (is_array($optionList[$key])) { $count += count($optionList[$key]); } else { $count++; } } $collectionItems = $collection->itemList(false); foreach ($collectionItems as $item) { /* For all items in the basket which have the same object_id: */ if ($item['contentobject_id'] == $objectID) { $options = eZProductCollectionItemOption::fetchList($item['id'], false); /* If the number of option for this item is not the same as in the HTTP variable: */ if (count($options) != $count) { break; } $theSame = true; foreach ($options as $option) { /* If any option differs, go away: */ if (is_array($optionList[$option['object_attribute_id']]) && !in_array($option['option_item_id'], $optionList[$option['object_attribute_id']]) || !is_array($optionList[$option['object_attribute_id']]) && $option['option_item_id'] != $optionList[$option['object_attribute_id']]) { $theSame = false; break; } } if ($theSame) { $itemID = $item['id']; break; } } } if ($itemID) { /* If found in the basket, just increment number of that items: */ $item = eZProductCollectionItem::fetch($itemID); $item->setAttribute('item_count', $quantity + $item->attribute('item_count')); $item->store(); } else { $item = eZProductCollectionItem::create($basket->attribute("productcollection_id")); $item->setAttribute('name', $object->attribute('name')); $item->setAttribute("contentobject_id", $objectID); $item->setAttribute("item_count", $quantity); $item->setAttribute("price", $price); if ($priceObj->attribute('is_vat_included')) { $item->setAttribute("is_vat_inc", '1'); } else { $item->setAttribute("is_vat_inc", '0'); } $item->setAttribute("vat_value", $priceObj->attribute('vat_percent')); $item->setAttribute("discount", $priceObj->attribute('discount_percent')); $item->store(); $priceWithoutOptions = $price; $optionIDList = array(); foreach (array_keys($optionList) as $key) { $attributeID = $key; $optionString = $optionList[$key]; if (is_array($optionString)) { foreach ($optionString as $optionID) { $optionIDList[] = array('attribute_id' => $attributeID, 'option_string' => $optionID); } } else { $optionIDList[] = array('attribute_id' => $attributeID, 'option_string' => $optionString); } } $db = eZDB::instance(); $db->begin(); foreach ($optionIDList as $optionIDItem) { $attributeID = $optionIDItem['attribute_id']; $optionString = $optionIDItem['option_string']; $attribute = eZContentObjectAttribute::fetch($attributeID, $object->attribute('current_version')); $dataType = $attribute->dataType(); $optionData = $dataType->productOptionInformation($attribute, $optionString, $item); if ($optionData) { $optionData['additional_price'] = eZShopFunctions::convertAdditionalPrice($currency, $optionData['additional_price']); $optionItem = eZProductCollectionItemOption::create($item->attribute('id'), $optionData['id'], $optionData['name'], $optionData['value'], $optionData['additional_price'], $attributeID); $optionItem->store(); $price += $optionData['additional_price']; } } if ($price != $priceWithoutOptions) { $item->setAttribute("price", $price); $item->store(); } $db->commit(); } } return array('status' => eZModuleOperationInfo::STATUS_CONTINUE); }
if ($counteditems == 0) { $zeroproduct = true; return $module->redirectTo($module->functionURI("basket")); } $itemIDList = $http->postVariable("ProductItemIDList"); if (is_array($itemCountList) && is_array($itemIDList) && count($itemCountList) == count($itemIDList) && is_object($basket)) { $productCollectionID = $basket->attribute('productcollection_id'); $db = eZDB::instance(); $db->begin(); for ($i = 0, $itemCountError = false; $i < count($itemIDList); ++$i) { // If item count of product <= 0 we should show the error if (!is_numeric($itemCountList[$i]) or $itemCountList[$i] <= 0) { $itemCountError = true; continue; } $item = eZProductCollectionItem::fetch($itemIDList[$i]); if (is_object($item) && $item->attribute('productcollection_id') == $productCollectionID) { $item->setAttribute("item_count", $itemCountList[$i]); $item->store(); } } $db->commit(); if ($itemCountError) { // Redirect to basket $module->redirectTo($module->functionURI("basket") . "/(error)/invaliditemcount"); return; } } } // Fetch the shop account handler $accountHandler = eZShopAccountHandler::instance();