Fatal Error bij het doorsturen naar iDeal

1
Veel van onze klanten krijgen bij het doorsturen naar iDeal een error, waardoor ze de bestelling niet kunnen afrekenen. Eerst dachten wij dat het alleen bij MacOS/ iOS gebeurde, maar zijn achter gekomen dat dit ook gewoon bij Windows het geval is. Nu denken sommige collega's dat het Ziggo ligt. Het gebeurt meestal bij de klanten met Ziggo. Persoonlijk denk ik dat het ergens anders aan ligt. Deze error is:
Fatal error: Call to a member function getMethodinstance() on a non-object in
/home/........./public_html/app/code/community/Appmerce/Internetkassa/Block/Placement.php on line 73
Er hebben al meerdere mensen naar dit probleem gekeken (ook Appmerce) en iedereen schuift het probleem naar een ander. En wij en onze klanten zijn hier nog steeds de dupe van.
Kan iemand ons helpen om dit probleem op te lossen?

Re: Fatal Error bij het doorsturen naar iDeal

2
In de function getMethodinstance() die wordt aangeroepen met variabele (1 of meer) zit er dus eentje die leeg is (NULL) of geen object is. Met een var_dump moet de programmeur kijken wat er met de variable is. En als hij inderdaad leeg is dan terug zoeken (eerder in programma) waar hij leeg gemaakt wordt of waarom hij niet gevuld wordt waar dat zou moeten gebeuren.
Het probleem is denk dat veel websites bouwers alleen modules in elkaar schuiven en niet goed weten wat er allemaal gebeurt. Als ze dan ook van verschillende bedrijven zijn dan wordt het probleem inderdaad naar de ander doorgeschoven. (Onze module werkt overal dus ligt het aan de ander...)

Re: Fatal Error bij het doorsturen naar iDeal

3
PaulG schreef:Het probleem is denk dat veel websites bouwers alleen modules in elkaar schuiven en niet goed weten wat er allemaal gebeurt. Als ze dan ook van verschillende bedrijven zijn dan wordt het probleem inderdaad naar de ander doorgeschoven. (Onze module werkt overal dus ligt het aan de ander...)
So true...

In dit geval is het gelukkig zo klaar als een klontje: de fout staat op regel 73 van het bestand Placement.php in de directory /Appmerce/Internetkassa/Block/. Dat is waarschijnlijk te wijten aan Appmerce...

Kun je dat PHP-bestand hier eens posten?
StoreCore.io

Re: Fatal Error bij het doorsturen naar iDeal

4
Bedankt voor je antwoord. Het probleem is dat Appmerce zegt dat het niet aan hun extensie ligt. Hieronder het php- bestand:
De error wordt aangegeven op de line 73 en 76.
Line 73 = */
Line 76 = return $this->_getOrder()->getPayment()->getMethodInstance()->getFormFields($this->_getOrder());

Code: Selecteer alles

class Appmerce_Internetkassa_Block_Placement extends Mage_Core_Block_Template
{
    public function __construct()
    {
    }

    /**
     * Return checkout session
     *
     * @return Mage_Checkout_Model_Session
     */
    public function getCheckout()
    {
        return Mage::getSingleton('checkout/session');
    }

    /**
     * Return payment API model
     *
     * @return Appmerce_Internetkassa_Model_Api_Hosted
     */
    protected function getApi()
    {
        return Mage::getSingleton('internetkassa/api');
    }

    /**
     * Return order instance by lastRealOrderId
     *
     * @return Mage_Sales_Model_Order
     */
    protected function _getOrder()
    {
        if ($this->getOrder()) {
			if ($this->getOrder()->getPayment()) {
				return $this->getOrder();
			} else {
				$orderIncrementId = $this->getCheckout()->getLastRealOrderId();
				return Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
			}
        } elseif ($orderIncrementId = $this->getCheckout()->getLastRealOrderId()) {
            return Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
        } else {
            return null;
        }
    }

    /**
     * Return placement form fields
     *
     * @return array
     */
    public function getFormData()
    {
        return $this->_getOrder()->getPayment()->getMethodInstance()->getFormFields($this->_getOrder());
    }

    /**
     * Return gateway path from admin settings
     *
     * @return string
     */
    public function getFormAction()
    {
        return $this->_getOrder()->getPayment()->getMethodInstance()->getGatewayUrl('redirect');
    }

}
Advertentie

Met Shopify maak je zelf je eigen webwinkel dankzij meer dan honderd thema’s en de complete appstore. Shopify sluit ook goed aan op dropshippers. De software is technisch volledig SEO-geoptimaliseerd en biedt alle sociale media-integraties. Meer info op Shopify.com.

Re: Fatal Error bij het doorsturen naar iDeal

6
Dit is het volledig php-bestand

Code: Selecteer alles

<?php
/**
 * Appmerce - Applications for Ecommerce
 * http://www.appmerce.com
 *
 * @extension   Internetkassa
 * @type        Payment method
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/osl-3.0.php
 *
 * @category    Magento
 * @package     Appmerce_Internetkassa
 * @copyright   Copyright (c) 2011-2014 Appmerce (http://www.appmerce.com)
 * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */

class Appmerce_Internetkassa_Block_Placement extends Mage_Core_Block_Template
{
    public function __construct()
    {
    }

    /**
     * Return checkout session
     *
     * @return Mage_Checkout_Model_Session
     */
    public function getCheckout()
    {
        return Mage::getSingleton('checkout/session');
    }

    /**
     * Return payment API model
     *
     * @return Appmerce_Internetkassa_Model_Api_Hosted
     */
    protected function getApi()
    {
        return Mage::getSingleton('internetkassa/api');
    }

    /**
     * Return order instance by lastRealOrderId
     *
     * @return Mage_Sales_Model_Order
     */
    protected function _getOrder()
    {
        if ($this->getOrder()) {
			if ($this->getOrder()->getPayment()) {
				return $this->getOrder();
			} else {
				$orderIncrementId = $this->getCheckout()->getLastRealOrderId();
				return Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
			}
        } elseif ($orderIncrementId = $this->getCheckout()->getLastRealOrderId()) {
            return Mage::getModel('sales/order')->loadByIncrementId($orderIncrementId);
        } else {
            return null;
        }
    }

    /**
     * Return placement form fields
     *
     * @return array
     */
    public function getFormData()
    {
        return $this->_getOrder()->getPayment()->getMethodInstance()->getFormFields($this->_getOrder());
    }

    /**
     * Return gateway path from admin settings
     *
     * @return string
     */
    public function getFormAction()
    {
        return $this->_getOrder()->getPayment()->getMethodInstance()->getGatewayUrl('redirect');
    }

}

Re: Fatal Error bij het doorsturen naar iDeal

7
Ja, daar was ik dus al bang voor...

Paul heeft gelijk: er zit een domme copy/paste beginnersfout in die plug-in.

Laat Appmerce die fout verhelpen: het is hun fout.

Komen ze er toch niet uit, dan kunnen ze me mailen, zodat we het eens kunnen worden over een redelijk uurtarief van een professionele webdeveloper.
StoreCore.io

Re: Fatal Error bij het doorsturen naar iDeal

8
Vandaag hebben wij een antwoord van Appmerce gekregen. Ze zeggen dat er geen fout zit in de extensie en dat er geen copy/ paste fout in zit, omdat het origineel werk is.
Het feit blijft dat (voornamelijk Ziggo klanten met iOS en MacOS) niet kunnen afrekenen en ze allemaal dezelfde foutmelding krijgen (zie boven).
Als de fout niet in de extensie van Appmerce zit, waar zou het dan wel kunnen zijn?

Re: Fatal Error bij het doorsturen naar iDeal

10
Hartstikke bedankt voor je antwoord, Ward. Respect hiervoor. Heb het artikel gelezen, maar heb helaas te weinig kennis om het goed te begrijpen.
Wat ik wel vreemd vind is dat de meeste klanten wel zonder problemen kunnen afrekenen en de anderen niet. Deze logica begrijp ik ook niet.
Het punt blijft dat ik nog steeds niet weet wat de oplossing is. Best frustrerend, want ik word overal van het kastje naar de muur gestuurd :(

Re: Fatal Error bij het doorsturen naar iDeal

11
Nou, vooruit dan, omdat ik in een goede bui ben.

Hoewel we niet aan symptoombestrijding mogen doen, moeten we beginnen bij de symptomen:
Midi schreef:Fatal error: Call to a member function getMethodinstance() on a non-object in
/home/........./public_html/app/code/community/Appmerce/Internetkassa/Block/Placement.php on line 76
De ellende begint op regel 76 in de app van Appmerce. Ze kunnen tien of honderd keer roepen van niet, maar het staat in de foutmelding: die noemt de boosdoener met naam en toenaam.

Het symptoom is de patiënt helaas meteen fataal: een fatal error legt het PHP-script plat en mag dus nooit voorkomen in productiecode — en al helemaal niet in apps voor betalingen. Twee beginnersfouten: geen foutafhandeling ingebouwd en onvoldoende getest.

Nu we weten aan welke fatale aandoening de patiënt is overleden, kunnen we eens verder zoeken.

Wat staat er op regel 76?

Code: Selecteer alles

        return $this->_getOrder()->getPayment()->getMethodInstance()->getFormFields($this->_getOrder());
Dat is een aanroep in de methode getFormData():

Code: Selecteer alles

    /**
     * Return placement form fields:
     *
     * @return array
     */
    public function getFormData()
    {
        return $this->_getOrder()->getPayment()->getMethodInstance()->getFormFields($this->_getOrder());
    }
Deze method chain begint met een aanroep van $this->_getOrder(). Met $this wordt naar het huidige object verwezen, dus verwachten we de methode _getOrder() in de code van deze class. Maar nee, daar komt de methode niet voor.

Dan moet de methode voorkomen in de parent class, de ouderklasse waarvan deze klasse is afgeleid. Eens kijken welke dat is:

Code: Selecteer alles

class Appmerce_Internetkassa_Block_Placement extends Mage_Core_Block_Template
{

}
Aha, de klasse Appmerce_Internetkassa_Block_Placement van Appmerce borduurt voort op Mage_Core_Block_Template van de Magento-core. Klinkt ook heel waarschijnlijk: een Block_Template is iets met een template voor een blok en /Block/Placement.php klinkt als iets dat met de plaatsing van dat blok samenhangt.

In de methode __construct(), de constructor, neem Appmerce echter een bijzondere bocht:

Code: Selecteer alles

class Appmerce_Internetkassa_Block_Placement extends Mage_Core_Block_Template
{
    public function __construct()
    {
    }
}
Daarmee wordt alle code van de constructor van Mage_Core_Block_Template tenietgedaan. Kan zijn dat Appmerce daarvoor een goede reden had, kan ook zijn dat de dienstdoende Appmercer vers van de Knutsel & Plak Academie is.

Ik zou hier minstens dit verwachten:

Code: Selecteer alles

class Appmerce_Internetkassa_Block_Placement extends Mage_Core_Block_Template
{
    public function __construct()
    {
        parent::__construct();
    }
}
Je kunt het ze allicht vragen...
StoreCore.io

Re: Fatal Error bij het doorsturen naar iDeal

13
Die heeft Ward zeker verdiend, maar Appmerce blijft bij hun standpunt. Ze willen er niet eens naar kijken. Blijkbaar zijn wij de enige met deze error en ligt het aan ons.
Er hebben al meerdere mensen naar deze error gekeken. Helaas blijft het bij kijken, omdat iedereen vindt dat Appmerce er iets aan moet doen.
Maar ja. Wij schieten er ook niks mee op....Heb minstens een gebak over voor degene die het oplost, :D