2012-12-21 2 views
3

제한된 웹 사이트에 대한 제한없이 Magento의 history.phtml을 수정하여 모든 주문을 표시했습니다. 이것은 작동하지만 주문을 인쇄하거나 보려고 할 때 문제가 발생했습니다. 디버깅을했고 Magento의 _canViewOrder (Mage_Sales_Controller_Abstract에 위치)으로 문제가 발생합니다. 우리는 여기에 몇 가지 사용자 정의 개발이, 우리는 필요Magento Controller_Abstract 덮어 쓰기

if ($order->getId() && $order->getCustomerId() && ($order->getCustomerId() == $customerId) 
      && in_array($order->getState(), $availableStates, $strict = true) 

: 그 함수에서 추가 및 당연히 논리적 체크 캔보기에 로그온 한 사용자가/요청 순서를 인쇄하는 경우 확인하기 위해 구현 제한을 제거하려면이 메서드을 재정의하십시오. 불행히도 컨트롤러 클래스를 무시하는 방법을 찾을 수 없습니다.

라우터/컨트롤러를 재정의하는 방법을 알고 있지만이 컨트롤러는 컨트롤러 폴더에 있으며 추상 클래스입니다.

누구나 올바른 방향으로 나를 가리켜 주거나 샘플 config.xml을 제공하여이 클래스를 재정의 할 수 있습니까?

답변

3

나는 빠른 방법을 사용하기로 결정했습니다. 나는 Mage_Sales_OrderController을 무시했습니다

<?php 
require_once Mage::getModuleDir('controllers', 'Mage_Sales') . DS . 'OrderController.php'; 
class MyCompany_MyModule_OrderController extends Mage_Sales_OrderController 
{ 
    /** 
    * Check order view availability 
    * Overridden from Mage_Sales_Controller_Abstract to 
    * remove the customer restriction. We want to show all 
    * orders to all customers on any time. 
    * 
    * TODO: Maybe in the future add a customer group restriction 
    * 
    * @param Mage_Sales_Model_Order $order 
    * @return bool 
    */ 
    protected function _canViewOrder($order) 
    { 
     $availableStates = Mage::getSingleton('sales/order_config')->getVisibleOnFrontStates(); 
     if ($order->getId() && in_array($order->getState(), $availableStates, $strict = true)) { 
      return true; 
     } 

     return false; 
    } 
} 

을 내 config.xml에에서 내가 처음 내 컨트롤러를 사용하고 OrderController으로 백업을 사용하는 젠토을 말하고있다. 한 함수 만 재정의 했으므로 기존 코드는 모두 수정되지 않습니다.

<?xml version="1.0"?>  
... 

<frontend> 
... 
    <routers> 
... 
     <sales> 
      <args> 
       <modules> 
        <MyCompany_MyModule before="Mage_Sales_OrderController">MyCompany_MyModule_Sales</MyCompany_MyModule> 
       </modules> 
      </args> 
     </sales> 
    </routers> 
... 
</frontend> 
... 
2

app/code/local에 배치하여 모든 클래스를 재정의 할 수 있습니다. 클래스를로드 할 때 Magento는 먼저 로컬, 다음 커뮤니티, 코어를 찾습니다. 원하는 것을 얻으려면 파일을 app/code/local/Mage/Sales/Controller/Abstract.php으로 복사하고 수정하십시오.

그러나이 방법은 가능하면 업그레이드하지 마십시오. 업그레이드 할 때 다소 지저분해질 수 있습니다. 고려해야 할 한 가지 옵션은 Mage_Sales_Controller_Abstract을 확장하는 컨트롤러를 수정하고 _canViewOrder 메서드를 재정의하는 것입니다. 여기를 참조하십시오 : http://drupal.org/project/magento

+0

우선 : 귀하의 의견에 감사드립니다. 나는 그와 같은 전체 파일을 오버라이드 할 수 있지만, 그렇게하지 않는 것이 좋습니다. 우리는 항상 확장의 의미로 파일을 오버라이드합니다. 우리가 단지 하나의 메소드를 오버라이드하거나 단지 부모를 사용할 수있는 시간과 대부분의 시간을 오버라이드해야한다는 것, 그리고 그 후에 몇 가지 일을하는 것보다. 우리가 말한대로 컨트롤러 밑을 덮어 쓰려고하는데 최악의 IMO입니다. – JNDPNT

관련 문제