Nou, vooruit dan, omdat ik in een goede bui ben.
Hoewel we niet aan symptoombestrijding mogen doen, moeten we beginnen bij de symptomen:
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?
return $this->_getOrder()->getPayment()->getMethodInstance()->getFormFields($this->_getOrder());
Dat is een aanroep in de methode
getFormData():
/**
* 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:
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:
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:
class Appmerce_Internetkassa_Block_Placement extends Mage_Core_Block_Template
{
public function __construct()
{
parent::__construct();
}
}
Je kunt het ze allicht vragen...