You are trying to define an invalid handler
and block
in checkout.xml
.
You are using a handler that magento do not understand. i e.
<checkout_onepage_pay />
What you have done here is you are used an invalid handler instead of actual handler <checkout_onepage_failure />
. Magento looks for this handler when onepage checkout fails. When magento enquires handler, its not present in your layout file. Hence it throws an error.
Also your block is also invalid (Most probly). i e
<block type="checkout/onepage_pay" name="checkout.pay" template="checkout/onepage/pay.phtml"/>
This block tells magento that, whenever a onepage checkout failure occurs (Assumes your handler is <checkout_onepage_failure />
), you have to look for a block Mage_Checkout/Block/Onepage/Pay.php
. Hence Magento fails to load this block type, since it is not defined. In default case the block that magento looking for will be Mage/Checkout/Block/Onepage/Failure.php
and it DOES exist.
From your question, its difficult to understand what you are looking for. There may be two cases
- You are trying to create a custom checkout onepage failure template
If that is the case you have to do this handler.
<checkout_onepage_failure translate="label">
<label>One Page Checkout Failure</label>
<reference name="root">
<action method="setTemplate"><template>page/2columns-right.phtml</template></action>
</reference>
<reference name="content">
<block type="checkout/onepage_failure" name="checkout.failure" template="path/to/your/custom/template.php"/>
</reference>
</checkout_onepage_failure>
You just need to alter the template
part of default block.
- You may trying to set a payment method page
If that is the case, then you need to use this handler
<checkout_onepage_paymentmethod>
<remove name="right"/>
<remove name="left"/>
<block type="checkout/onepage_payment_methods" name="root" output="toHtml" template="checkout/onepage/payment/methods.phtml">
<action method="setMethodFormTemplate"><method>purchaseorder</method><template>payment/form/purchaseorder.phtml</template></action>
</block>
</checkout_onepage_paymentmethod>
This code snippet is from app/design/frontend/base/default/layout/checkout.xml
. Make changes to content of this handler.
Note: Whatever be the reason, it is not a good practice to change the the files that resides in the location app/design/frontend/base/default
. Set a new package and theme and make changes to the directory app/design/frontend/<your_package>/<your_theme>/
David Tay answered to me via stackoverflow , thanks to him I fixed my issues, it was due to two mains reasons
- Developer inatention
- In the block where I wanted to add my block I was supposed to echo it
Link to the answer https://stackoverflow.com/a/30067067/613123
Copy / Paste of the answer below:
As b.enoit.be noted, you forgot the name attribute. Besides that, you also need to echo out your block. This is your update:
<checkout_onepage_index>
<reference name="checkout.onepage.payment" >
<block type="core/template" name="mymodule" template="mymodule/custom.phtml" />
</reference>
</checkout_onepage_index>
Your block is declared as a child of checkout.onepage.payment, which also has another child block (checkout.payment.methods) and this block is echoed out in the checkout.onepage.payment template (app/design/frontend/base/default/template/checkout/onepage/payment.phtml):
<form action="" id="co-payment-form">
<fieldset>
<?php echo $this->getChildHtml('methods') ?>
</fieldset>
</form>
What you need to do is echo out your block some where in the checkout.onepage.payment block's template, such as:
<?php echo $this->getChildHtml('mymodule') ?>
Best Answer
You need to add the block in the layout AND get it's content in the .phtml file using code
echo $this->getChildHtml('yourblock')
It's confusing, because magento has several types of blocks.
One is list type, like 'content' and it just outputs all children blocks.
And one is 'template', it outputs it's phtml template and requires from us to define a place in this template where we want to see the inner blocks.