我想扩展一个magento核心类并覆盖其中的一个函数。 社区扩展使用相同的类并覆盖我的代码,但通常本地扩展会覆盖社区,或者我错了?
这是我的扩展程序在干净安装中正常工作:
应用程序的/ etc /模块/ NameSpace_OutOfStockLabel.xml
<?xml version="1.0"?>
<config>
<modules>
<NameSpace_OutOfStockLabel>
<active>true</active>
<codePool>local</codePool>
</NameSpace_OutOfStockLabel>
</modules>
</config>
应用程序/代码/本地/名称空间/ OutOfStockLabel的/ etc / config.xml中
<?xml version="1.0"?>
<config>
<modules>
<NameSpace_OutOfStockLabel>
<version>0.0.1</version>
</NameSpace_OutOfStockLabel>
</modules>
<global>
<blocks>
<catalog>
<rewrite>
<product_view_type_configurable>NameSpace_OutOfStockLabel_Block_Configurable</product_view_type_configurable>
</rewrite>
</catalog>
</blocks>
</global>
</config>
应用程序/代码/本地/名称空间/ OutOfStockLabel /砌块/ Configurable.php
<?php
class NameSpace_OutOfStockLabel_Block_Configurable extends Mage_Catalog_Block_Product_View_Type_Configurable
{
/**
* Get Allowed Products
*
* @return array
*/
public function getAllowProducts()
{
if (!$this->hasAllowProducts()) {
$products = array();
$skipSaleableCheck = Mage::helper('catalog/product')->getSkipSaleableCheck();
$allProducts = $this->getProduct()->getTypeInstance(true)
->getUsedProducts(null, $this->getProduct());
foreach ($allProducts as $product) {
//if ($product->isSaleable() || $skipSaleableCheck) {
$products[] = $product;
//}
}
$this->setAllowProducts($products);
}
return $this->getData('allow_products');
}
/**
* Composes configuration for js
*
* @return string
*/
public function getJsonConfig()
{
$attributes = array();
$options = array();
$store = $this->getCurrentStore();
$taxHelper = Mage::helper('tax');
$currentProduct = $this->getProduct();
$preconfiguredFlag = $currentProduct->hasPreconfiguredValues();
if ($preconfiguredFlag) {
$preconfiguredValues = $currentProduct->getPreconfiguredValues();
$defaultValues = array();
}
foreach ($this->getAllowProducts() as $product) {
$productId = $product->getId();
foreach ($this->getAllowAttributes() as $attribute) {
$productAttribute = $attribute->getProductAttribute();
$productAttributeId = $productAttribute->getId();
$attributeValue = $product->getData($productAttribute->getAttributeCode());
$options['quantity'][$product -> getAttributeText($productAttribute->getName())] = $product->getIsInStock();
if (!isset($options[$productAttributeId])) {
$options[$productAttributeId] = array();
}
if (!isset($options[$productAttributeId][$attributeValue])) {
$options[$productAttributeId][$attributeValue] = array();
}
$options[$productAttributeId][$attributeValue][] = $productId;
}
}
$this->_resPrices = array(
$this->_preparePrice($currentProduct->getFinalPrice())
);
foreach ($this->getAllowAttributes() as $attribute) {
$productAttribute = $attribute->getProductAttribute();
$attributeId = $productAttribute->getId();
$info = array(
'id' => $productAttribute->getId(),
'code' => $productAttribute->getAttributeCode(),
'label' => $attribute->getLabel(),
'options' => array()
);
$optionPrices = array();
$prices = $attribute->getPrices();
if (is_array($prices)) {
foreach ($prices as $value) {
if(!$this->_validateAttributeValue($attributeId, $value, $options)) {
continue;
}
$currentProduct->setConfigurablePrice(
$this->_preparePrice($value['pricing_value'], $value['is_percent'])
);
$currentProduct->setParentId(true);
Mage::dispatchEvent(
'catalog_product_type_configurable_price',
array('product' => $currentProduct)
);
$configurablePrice = $currentProduct->getConfigurablePrice();
if (isset($options[$attributeId][$value['value_index']])) {
$productsIndex = $options[$attributeId][$value['value_index']];
} else {
$productsIndex = array();
}
$info['options'][] = array(
'id' => $value['value_index'],
'label' => ($options['quantity'][$value['label']] <= 0) ? $value['label'] . ' (Out of Stock)' : $value['label'],
'price' => $configurablePrice,
'oldPrice' => $this->_prepareOldPrice($value['pricing_value'], $value['is_percent']),
'products' => $productsIndex,
'IsInStock' => $options['quantity'][$value['label']]
);
$optionPrices[] = $configurablePrice;
}
}
/**
* Prepare formated values for options choose
*/
foreach ($optionPrices as $optionPrice) {
foreach ($optionPrices as $additional) {
$this->_preparePrice(abs($additional-$optionPrice));
}
}
if($this->_validateAttributeInfo($info)) {
$attributes[$attributeId] = $info;
}
// Add attribute default value (if set)
if ($preconfiguredFlag) {
$configValue = $preconfiguredValues->getData('super_attribute/' . $attributeId);
if ($configValue) {
$defaultValues[$attributeId] = $configValue;
}
}
}
$taxCalculation = Mage::getSingleton('tax/calculation');
if (!$taxCalculation->getCustomer() && Mage::registry('current_customer')) {
$taxCalculation->setCustomer(Mage::registry('current_customer'));
}
$_request = $taxCalculation->getRateRequest(false, false, false);
$_request->setProductClassId($currentProduct->getTaxClassId());
$defaultTax = $taxCalculation->getRate($_request);
$_request = $taxCalculation->getRateRequest();
$_request->setProductClassId($currentProduct->getTaxClassId());
$currentTax = $taxCalculation->getRate($_request);
$taxConfig = array(
'includeTax' => $taxHelper->priceIncludesTax(),
'showIncludeTax' => $taxHelper->displayPriceIncludingTax(),
'showBothPrices' => $taxHelper->displayBothPrices(),
'defaultTax' => $defaultTax,
'currentTax' => $currentTax,
'inclTaxTitle' => Mage::helper('catalog')->__('Incl. Tax')
);
$config = array(
'attributes' => $attributes,
'template' => str_replace('%s', '#{price}', $store->getCurrentCurrency()->getOutputFormat()),
'basePrice' => $this->_registerJsPrice($this->_convertPrice($currentProduct->getFinalPrice())),
'oldPrice' => $this->_registerJsPrice($this->_convertPrice($currentProduct->getPrice())),
'productId' => $currentProduct->getId(),
'chooseText' => Mage::helper('catalog')->__('Choose an Option...'),
'taxConfig' => $taxConfig
);
if ($preconfiguredFlag && !empty($defaultValues)) {
$config['defaultValues'] = $defaultValues;
}
$config = array_merge($config, $this->_getAdditionalConfig());
return Mage::helper('core')->jsonEncode($config);
}
}
欢呼声, 阿德里安
答案 0 :(得分:2)
Magento中有一个模块配置,它将帮助解决冲突。您可以在Extension Y的模块/扩展等中使用此配置模块,您也可以在其中定义Extension Y的加载顺序。您需要能够在扩展X之后加载扩展Y.作为Magento电子商务网站开发人员,当您是能够做到这一点,你可以很好地解决冲突。将下面提到的代码写入扩展Y的app / etc / modules / extension_Y.xml中的depends模块配置:
有关详细信息,请查看ways-to-identify-and-resolve-magento-extension-conflicts