パート a) に関しては、コントローラーを上書きする必要がありますMage_Checkout_OnepageController
。これを行うには、独自のモジュールを作成し (これを行う方法を知っていると仮定します)、 app/code/local/YourModule/etc/config.xml に次の部分を含める必要があります。
<config>
...
<frontend>
<routers>
<checkout>
<args>
<modules>
<YourModule_Checkout before="Mage_Checkout">YourModule_Checkout</YourModule_Checkout>
</modules>
</args>
</checkout>
</routers>
</frontend>
</config>
次に、 app/code/local/YourModule/controllers/OnepageController.php で動作を上書きしたいので、[請求を保存] ボタンをクリックすると、常に配送ページが表示されます。
include_once("Mage/Checkout/controllers/OnepageController.php");
class YourModule_Checkout_OnepageController extends Mage_Checkout_OnepageController
{
public function saveBillingAction()
{
if ($this->_expireAjax()) {
return;
}
if ($this->getRequest()->isPost()) {
$data = $this->getRequest()->getPost('billing', array());
$customerAddressId = $this->getRequest()->getPost('billing_address_id', false);
if (isset($data['email'])) {
$data['email'] = trim($data['email']);
}
$result = $this->getOnepage()->saveBilling($data, $customerAddressId);
if (!isset($result['error'])) {
/* check quote for virtual */
if ($this->getOnepage()->getQuote()->isVirtual()) {
$result['goto_section'] = 'payment';
$result['update_section'] = array(
'name' => 'payment-method',
'html' => $this->_getPaymentMethodsHtml()
);
} else { // Removed elseif block here which usually skips over shipping if you selected to use the same address as in billing
$result['goto_section'] = 'shipping';
}
}
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
}
}
}
次に、パート b) には 2 つのオプションがあります。ご指摘のとおり、XML レイアウト システムを使用して shipping.phtml に別のテンプレートを設定します。
<checkout_onepage_index>
<reference name="checkout.onepage.shipping">
<action method="setTemplate">
<new>my_shipping.phtml</new>
</action>
</reference>
</checkout_onepage_index>
または、さらに簡単な方法として、カスタム デザイン フォルダーを使用して shipping.phtml テンプレートを上書きします。カスタム データを評価するために、モデルはメソッドMage_Checkout_Model_Type_Onepage
内のデータを処理します。そのsaveShipping()
ため、カスタム ロジックを実装するには、これが良いポイントになると思います。