gpt4 book ai didi

Magento: bundle 未添加到购物车

转载 作者:行者123 更新时间:2023-12-04 04:41:38 25 4
gpt4 key购买 nike

我做了一个自定义的Magento扩展,该扩展允许 bundle 的产品类型与“父” bundle 产品关联。

例如,如果我销售计算机零件,并且创建了一堆简单的产品类型(例如,键盘,鼠标,显示器等),并且我创建了 bundle 产品,该 bundle 产品将键盘和鼠标 bundle 在一起,可以与Magento一起使用必须提供开箱即用的功能。如果我创建了另一个 bundle 产品类型,但是这次我想 bundle 刚制作的 bundle 产品(带有键盘和鼠标的 bundle 产品),则无法执行此操作。因此,我要做的是创建一个扩展,使我可以将 bundle 的商品与 bundle 的商品相关联。

我在“本地”和“本地”下创建了一个新扩展名(我称之为Company)。
app/code/local/Company/etc/config.xml

<?xml version="1.0"?>
<config>
<global>
<blocks>
<bundle>
<rewrite>
<adminhtml_catalog_product_edit_tab_bundle_option_search_grid>Company_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option_Search_Grid</adminhtml_catalog_product_edit_tab_bundle_option_search_grid>
<adminhtml_catalog_product_composite_fieldset_options_type_checkbox>Company_Bundle_Block_Adminhtml_Catalog_Product_Composite_Fieldset_Options_Type_Checkbox</adminhtml_catalog_product_composite_fieldset_options_type_checkbox>
<catalog_product_view_type_bundle_option_checkbox>Company_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Checkbox</catalog_product_view_type_bundle_option_checkbox>
</rewrite>
</bundle>
</blocks>
<models>
<bundle>
<rewrite>
<product_type>Company_Bundle_Model_Product_Type</product_type>
</rewrite>
</bundle>
<bundle_resource>
<rewrite>
<option_collection>Company_Bundle_Model_Resource_Option_Collection</option_collection>
</rewrite>
</bundle_resource>
</models>
<catalog>
<product>
<type>
<bundle translate="label" module="bundle">
<label>Bundle Product</label>
<model>bundle/product_type</model>
<composite>1</composite>
<allowed_selection_types>
<simple/>
<bundle/>
<virtual/>
</allowed_selection_types>
<price_model>bundle/product_price</price_model>
<index_data_retreiver>bundle/catalogIndex_data_bundle</index_data_retreiver>
<index_priority>40</index_priority>
<price_indexer>bundle/indexer_price</price_indexer>
<stock_indexer>bundle/indexer_stock</stock_indexer>
</bundle>
</type>
<options>
<bundle>
<types>
<select translate="label" module="bundle">
<label>Drop-down</label>
</select>
<radio translate="label" module="bundle">
<label>Radio Buttons</label>
</radio>
<checkbox translate="label" module="bundle">
<label>Checkbox</label>
</checkbox>
<multi translate="label" module="bundle">
<label>Multiple Select</label>
</multi>
</types>
</bundle>
</options>
</product>
</catalog>
</global>
</config>
app/code/local/Company/Bundle/Block/Adminhtml/Catalog/Product/Edit/Tab/Bundle/Option/Search/Grid.php
<?php

class Company_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option_Search_Grid extends Mage_Bundle_Block_Adminhtml_Catalog_Product_Edit_Tab_Bundle_Option_Search_Grid
{
protected function _prepareCollection()
{
$collection = Mage::getModel('catalog/product')->getCollection()
->setStore($this->getStore())
->addAttributeToSelect('name')
->addAttributeToSelect('sku')
->addAttributeToSelect('price')
->addAttributeToSelect('attribute_set_id')
->addAttributeToFilter('type_id', array('in' => $this->getAllowedSelectionTypes()))
//->addFilterByRequiredOptions() OVERRIDE!
->addStoreFilter();

if ($products = $this->_getProducts()) {
$collection->addIdFilter($this->_getProducts(), true);
}

if ($this->getFirstShow()) {
$collection->addIdFilter('-1');
$this->setEmptyText($this->__('Please enter search conditions to view products.'));
}

Mage::getSingleton('catalog/product_status')->addSaleableFilterToCollection($collection);

$this->setCollection($collection);

return Mage_Adminhtml_Block_Widget_Grid::_prepareCollection();
}

protected function _prepareColumns()
{
$this->addColumn('id', array(
'header' => Mage::helper('sales')->__('ID'),
'sortable' => true,
'width' => '60px',
'index' => 'entity_id'
));
$this->addColumn('name', array(
'header' => Mage::helper('sales')->__('Product Name'),
'index' => 'name',
'column_css_class'=> 'name'
));

$sets = Mage::getResourceModel('eav/entity_attribute_set_collection')
->setEntityTypeFilter(Mage::getModel('catalog/product')->getResource()->getTypeId())
->load()
->toOptionHash();

$this->addColumn('set_name',
array(
'header'=> Mage::helper('catalog')->__('Attrib. Set Name'),
'width' => '100px',
'index' => 'attribute_set_id',
'type' => 'options',
'options' => $sets,
));
$this->addColumn('type',
array(
'header'=> Mage::helper('catalog')->__('Type'),
'width' => '60px',
'index' => 'type_id',
'type' => 'options',
'options' => Mage::getSingleton('catalog/product_type')->getOptionArray(),
));

$this->addColumn('sku', array(
'header' => Mage::helper('sales')->__('SKU'),
'width' => '80px',
'index' => 'sku',
'column_css_class'=> 'sku'
));
$this->addColumn('price', array(
'header' => Mage::helper('sales')->__('Price'),
'align' => 'center',
'type' => 'currency',
'currency_code' => $this->getStore()->getCurrentCurrencyCode(),
'rate' => $this->getStore()->getBaseCurrency()->getRate($this->getStore()->getCurrentCurrencyCode()),
'index' => 'price'
));

$this->addColumn('is_selected', array(
'header_css_class' => 'a-center',
'type' => 'checkbox',
'name' => 'in_selected',
'align' => 'center',
'values' => $this->_getSelectedProducts(),
'index' => 'entity_id',
));

$this->addColumn('qty', array(
'filter' => false,
'sortable' => false,
'header' => Mage::helper('sales')->__('Qty to Add'),
'name' => 'qty',
'inline_css'=> 'qty',
'align' => 'right',
'type' => 'input',
'validate_class' => 'validate-number',
'index' => 'qty',
'width' => '130px',
));

return Mage_Adminhtml_Block_Widget_Grid::_prepareColumns();
}
}
app/code/local/Company/Bundle/Block/Adminhtml/Catalog/Product/Composite/Fieldset/Options/Type/Checkbox.php
<?php


class Company_Bundle_Block_Adminhtml_Catalog_Product_Composite_Fieldset_Options_Type_Checkbox
extends Mage_Bundle_Block_Adminhtml_Catalog_Product_Composite_Fieldset_Options_Type_Checkbox
{
/**
* Set template
*
* @return void
*/
protected function _construct()
{
$this->setTemplate('Company/bundle/list.phtml');
}

/**
* @param string $elementId
* @param string $containerId
* @return string
*/
public function setValidationContainer($elementId, $containerId)
{
return '<script type="text/javascript">
$(\'' . $elementId . '\').advaiceContainer = \'' . $containerId . '\';
</script>';
}
}
app/code/local/Company/Bundle/Block/Catalog/Product/View/Type/Bundle/Option/Checkbox.php
<?php

class Company_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Checkbox
extends Mage_Bundle_Block_Catalog_Product_View_Type_Bundle_Option_Checkbox
{
/**
* Set template
*
* @return void
*/
protected function _construct()
{
$this->setTemplate('bundle/catalog/product/view/type/bundle/option/list.phtml');
}
}
app/code/local/Company/Bundle/Model/Product/Type.php
    <?php
class Company_Bundle_Model_Product_Type extends Mage_Bundle_Model_Product_Type
{
/**
* Checking if we can sale this bundle
*
* @param Mage_Catalog_Model_Product $product
* @return bool
*/
public function isSalable($product = null)
{
$salable = Mage_Catalog_Model_Product_Type_Abstract::isSalable($product);
if (!is_null($salable)) {
return true; /* OVERRIDE! */
}

$optionCollection = $this->getOptionsCollection($product);

if (!count($optionCollection->getItems())) {
return false;
}

$requiredOptionIds = array();

foreach ($optionCollection->getItems() as $option) {
if ($option->getRequired()) {
$requiredOptionIds[$option->getId()] = 0;
}
}

$selectionCollection = $this->getSelectionsCollection($optionCollection->getAllIds(), $product);

if (!count($selectionCollection->getItems())) {
return false;
}
$salableSelectionCount = 0;
foreach ($selectionCollection as $selection) {
if ($selection->isSalable()) {
$requiredOptionIds[$selection->getOptionId()] = 1;
$salableSelectionCount++;
}

}

return (array_sum($requiredOptionIds) == count($requiredOptionIds) && $salableSelectionCount);
}

/**
* Retrive bundle selections collection based on used options
*
* @param array $optionIds
* @param Mage_Catalog_Model_Product $product
* @return Mage_Bundle_Model_Mysql4_Selection_Collection
*/
public function getSelectionsCollection($optionIds, $product = null)
{
$keyOptionIds = (is_array($optionIds) ? implode('_', $optionIds) : '');
$key = $this->_keySelectionsCollection . $keyOptionIds;
if (!$this->getProduct($product)->hasData($key)) {
$storeId = $this->getProduct($product)->getStoreId();
$selectionsCollection = Mage::getResourceModel('bundle/selection_collection')
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addAttributeToSelect('tax_class_id') //used for calculation item taxes in Bundle with Dynamic Price
->setFlag('require_stock_items', true)
->setFlag('product_children', true)
->setPositionOrder()
->addStoreFilter($this->getStoreFilter($product))
->setStoreId($storeId);
//->addFilterByRequiredOptions() OVERRIDE!
//->setOptionIdsFilter($optionIds) OVERRIDE!
if (!Mage::helper('catalog')->isPriceGlobal() && $storeId) {
$websiteId = Mage::app()->getStore($storeId)->getWebsiteId();
$selectionsCollection->joinPrices($websiteId);
}

$this->getProduct($product)->setData($key, $selectionsCollection);
}
return $this->getProduct($product)->getData($key);
}


/**
* Prepare product and its configuration to be added to some products list.
* Perform standard preparation process and then prepare of bundle selections options.
*
* @param Varien_Object $buyRequest
* @param Mage_Catalog_Model_Product $product
* @param string $processMode
* @return array|string
*/
protected function _prepareProduct(Varien_Object $buyRequest, $product, $processMode)
{
$result = Mage_Catalog_Model_Product_Type_Abstract::_prepareProduct($buyRequest, $product, $processMode);

if (is_string($result)) {
return $result;
}

$selections = array();
$product = $this->getProduct($product);
$isStrictProcessMode = $this->_isStrictProcessMode($processMode);

$skipSaleableCheck = Mage::helper('catalog/product')->getSkipSaleableCheck();
$_appendAllSelections = (bool)$product->getSkipCheckRequiredOption() || $skipSaleableCheck;

$options = $buyRequest->getBundleOption();

if (is_array($options)) {
$options = array_filter($options, 'intval');
$qtys = $buyRequest->getBundleOptionQty();
foreach ($options as $_optionId => $_selections) {
if (empty($_selections)) {
unset($options[$_optionId]);
}
}
$optionIds = array_keys($options);

if (empty($optionIds) && $isStrictProcessMode) {
return Mage::helper('bundle')->__('Please select options for product.');
}

$product->getTypeInstance(true)->setStoreFilter($product->getStoreId(), $product);
$optionsCollection = $this->getOptionsCollection($product);
$selectionIds = array();

foreach ($options as $optionId => $selectionId) {
if (!is_array($selectionId)) {
if ($selectionId != '') {
$selectionIds[] = (int)$selectionId;
}
} else {
foreach ($selectionId as $id) {
if ($id != '') {
$selectionIds[] = (int)$id;
}
}
}
}
// If product has not been configured yet then $selections array should be empty
if (!empty($selectionIds)) {
$selections = $this->getSelectionsByIds($selectionIds, $product);

// Check if added selections are still on sale
foreach ($selections->getItems() as $key => $selection) {
if (!$selection->isSalable() && !$skipSaleableCheck) {
$_option = $optionsCollection->getItemById($selection->getOptionId());
if (is_array($options[$_option->getId()]) && count($options[$_option->getId()]) > 1) {
$moreSelections = true;
} else {
$moreSelections = false;
}
if ($_option->getRequired()
&& (!$_option->isMultiSelection() || ($_option->isMultiSelection() && !$moreSelections))
) {
return Mage::helper('bundle')->__('Selected required options are not available.');
}
}
}

$optionsCollection->appendSelections($selections, false, $_appendAllSelections);

$selections = $selections->getItems();
} else {
$selections = array();
}
} else {
$product->setOptionsValidationFail(true);
$product->getTypeInstance(true)->setStoreFilter($product->getStoreId(), $product);

$optionCollection = $product->getTypeInstance(true)->getOptionsCollection($product);

$optionIds = $product->getTypeInstance(true)->getOptionsIds($product);
$selectionIds = array();

$selectionCollection = $product->getTypeInstance(true)
->getSelectionsCollection(
$optionIds,
$product
);

$options = $optionCollection->appendSelections($selectionCollection, false, $_appendAllSelections);

foreach ($options as $option) {
if ($option->getRequired() && count($option->getSelections()) == 1) {
$selections = array_merge($selections, $option->getSelections());
} else {
$selections = array();
break;
}
}
}
if (count($selections) > 0 || !$isStrictProcessMode) {
$uniqueKey = array($product->getId());
$selectionIds = array();

// Shuffle selection array by option position
usort($selections, array($this, 'shakeSelections'));

foreach ($selections as $selection) {
if ($selection->getSelectionCanChangeQty() && isset($qtys[$selection->getOptionId()])) {
$qty = (float)$qtys[$selection->getOptionId()] > 0 ? $qtys[$selection->getOptionId()] : 1;
} else {
$qty = (float)$selection->getSelectionQty() ? $selection->getSelectionQty() : 1;
}
$qty = (float)$qty;

$product->addCustomOption('selection_qty_' . $selection->getSelectionId(), $qty, $selection);
$selection->addCustomOption('selection_id', $selection->getSelectionId());

$beforeQty = 0;
$customOption = $product->getCustomOption('product_qty_' . $selection->getId());
if ($customOption) {
$beforeQty = (float)$customOption->getValue();
}
$product->addCustomOption('product_qty_' . $selection->getId(), $qty + $beforeQty, $selection);

/*
* Create extra attributes that will be converted to product options in order item
* for selection (not for all bundle)
*/
$price = $product->getPriceModel()->getSelectionFinalTotalPrice($product, $selection, 0, $qty);
$attributes = array(
'price' => Mage::app()->getStore()->convertPrice($price),
'qty' => $qty,
'option_label' => $selection->getOption()->getTitle(),
'option_id' => $selection->getOption()->getId()
);

$_result = $selection->getTypeInstance(true)->prepareForCart($buyRequest, $selection);
if (is_string($_result) && !is_array($_result)) {
return $_result;
}

if (!isset($_result[0])) {
return Mage::helper('checkout')->__('Cannot add item to the shopping cart.');
}

$result[] = $_result[0]->setParentProductId($product->getId())
->addCustomOption('bundle_option_ids', serialize(array_map('intval', $optionIds)))
->addCustomOption('bundle_selection_attributes', serialize($attributes));

if ($isStrictProcessMode) {
$_result[0]->setCartQty($qty);
}

$selectionIds[] = $_result[0]->getSelectionId();
$uniqueKey[] = $_result[0]->getSelectionId();
$uniqueKey[] = $qty;
}

// "unique" key for bundle selection and add it to selections and bundle for selections
$uniqueKey = implode('_', $uniqueKey);
foreach ($result as $item) {
$item->addCustomOption('bundle_identity', $uniqueKey);
}
$product->addCustomOption('bundle_option_ids', serialize(array_map('intval', $optionIds)));
$product->addCustomOption('bundle_selection_ids', serialize($selectionIds));

return $result;
}

return $this->getSpecifyOptionMessage();
}



/**
* Retrieve message for specify option(s)
*
* @return string
*/
public function getSpecifyOptionMessage()
{
return Mage::helper('bundle')->__('Please specify product option(s).');
}

}
app/code/local/Company/Bundle/Model/Resource/Option/Collection.php
<?php

class Company_Bundle_Model_Resource_Option_Collection extends Mage_Bundle_Model_Resource_Option_Collection
{
/**
* Append selection to options
* stripBefore - indicates to reload
* appendAll - indicates do we need to filter by saleable and required custom options
*
* @param Mage_Bundle_Model_Resource_Selection_Collection $selectionsCollection
* @param bool $stripBefore
* @param bool $appendAll
* @return array
*/
public function appendSelections($selectionsCollection, $stripBefore = false, $appendAll = true)
{
if ($stripBefore) {
$this->_stripSelections();
}

if (!$this->_selectionsAppended) {
foreach ($selectionsCollection->getItems() as $key => $_selection) {
if ($_option = $this->getItemById($_selection->getOptionId())) {
$_selection->setOption($_option);
$_option->addSelection($_selection);
}
}
$this->_selectionsAppended = true;
}

return $this->getItems();
}
}

这应该是一切。有对LIST.phtml的引用,但是您可以根据需要将其更改为复选框。但是,如果您在 bundle 中添加 bundle -它会起作用,直到我将其添加到购物车中为止。我将如何解决此问题的任何帮助将不胜感激?

更新:
因此,我能够找到为什么不能在购物车中添加“父级” bundle 产品的原因,
protected function _prepareProduct(Varien_Object $buyRequest, $product, $processMode)

它位于Type.php下,我发现问题可能与
public function getSelectionsByIds($selectionIds, $product = null)

因为它没有返回“选择”(与具有SIMPLE产品类型的 bundle 产品相比,没有返回“选择”(不是null但没有选择)),并且因为它给 getItems()提供了null。如果我删除
->addFilterByRequiredOptions()

从函数 getSelectionsByIds,我可以从 getItems()取回一些东西,但是它将崩溃
$_result = $selection->getTypeInstance(true)->prepareForCart($buyRequest, $selection);


请帮忙!我只需要某种方式就可以将此“父级” bundle 商品添加到我的购物车中,就像常规 bundle 商品一样。感谢您的时间!!

最佳答案

开箱即用的建议,不需要如此复杂的解决方案。我们以magento的形式销售 bundle 套件,但我将它们设置为“简单产品”,而只是使用相关产品来分配任何类型的产品(在您的情况下,是其他 bundle 套件或任何其他类型的产品)。我们只需在产品页面上添加一个新块,即可根据需要显示相关产品,并为它提供套件内容的标题。当用户将商品添加到购物车时,它只是简单的产品。您也可以在购物车页面中添加一个块,以在购物车列表页面上该商品下方显示相关商品。从历史上看,我们在使用magento和 bundle 套件时遇到问题,有时人们无法在不删除并重新添加的情况下进行结帐,因此该解决方案可以完全解决问题,并为您提供所需的功能。虽然我们不使用管理员来管理产品或订单(所有操作都通过api和后台完成),但是可以将原则应用于管理员等中。

关于Magento: bundle 未添加到购物车,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16200699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com