0

Magento チェックアウトで問題が発生しました。Billsafe Payment プラグインを統合すると、チェックアウト プロセスで次のエラーが表示されます。

HTTP-Error 500 (Internal Server Error):

エラーログには次のように書かれています:

mod_fcgid: stderr: PHP 致命的なエラー: /var/www/vhosts/domain.com/httpdocs/app/code/community/AwHh/PaymentFee/Helper/Data.php の非オブジェクトに対するメンバー関数 setName() の呼び出し

何か案は?

Data.php のコード:

/**
 * Check if the extension is active
 * 
 * @return boolean
 */
public function isEnabled()
{
    return (bool)Mage::getStoreConfig('payment_services/paymentfee/active');
}

/**
 * Check if minimum fee amount, maximum fee amount or percentage rate is given
 * @return boolean
 */
public function hasFeeValues()
{
    $min = (bool)max(0, Mage::getStoreConfig('payment_services/paymentfee/min_fee_amount'));
    $max = (bool)Mage::getStoreConfig('payment_services/paymentfee/max_fee_amount');
    $rate = (bool)Mage::getStoreConfig('payment_services/paymentfee/relative_fee');
    return ($min || $max || $rate);
}

public function getFeeProductSku()
{
    return Mage::getStoreConfig('payment_services/paymentfee/sku');
}

/**
 * if item represents fee product
 *
 * @param Mage_Catalog_Model_Product|Mage_Sales_Model_Item $product
 * @return boolean
 */
public function isFeeProduct($product)
{
    return ($product->getSku() == $this->getFeeProductSku());
}

public function setFeeProduct($feeProduct)
{
    $this->feeProduct = $feeProduct;
}

public function getFeeProduct()
{
    if (is_null($this->feeProduct)) {
        $this->feeProduct = Mage::getModel('catalog/product')->loadByAttribute('sku', $this->getFeeProductSku());
    }

    return $this->feeProduct;
}

public function hasFeeProduct()
{
    $feeProduct = $this->getFeeProduct();
    return ($feeProduct && 0 < $feeProduct->getId());
}

/**
 * Obtain the fee that is set for the current payment method
 * @return float
 */
public function getPaymentFee()
{
    if (!$this->isEnabled()) {
        return 0;
    }

    if (!Mage::getModel('checkout/cart')->getQuote()->getPayment()->hasMethodInstance()) {
        return 0;
    }

    // get the currently set payment method
    $payment_model = Mage::getModel('checkout/cart')->getQuote()->getPayment()->getMethodInstance();

    // check which methods are enabled for payment fee via backend
    $enabled_methods = explode(',', Mage::getStoreConfig('payment_services/paymentfee/payment_methods'));

    if (!$payment_model || !in_array($payment_model->getCode(), $enabled_methods)) {
        return 0;
    }

    // return fee if
    // (1) a payment method has been selected by the customer
    // (2) the selected payment method is enabled for payment fee via backend
    // (3) the payment method has a fee
    return (float)$payment_model->getFee();
}

/**
 * get quote item representing fee
 * 
 * @return Mage_Sales_Model_Quote_Item
 */
protected function getFeeQuoteItem()
{
    foreach (Mage::getSingleton('checkout/session')->getQuote()->getItemsCollection() as $item) {
        if ($this->isFeeProduct($item->getProduct())) {
            return $item;
        }
    }
}

/**
 * Computed amount of payment fee based on backend configuration
 * and grand total and attach it to fee product.
 */
public function getUpdatedFeeProduct($product=null, $grandTotal=null)
{
    if (!$product) {
        $product = $this->getFeeProduct();
    }
    $product->setName($product->getResource()->getAttributeRawValue($product->getId(), 'name', Mage::app()->getStore()->getId()));
    if (!$grandTotal) {
        $quote      = Mage::getSingleton('checkout/session')->getQuote();
        $grandTotal = $quote->getGrandTotal();
        $feeAmount  = 0;
        foreach ($quote->getItemsCollection() as $quoteItem) {
            if ($this->isFeeProduct($quoteItem->getProduct())) {
                $feeAmount = $quoteItem->getBaseRowTotalInclTax();
                continue;
            }
        }
        $grandTotal -= $feeAmount;
    }
    $min = max(0, Mage::getStoreConfig('payment_services/paymentfee/min_fee_amount'));
    $max = Mage::getStoreConfig('payment_services/paymentfee/max_fee_amount');

    $rate = Mage::getStoreConfig('payment_services/paymentfee/relative_fee');
    //$product->setName($this->__('Payment fee'));
    if ($this->getFeeQuoteItem()) {
        $product->setTaxPercent($this->getFeeQuoteItem()->getTaxPercent());
    }

    // first, set payment fee to the price configured in backend
    $price = $max;

    // If set to zero, do not limit the final fee
    if (!$max) {
        $max = INF;
    }

    $product->setCheckoutDescription($this->formatPrice($price))
        ->setExceedsMaxAmount(false)
        ->setExceedsMinAmount(false);

    // calculate relative fee if given in backend
    if ($rate) {
        $price = $grandTotal * $rate / 100;

        if ($max < $price) {
            // calculated relative fee exceeds maximum charge 
            // -> use maximum charge
            $product->setCheckoutDescription($this->formatPrice($max));
            $product->setExceedsMaxAmount(true);
            $price = $max;
        } elseif ($price < $min) {
            // calculated relative fee is below minimum charge 
            // -> use minimum charge
            $product->setCheckoutDescription($this->formatPrice($min));
            $product->setExceedsMinAmount(true);
            $price = $min;
        } else {
            // calculated relative fee is between minimum and maximum charge
            // -> use calculated relative fee
            $msg = '%s (%s%% of Total %s)';
            $product->setCheckoutDescription($this->__(
                $msg,
                $this->formatPrice($price),
                $rate,
                $this->formatPrice($grandTotal)
            ));
            $msg = '%s %s (%s%% of Total %s)';
            $product->setName($this->__(
                $msg,
                $product->getName(),
                strip_tags($this->formatPrice($price)),
                $rate,
                strip_tags($this->formatPrice($grandTotal))
            ));
        }
    }
    $product->setPriceInclTax($price)
        ->setPrice($price)
        ->setFinalPrice($price);

    // Make sure fee product is "in stock"
    $stockItem = Mage::getModel('cataloginventory/stock_item');
    $stockItem->assignProduct($product);
    $stockItem->setIsInStock(1);
    $stockItem->setManageStock(1);
    $stockItem->setQty(10000);
    $stockItem->save();

    return $product;
}

public function removeFeeFromQuote(Mage_Sales_Model_Quote $quote)
{
    foreach ($quote->getItemsCollection() as $quoteItem) {
        if ($this->isFeeProduct($quoteItem->getProduct())) {
            $quote->removeItem($quoteItem->getId());
        }
    }
}

}

4

3 に答える 3

1

私も同じ問題を抱えていました。解決策: 仮想記事を追加していない可能性があります。

管理エリアに移動し、カタログを選択 -> 記事を管理 新しいものを追加し、仮想記事を選択してそれに名前を付け、そのアクティブで表示されないように SKU を何かに設定してコピーします。後で必要になります。価格をゼロに設定し、在庫を少なくとも 1 に設定します。より高い在庫を与えるか、1 つだけを与えるかを選択して、在庫管理をオンにすることができます。保存後、system->configuration->paymenttypes に移動し、コピーした SKU をフィールドに貼り付ける必要があります。

結局、キャッシュをクリアする必要があり、そこに行きます:)

于 2013-03-31T14:38:24.470 に答える
0

または、構成 (システム->構成->支払い) でBillsafe を無効にすることもできます(Active: no に設定)。

于 2014-05-11T18:59:19.597 に答える
0

ヘルパー クラス extends extends Mage_Core_Helper_Abstract..

classMage_Catalog_Helper_Data は varien_object を拡張しないため、getName()関数はこのエラーを生成します。

ヘルパー クラス オブジェクトから getname を呼び出す代わりに。

を使用 $model = getmodel('whatever')し、そこから呼び出します $model->getName()

于 2013-03-21T05:25:06.887 に答える