2011-07-10 14 views

Odpowiedz

24

config.xml:

<global> 
    <blocks> 
     <adminhtml> 
      <rewrite> 
       <sales_order_view>Namespace_Module_Block_Adminhtml_Sales_Order_View</sales_order_view> 
      </rewrite> 
     </adminhtml> 
    </blocks> 
</global> 

nazw/modułu/block/Adminhtml/Sprzedaż/Order/view.php:

class Namespace_Module_Block_Adminhtml_Sales_Order_View extends Mage_Adminhtml_Block_Sales_Order_View { 
    public function __construct() { 

     parent::__construct(); 

     $this->_addButton('button_id', array(
      'label'  => Mage::helper('xxx')->__('Some action'), 
      'onclick' => 'jsfunction(this.id)', 
      'class'  => 'go' 
     ), 0, 100, 'header', 'header'); 
    } 
} 
+3

przykładem dla metody "onclick" jest "confirmSetLocation (" {$ message} "," {$ this-> getOkToShipUrl()} ")", –

+0

potrzebne do wywołania parent :: __ construct(); w twojej niestandardowej funkcji __construct(), albo otrzymam wyjątek "Invalid block type". – James

+0

@ James, masz rację, dzięki. – silex

-2

Jeśli chcesz zrobić to szybko i-brudny (tj Edycja plików core), otwarte app/code/core/Mage/Adminhtml/Block/Sales/Order/View.php i dodać coś takiego:

$this->_addButton('order_reorder', array(
     'label'  => Mage::helper('sales')->__('Print Labels'), 
     'onclick' => 'window.open(\'/printouts/' . $this->getOrder()->getRealOrderId() . '.pdf\')', 
    )); 

można umieścić, że przed tym bloku:

if ($this->_isAllowedAction('emails') && !$order->isCanceled()) { 
     $message = Mage::helper('sales')->__('Are you sure you want to send order email to customer?'); 
     $this->addButton('send_notification', array(
      'label'  => Mage::helper('sales')->__('Send Email'), 
      'onclick' => "confirmSetLocation('{$message}', '{$this->getEmailUrl()}')", 
     )); 
    } 

Twoim wyzwaniem, jeśli zdecydujesz się zaakceptować, jest utworzenie pliku lokalnego, który jest przejęciem pliku podstawowego, i opublikowanie go tutaj!

+7

Najgorsza odpowiedź - nie modyfikuj podstawowych plików w żadnej sytuacji. Nigdy. Łatwo. Bez pośpiechu i brudu - zachowaj czyste kodowanie! –

2

W nawiązaniu do powyższych uwag o rodzic :: __ konstruktor, oto co zadziałało dla mnie:

class Name_Module_Block_Adminhtml_Sales_Order_View extends Mage_Adminhtml_Block_Sales_Order_View { 

    public function __construct() { 
     $this->_addButton('testbutton', array(
      'label'  => Mage::helper('Sales')->__('Toms Button'), 
      'onclick' => 'jsfunction(this.id)', 
      'class'  => 'go' 
     ), 0, 100, 'header', 'header'); 

     parent::__construct(); 

    } 
} 
+0

powinieneś zrobić coś w stylu $ return = parent :: __ construct(); na początku funkcji, rób swoje, a następnie zwróć $ return; na końcu. –

+1

@GabrielQueirozSilva Konstruktorzy nie mają wartości zwracanych. To jest poprawna odpowiedź. –

+0

@MatthiasKleine ops, nie zauważyłem, że to był konstruktor. –

36

Zamiast hacki rdzeniowych lub przepisuje, wystarczy użyć jednego obserwatora, aby dodać przycisk do zamówienia:

<adminhtml> 
    <events> 
     <adminhtml_widget_container_html_before> 
      <observers> 
       <your_module> 
        <class>your_module/observer</class> 
        <type>singleton</type> 
        <method>adminhtmlWidgetContainerHtmlBefore</method> 
       </your_module> 
      </observers> 
     </adminhtml_widget_container_html_before> 
    </events> 
</adminhtml> 

Następnie wystarczy sprawdzić w obserwatora czy typ bloku dopasowuje widok kolejności:

public function adminhtmlWidgetContainerHtmlBefore($event) 
{ 
    $block = $event->getBlock(); 

    if ($block instanceof Mage_Adminhtml_Block_Sales_Order_View) { 
     $message = Mage::helper('your_module')->__('Are you sure you want to do this?'); 
     $block->addButton('do_something_crazy', array(
      'label'  => Mage::helper('your_module')->__('Export Order'), 
      'onclick' => "confirmSetLocation('{$message}', '{$block->getUrl('*/yourmodule/crazy')}')", 
      'class'  => 'go' 
     )); 
    } 
} 

Funkcja "getUrl" bloku automatycznie doda bieżący identyfikator zamówienia do wywołania kontrolera.

+1

bez przepisywania klasy, bez zmiany pliku core - niesamowite rozwiązanie, mogę potwierdzić, że działa co najmniej w 1.8 – simonthesorcerer

+2

To jest DUŻO lepszej odpowiedzi. Odpowiedzi, które wymagają podklasy, aby zastąpić domyślne klasy Magento w ten sposób spowodują wiele problemów z konfliktami rozszerzeń i aktualizacjami niezgodności. Jeśli Magento ma metodę wykorzystującą Obserwatora, zwykle jest to podejście. –

Powiązane problemy