2013-01-21 36 views
12

ich mehrere Beiträge über StapelüberlaufMagento - außer Kraft setzen adminhtml Vorlagendatei

und ein paar Threads auf dem magento Forum

jedoch keine dieser Stellen versuchen, zu tun, was ich

Ich möchte außer Kraft zu setzen, die

app/design/adminhtml/default/default/template/widget/grid.phtml 

Datei, da diese Datei einen Teil von HTML enthält, die jemand zu tun versuche erlaubt Export aus der Verkaufs-> Auftragsansicht.

Anmerkung: Wir haben alle Exportoptionen für diese Benutzerrolle in der permissions-> Rolle Ansicht deaktiviert

Der Code, der die „Export nach:“ zeigt -> „CSV/Excel XML“ Funktion ist im Preis enthalten in dem Pfad, den ich oben aufgeführt habe. Ich möchte diesen Teil von HTML entfernen und überschreibe die Datei, die mit Magento eingeschlossen ist.

+1

Ich würde versuchen, eine lokale.xml - oder besser eine neue layout.xml zu Ihrer Erweiterung hinzufügen und ändern Sie die Vorlage, und entfernen Sie die Export-Dinge. Danach müssen Sie einen Beobachter implementieren, der auf 'controller_action_predispatch_adminhtml_sales_order_export_excel' und' controller_action_predispatch_adminhtml_sales_order_export_csv' hört, was diese Aktionen verhindert, wenn die admin_user_group falsch ist –

Antwort

23

Adminhtml verwendet die gleiche Thematisierung Rückfall als Frontend, deshalb brauchen Sie nur ein eigenes Template Thema zu erklären für die Installation in Modul Config XML:

<stores> 
    <admin> 
     <design> 
      <theme> 
       <template>custom</template> 
      </theme> 
     </design> 
    </admin> 
</stores> 

Dann können Sie app/design/adminhtml/default/custom/template/Widget/grid.phtml mit irgendwelchen Anpassungen erstellen Sie mögen, und diese Datei verwendet werden, die Präferenz zu der aus dem Standard/Standard adminhtml Thema. Ihre Lösung dann wäre eine ACL-Prüfung in der Logik hinzuzufügen, die die Exportkontrolle macht:

<?php if($this->getExportTypes() && {ACL LOGIC}}): ?> 
    <td class="export a-right"> 
     <img src="<?php echo $this->getSkinUrl('images/icon_export.gif') ?>" alt="" class="v-middle"/>&nbsp; <?php echo $this->__('Export to:') ?> 
     <select name="<?php echo $this->getId() ?>_export" id="<?php echo $this->getId() ?>_export" style="width:8em;"> 
     <?php foreach ($this->getExportTypes() as $_type): ?> 
      <option value="<?php echo $_type->getUrl() ?>"><?php echo $_type->getLabel() ?></option> 
     <?php endforeach; ?> 
     </select> 
     <?php echo $this->getExportButtonHtml() ?> 
    </td> 
<?php endif; ?> 

Während diese Logik mehr in geeigneter Weise in dem Block Klasse implementiert werden können, die Klasse Rewrite-System unterzubringen nicht von übergeordneten Klassen Umschreiben Sie können jede Unterklasse neu schreiben. In diesem Fall überwiegt das Einhalten von DRY die Einbettung von zu viel Logik in Templates. Außerdem ist die Änderung offensichtlich und leicht aufrechtzuerhalten.

Idealerweise hätte das Kernteam diese Prüfung in der Klasse implementiert oder zumindest einen öffentlichen Setter für die Eigenschaft _exportTypes bereitgestellt, wodurch diese Logik ein wenig sauberer zu implementieren wäre.

+0

Ich bevorzuge das – ivantedja

+0

Ist es möglich, mehrere Themen als Fallback-Baum zu deklarieren? – ermannob

+0

Wenn Sie das Kern adminhtml Theme von "default/default" auf "base/default" verschieben, können Sie angeben drei benutzerdefinierte Themen – benmarks

1

Template-Definition finden Sie hier

class Mage_Adminhtml_Block_Widget_Grid extends Mage_Adminhtml_Block_Widget 

in

public function __construct($attributes=array()) 

So müssen Sie Verkäufe Gitterblock neu zu schreiben, wenn Sie den Export csv aus Kundenauftrag Grid entfernen möchten (verwenden Sie dieses Handbuch, wenn Sie nicht wissen, wie http://www.magentocommerce.com/wiki/groups/174/changing_and_customizing_magento_code) und __construct zu ändern wie seine

public function __construct($attributes=array()) 
{ 
    parent::__construct($attributes); 
    $this->setTemplate('...'); //here is your template 
} 
+0

Dies funktioniert nicht. Das Umschreiben von Blöcken gilt nicht für übergeordnete Klassen. – benmarks

+0

Ja, die von Fab vorgeschlagene Lösung ist besser. Aber dieses Beispiel funktioniert, weil Sie Mage_Adminhtml_Block_Widget_Grid direkt neu schreiben, sein __construct (in dem die Vorlage das erste Mal gesetzt wird) aufrufen und dann Ihre Vorlage festlegen. – freento

+0

Sie scheinen zu missverstehen, wie Klassenreformen in Magento funktioniert. 'createBlock ('group/name')' verwendet das config-Objekt, das jedoch nur die neu geschriebene Klassendefinition automatisch lädt, die dann die Elternklasse * nach Name * angibt. Der Autoloader - der * einzig * verantwortlich ist, wenn es darum geht, die Elternklasse zu laden - evaluiert * in keiner Weise * Klassenumschreibungen aus Konfigurations-XML. Machen Sie einen einfachen Test mit einer Unterklasse von 'Mage_Adminhtml_Block_Widget_Grid' und Sie werden sehen, was ich meine. – benmarks

5

Es mag die einfachste Lösung sein, den Block neu zu schreiben, aber das ist eher ein schmutziger Hack als eine saubere Lösung. Klassenumschreibungen sollten sehr sorgfältig und immer vermieden werden, wenn dies möglich ist. Ansonsten werden Sie schnell in Konflikte geraten und auch Magento-Updates werden zur Hölle.

Normalerweise können Sie Vorlagen durch ein benutzerdefiniertes Layout-Update ändern (d. H. In Ihrer local.xml), aber in diesem Fall ist es ein Widget, das nicht über Layout-XML konfiguriert wird.

Beobachter So geben Sie ein: ein Modul erstellen, das in seiner folgendes enthält config.xml

<adminhtml> 
    <events> 
     <adminhtml_block_html_before> 
      <observers> 
       <yourmodulename_observer> 
        <class>yourmodulename/observer</class> 
        <method>changeWidgetTemplate</method> 
       </yourmodulename_observer> 
      </observers> 
     </adminhtml_block_html_before> 
    </events> 
</adminhtml> 

Wenn Sie eine der oben genannten nicht verstehen, über Magento Events und Beobachter lesen.

Nun müssen Sie den Beobachter selbst, um tatsächlich die Vorlage ändern, sondern nur für diesen Blocktyp:

class Your_Modulename_Observer 
{ 
    public function changeWidgetTemplate(Varien_Event_Observer $observer) 
    { 
     $block = $observer->getEvent()->getBlock(); 
     if ($block instanceof Mage_Adminhtml_Block_Widget_Grid) { 
      // consider getting the template name from configuration 
      $template = '...'; 
      $block->setTemplate($template); 
     } 
    } 
} 
+0

tun dies mit einer local.xml im Admin-Layout-Pfad möglicherweise besser. –

+0

@FabianBlechschmidt Wenn Sie wissen, wie Sie ** Widgets ** in local.xml konfigurieren, lassen Sie es mich wissen. Dies wäre in der Tat eine bessere Lösung. –

+2

gibt es keine Notwendigkeit für ein Widget. Dies könnte funktionieren:

2

Magento - außer Kraft setzen adminhtml Vorlagendatei unter Code hinzufügen Datei Erweiterung config.xml (Sie erstellt)

<stores> 
    <admin> 
     <design> 
      <theme> 
       <default>default</default> 
       <template>rwd</template> 
      </theme> 
     </design> 
    </admin> 
</stores> 

Jetzt rwd Ordner unter adminhtml/default/RWD-Paket erstellen. und erstellen Sie Vorlage und Layout-Datei, wie Sie überschreiben möchten.

möchten wir Order-Kommentar history.phtml Datei überschreiben.

Verwandte Themen