- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我做了一个自定义的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();
}
}
protected function _prepareProduct(Varien_Object $buyRequest, $product, $processMode)
public function getSelectionsByIds($selectionIds, $product = null)
getItems()
提供了null。如果我删除
->addFilterByRequiredOptions()
getSelectionsByIds
,我可以从
getItems()
取回一些东西,但是它将崩溃
$_result = $selection->getTypeInstance(true)->prepareForCart($buyRequest, $selection);
最佳答案
开箱即用的建议,不需要如此复杂的解决方案。我们以magento的形式销售 bundle 套件,但我将它们设置为“简单产品”,而只是使用相关产品来分配任何类型的产品(在您的情况下,是其他 bundle 套件或任何其他类型的产品)。我们只需在产品页面上添加一个新块,即可根据需要显示相关产品,并为它提供套件内容的标题。当用户将商品添加到购物车时,它只是简单的产品。您也可以在购物车页面中添加一个块,以在购物车列表页面上该商品下方显示相关商品。从历史上看,我们在使用magento和 bundle 套件时遇到问题,有时人们无法在不删除并重新添加的情况下进行结帐,因此该解决方案可以完全解决问题,并为您提供所需的功能。虽然我们不使用管理员来管理产品或订单(所有操作都通过api和后台完成),但是可以将原则应用于管理员等中。
关于Magento: bundle 未添加到购物车,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16200699/
我们都在流行的网站上看到,购物车图标的右上角有一个小图标!我必须在我的 ASP .NET 网页中使用类似的东西。 如何让这个图标位于购物车图标的右上角.. 购物车的图标是一个普通的 bootstrap
Closed. This question does not meet Stack Overflow guidelines 。它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 Stack Ov
可以使用 REST 架构约束来实现购物车吗? 我想把我的问题集中在 session 状态上。在实现购物车的典型 MVC 应用程序中,很可能 session 对象将在 session 中管理,购物车作为
我的网上商店使用自己的模板,但在我的网站上我使用货币欧元而不是美元。哪里可以编辑啊。 http://i50.tinypic.com/67rvhc.png 最佳答案 进入系统>配置。 然后在“通用”>“
我想在我的门户中使用购物车。我可以获得 jquery 的购物车插件吗? 格纳尼亚尔·祖贝尔 最佳答案 http://simplecartjs.com/不是 JQuery,但如果 PayPal 或 Go
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我正在尝试将产品添加到我的购物车。 我收到一条错误消息: 警告:为 foreach() 提供的参数无效 它告诉我以下代码出现错误: function isInCart($id) { if (!empt
我目前正在使用 PHP 开发购物车,我正在尝试弄清楚如何使用我编写的代码将商品添加到购物车本身。我的数据库中的项目显示正确,但只有 $item 下的最后一个数组被添加到购物车。以下显示项目。 $res
在我的laravel购物车上,我创建了一个delete函数,使用json或dd函数进行测试时似乎还可以,但是尝试返回路线购物车 View Route [cart] not defined.时,这是一个
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
将相同的产品添加到购物车时,它正在添加新行,但如果相同的产品 ID 已在购物车中,则需要更新数量。 我需要它与数量更新保持一致。 最佳答案 您需要覆盖 app/code/core/Mage/Sales
你好, 我正在创建一个用于培训目的的 PHP 商店。我希望用户能够查看他最后下的订单 - 但我很难意识到这一点。 我的数据库中有这些表: 客户( child 、姓名、地址...) 产品(pid、pro
我正在考虑建立一个迷你购物网站。不涉及支付方式,只是显示和维护的所选产品的总数。这将由商店中的一个人操作以进行和监控销售。 概念是:产品应该在页面中显示为大图像,通过点击它们我将它们存储在购物车中。然
我有以下产品和购物车表格: //产品表 Products: id | Product_value ----------------------- 1 | Product
我尝试使用 php ang mysql 在 google 中搜索购物车中的代码。当我单击“添加到购物车”按钮时,我的 cart.php 中没有显示任何内容。请帮助我。 这是我的产品.php ">ADD
我正在为摄影业务创建 PHP 购物车。这是我尝试的第一个电子商务网站(新手) 我已成功将产品添加到购物车(存储在 session 中)(产品:打印品、 key 圈、磁铁等) 但是我还需要将 image
变量被添加到从另一个页面传递的 session 数组 此处为详细信息页面 string(4) "3911" [1]=> string(4) "5005" [2]=> NULL [3]=> strin
我的模型中设置了以下核心数据关系。 类别 -> 产品 -> 购物车产品 1)) { // handle error } else if (![cartProducts count]) {
我已经根据示例实现了jQuery的购物卡:http://jsfiddle.net/RR6z5/1/ 但是有一个小错误。当我将一个元素从产品拖到购物卡,然后无拖放,我从购物卡拖到产品时,产品中的原始元素
大家好,就 css 和 javascript 而言,我是个新手。我正在使用的新主题是让我的 paypal minicart 显示在内容下方,因此您不能单击它,也不能从中删除内容,但您可以看到购物车稍微
我是一名优秀的程序员,十分优秀!