public function testProductDiscountTierDeletion() { $this->logInWithPermission('ADMIN'); $discount = ProductPage::get()->first(); $tier = $this->objFromFixture('ProductDiscountTier', 'fiveforten'); $tier->ProductPageID = $discount->ID; $tier->write(); $tierID = $tier->ID; $this->logOut(); $this->logInWithPermission('Product_CANCRUD'); $tier->delete(); $this->assertTrue(!ProductDiscountTier::get()->byID($tierID)); $this->logOut(); }
public function getCMSFields() { $fields = FieldList::create(new Tabset('Root', new Tab('Main'), new Tab('Modifiers'))); // set variables from Product $productID = $this->ProductID != 0 ? $this->ProductID : Session::get('CMSMain.currentPage'); $product = ProductPage::get()->byID($productID); $parentPrice = $product->obj('Price')->Nice(); $parentWeight = $product->Weight; $parentCode = $product->Code; // ProductOptionGroup Dropdown field w/ add new $groups = function () { return OptionGroup::get()->map()->toArray(); }; $groupFields = singleton('OptionGroup')->getCMSFields(); $groupField = DropdownField::create('ProductOptionGroupID', _t("OptionItem.Group", "Group"), $groups())->setEmptyString('')->setDescription(_t('OptionItem.GroupDescription', 'Name of this group of options. Managed in <a href="admin/settings">Settings > FoxyStripe > Option Groups</a>')); if (class_exists('QuickAddNewExtension')) { $groupField->useAddNew('OptionGroup', $groups, $groupFields); } $fields->addFieldsToTab('Root.Main', array(HeaderField::create('DetailsHD', _t("OptionItem.DetailsHD", "Product Option Details"), 2), Textfield::create('Title')->setTitle(_t("OptionItem.Title", "Product Option Name")), CheckboxField::create('Available')->setTitle(_t("OptionItem.Available", "Available for purchase"))->setDescription(_t('OptionItem.AvailableDescription', "If unchecked, will disable this option in the drop down menu")), $groupField)); $fields->addFieldsToTab('Root.Modifiers', array(HeaderField::create('ModifyHD', _t('OptionItem.ModifyHD', 'Product Option Modifiers'), 2), HeaderField::create('WeightHD', _t('OptionItem.WeightHD', 'Modify Weight'), 3), NumericField::create('WeightModifier')->setTitle(_t('OptionItem.WeightModifier', 'Weight')), DropdownField::create('WeightModifierAction', _t('OptionItem.WeightModifierAction', 'Weight Modification'), array('Add' => _t('OptionItem.WeightAdd', "Add to Base Weight ({weight})", 'Add to weight', array('weight' => $parentWeight)), 'Subtract' => _t('OptionItem.WeightSubtract', "Subtract from Base Weight ({weight})", 'Subtract from weight', array('weight' => $parentWeight)), 'Set' => _t('OptionItem.WeightSet', 'Set as a new Weight')))->setEmptyString('')->setDescription(_t('OptionItem.WeightDescription', 'Does weight modify or replace base weight?')), HeaderField::create('PriceHD', _t('OptionItem.PriceHD', 'Modify Price'), 3), CurrencyField::create('PriceModifier')->setTitle(_t('OptionItem.PriceModifier', 'Price')), DropdownField::create('PriceModifierAction', _t('OptionItem.PriceModifierAction', 'Price Modification'), array('Add' => _t('OptionItem.PriceAdd', "Add to Base Price ({price})", 'Add to price', array('price' => $parentPrice)), 'Subtract' => _t('OptionItem.PriceSubtract', "Subtract from Base Price ({price})", 'Subtract from price', array('price' => $parentPrice)), 'Set' => _t('OptionItem.PriceSet', 'Set as a new Price')))->setEmptyString('')->setDescription(_t('OptionItem.PriceDescription', 'Does price modify or replace base price?')), HeaderField::create('CodeHD', _t('OptionItem.CodeHD', 'Modify Code'), 3), TextField::create('CodeModifier')->setTitle(_t('OptionItem.CodeModifier', 'Code')), DropdownField::create('CodeModifierAction', _t('OptionItem.CodeModifierAction', 'Code Modification'), array('Add' => _t('OptionItem.CodeAdd', "Add to Base Code ({code})", 'Add to code', array('code' => $parentCode)), 'Subtract' => _t('OptionItem.CodeSubtract', 'Subtract from Base Code ({code})', 'Subtract from code', array('code' => $parentCode)), 'Set' => _t('OptionItem.CodeSet', 'Set as a new Code')))->setEmptyString('')->setDescription(_t('OptionItem.CodeDescription', 'Does code modify or replace base code?')))); /* // Cateogry Dropdown field w/ add new // removed until relevance determined $categories = function(){ return ProductCategory::get()->map()->toArray(); }; // to do - have OptionItem category override set ProductPage category if selected: issue #155 $categoryField = DropdownField::create('CategoryID', 'Category', $categories()) ->setEmptyString('') ->setDescription('Categories can be managed in <a href="admin/settings">Settings > FoxyStripe > Categories</a>'); if (class_exists('QuickAddNewExtension')) $categoryField->useAddNew('ProductCategory', $categories); $fields->insertAfter($categoryField, 'ProductOptionGroupID'); */ // allow CMS fields to be extended $this->extend('getCMSFields', $fields); return $fields; }
public function parseOrderDetails($orders, $transaction) { // remove previous OrderDetails so we don't end up with duplicates foreach ($transaction->Details() as $detail) { $detail->delete(); } foreach ($orders->transactions->transaction as $order) { // Associate ProductPages, Options, Quanity with Order foreach ($order->transaction_details->transaction_detail as $product) { $OrderDetail = OrderDetail::create(); // set Quantity $OrderDetail->Quantity = (int) $product->product_quantity; // set calculated price (after option modifiers) $OrderDetail->Price = (double) $product->product_price; // Find product via product_id custom variable foreach ($product->transaction_detail_options->transaction_detail_option as $productID) { if ($productID->product_option_name == 'product_id') { $OrderProduct = ProductPage::get()->filter('ID', (int) $productID->product_option_value)->First(); // if product could be found, then set Option Items if ($OrderProduct) { // set ProductID $OrderDetail->ProductID = $OrderProduct->ID; // loop through all Product Options foreach ($product->transaction_detail_options->transaction_detail_option as $option) { $OptionItem = OptionItem::get()->filter(array('ProductID' => (string) $OrderProduct->ID, 'Title' => (string) $option->product_option_value))->First(); if ($OptionItem) { $OrderDetail->Options()->add($OptionItem); // modify product price if ($priceMod = $option->price_mod) { $OrderDetail->Price += $priceMod; } } } } } // associate with this order $OrderDetail->OrderID = $transaction->ID; // extend OrderDetail parsing, allowing for recording custom fields from FoxyCart $this->extend('handleOrderItem', $decrypted, $product, $OrderDetail); // write $OrderDetail->write(); } } } }
public function onBeforeWrite() { parent::onBeforeWrite(); if (!$this->CategoryID) { $default = ProductCategory::get()->filter(array('Code' => 'DEFAULT'))->first(); $this->CategoryID = $default->ID; } //update many_many lists when multi-group is on if (SiteConfig::current_site_config()->MultiGroup) { $holders = $this->ProductHolders(); $product = ProductPage::get()->byID($this->ID); if (isset($product->ParentID)) { $origParent = $product->ParentID; } else { $origParent = null; } $currentParent = $this->ParentID; if ($origParent != $currentParent) { if ($holders->find('ID', $origParent)) { $holders->removeByID($origParent); } } $holders->add($currentParent); } $title = ltrim($this->Title); $title = rtrim($title); $this->Title = $title; }
/** * Products function. * * @access public * @return array */ public function ProductList($limit = 10) { $config = SiteConfig::current_site_config(); if ($config->ProductLimit > 0) { $limit = $config->ProductLimit; } if ($config->MultiGroup) { $entries = $this->Products()->sort('SortOrder'); } else { $filter = '"ParentID" = ' . $this->ID; // Build a list of all IDs for ProductGroups that are children $holderIDs = $this->ProductGroupIDs(); // If no ProductHolders, no ProductPages. So return false if ($holderIDs) { // Otherwise, do the actual query if ($filter) { $filter .= ' OR '; } $filter .= '"ParentID" IN (' . implode(',', $holderIDs) . ")"; } $order = '"SiteTree"."Title" ASC'; $entries = ProductPage::get()->where($filter); } $list = new PaginatedList($entries, Controller::curr()->request); $list->setPageLength($limit); return $list; }
/** * * */ protected function createProducts() { $this->alterationMessage("================================================ CREATING PRODUCTS ================================================", "show"); $productsCompleted = array(); foreach ($this->csv as $row) { if (!isset($productsCompleted[$row["ProductTitle"]])) { $filterArray = array("Title" => $row["ProductTitle"], "InternalItemID" => $row["ProductInternalItemID"]); $product = ProductPage::get()->filterAny($filterArray)->first(); if ($product && $product->ParentID) { $this->defaultProductParentID = $product->ParentID; } elseif (!$this->defaultProductParentID) { $this->defaultProductParentID = ProductGroup::get()->first()->ID; } if (!$product) { $product = ProductPage::create($filterArray); $product->MenuTitle = $row["ProductTitle"]; $this->alterationMessage("Creating Product: " . $row["ProductTitle"], "created"); } else { $this->alterationMessage("Product: " . $row["ProductTitle"] . " already exists"); } if (!$product->ParentID) { $product->ParentID = $this->defaultProductParentID; } $product->Title = $row["ProductTitle"]; $product->InternalItemID = $row["ProductInternalItemID"]; if ($this->forreal) { $this->addMoreProduct($product, $row); $product->write("Stage"); if ($product->IsPublished()) { $product->Publish('Stage', 'Live'); } } $productsCompleted[$row["ProductTitle"]] = $product->ID; $this->data[$product->ID] = array("Product" => $product, "VariationRows" => array()); } } $this->alterationMessage("================================================", "show"); }