tags:

views:

111

answers:

2

I am trying to add a new payment module into Magento. However, even after commenting out the vast majority of the code, I still get the following error:

Fatal error: Call to a member function isAvailable() on a non-object in /var/www/html/app/code/core/Mage/Payment/Helper/Data.php  on line 71

I am using Magento 1.4.0.1, and have disabled the cache. I even emptied the cache several times just in case.

The only code currently not commented out is based on the tutorials here and here.

The error occurs when the cart is loaded either from the administration area or the front end.

Is there anyone out there that has run into a similar issue? I would post code, but I am not sure what needs to be posted.

Thanks for the assistance.


Edit

app/etc/modules/CPAP_All.xml

<?xml version="1.0"?>
<config>
    <modules>
        <CPAP_AuthorizeCim>
            <active>true</active>
            <codePool>local</codePool>
        </CPAP_AuthorizeCim>
    </modules>
</config>

app/code/local/CPAP/AuthorizeCim/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <CPAP_AuthorizeCim>
            <version>0.1.0</version>
        </CPAP_AuthorizeCim>
    </modules>
    <global>
        <models>
            <authorizecim>
                <class>CPAP_AuthorizeCim_Model</class>
            </authorizecim>
        </models>
        <resources>
            <authorizecim_setup>
                <setup>
                    <module>CPAP_AuthorizeCim</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </authorizecim_setup>
            <authorizecim_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </authorizecim_write>
            <authorizecim_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </authorizecim_read>
        </resources>
    </global>
    <default>
        <payment>
            <authorizecim>
                <active>0</active>
                <model>authorizecim/paymentmethod</model>
                <order_status>pending</order_status>
                <cctypes>AE,VI,MC,DI</cctypes>
                <login backend_model="adminhtml/system_config_backend_encrypted"/>
                <trans_key backend_model="adminhtml/system_config_backend_encrypted"/>
                <payment_action>authorize</payment_action>
                <allowspecific>0</allowspecific>
            </authorizecim>
        </payment>
    </default>
</config>

app/code/local/CPAP/AuthorizeCim/Model/Paymentmethod.php

class CPAP_AuthorizeCim_Model_Authorizenet
{
}

If I comment out <model>authorizecim/paymentmethod</model> from the config.xml, then the error goes away, but my payment option will not display as an option in the cart.

+1  A: 

Looks like you've added to the config (probably in a module's config.xml file) to enable your new payment method. Magento is trying to load a class for your payment method, but because the class it wants doesn't exist, it is erroring out. Please provide the XML changes you've made and any new models you've defined as part of the module.

Thanks! Joe

Joseph Mastey
I added in the code you requested. Thank you for the response. Good name, btw.
Joseph
+2  A: 

(Semi-appologies in advance for the self links in this post, but I seem to be (at least for now) the unofficial Magento developer's guide)

This is the code that's causing you your problems (in the Data.php file mentioned above)

if (!$model = Mage::getStoreConfig($prefix . 'model', $store)) {
    // Mage::Log('could not get model for ' . $prefix);
    continue;
}

$methodInstance = Mage::getModel($model);
if (!$methodInstance->isAvailable($quote)) {
    // Mage::Log($model . ' is not avaiablable' );
    /* if the payment method can not be used at this time */
    continue;
}

Magento is seaching the system config for either a class name, or a URI style path to use in the call to getModel, which instantiates the model.

$methodInstance = Mage::getModel('authorizecim/paymentmethod');

So, your problem is that authorizecim/paymentmethod isn't resolving to a Magento classname like it's supposed to. (if you don't follow this try the (Class/URI lookup tab in the Commerce Bug demo).

So, authorizecim/paymentmethod is going to resolve to the classname

CPAP_AuthorizeCim_Model_Paymentmethod

authorizecim == look in config for this name in the <models /> section 
and use it's value as a basename (CPAP_AuthorizeCim_Model)

paymentmethod = append this with underscore word upper casing
(Paymentmethod) and append to above string to give us 
CPAP_AuthorizeCim_Model_Paymentmethod

So, Magento tells PHP to instantiate a "CPAP_AuthorizeCim_Model_Paymentmethod". However, this class isn's loaded into memory, so the __autoload takes over and loads the file at

CPAP/AuthorizeCim/Model/Paymentmethod.php

Which is your PHP file, which brings us to your problem. Your class is named

CPAP_AuthorizeCim_Model_Authorizenet

when it needs to be named

CPAP_AuthorizeCim_Model_Paymentmethod
Alan Storm
Thanks for the detailed answer and explanation. I actually have been through your site several times including you tutorial, and this one seems to have just slipped by me. Makes sense now. Thanks again.
Joseph
ok. I changed the class name as you recommended Alan, but the error was still occurring. I was able to remove the error by adding ` extends Mage_Payment_Model_Method_Abstract` to the class. Thanks for the assistance though.
Joseph