Wie überschreibe ich eine Funktion aus einem Modul?


8

Erstens, entschuldigen Sie, wenn diese Antwort an anderer Stelle behandelt wird. Ich habe viel gesucht und kann nur Informationen zu übergeordneten Themenfunktionen und Hooks finden.

Ich verwende ein Modul, das eine Preistabelle für Drupal Commerce-Artikel erstellt. Es gibt eine Funktion, die die Tabellenüberschriften formatiert:

/**
 * Helper function that takes care of the quantity displayed in the headers of 
 * the price table.
 */
function commerce_price_table_display_quantity_headers($item) {
  // Set the quantity text to unlimited if it's -1.
  $max_qty = $item['max_qty'] == -1 ? t('Unlimited') : $item['max_qty'];
  // If max and min qtys are the same, only show one.
  if ($item['min_qty'] == $max_qty) {
    $quantity_text = $item['min_qty'];
  }
  else {
    $quantity_text = $item['min_qty'] . ' - ' . $max_qty;
  }
  return $quantity_text;
}

Wie Sie sehen können, ist dies keine Themenfunktion, bei der ich sie in template.php überschreiben kann, aber ich kann einen Teil der Ausgabe optimieren.

Natürlich möchte ich das Modul selbst nicht bearbeiten, falls es in Zukunft aktualisiert wird. Wie kann ich diese Funktion neu definieren, damit ich einige Dinge zerhacken und ändern kann?

Meine bisherige Arbeit ...

Bisher habe ich versucht, es als separates Modul mit ein paar subtilen Änderungen zu erstellen, um zu zeigen, ob es funktioniert oder nicht, aber es überschreibt keine der Ausgaben.

Info-Datei

; $id$
name = Price Table: Tweaked Display
description = A different layout for the price table as shown on the product display nodes
package = Commerce (contrib)
core = 7.x

dependencies[] = commerce_product
dependencies[] = commerce_price
dependencies[] = commerce_price_table

Moduldatei

 /**
 * Override of the helper function that takes care of the quantity displayed in the headers of 
 * the price table.
 */
function commerce_table_tweak_display_quantity_headers($item) {
  // Set the quantity text to unlimited if it's -1.
  $max_qty = $item['max_qty'] == -1 ? t('Unlimited gnhh') : $item['max_qty'];
  // If max and min qtys are the same, only show one.
  if ($item['min_qty'] == $max_qty) {
    $quantity_text = $item['min_qty'];
  }
  else {
    $quantity_text = $item['min_qty'] . ' - this is working - ' . $max_qty;
  }
  return $quantity_text;
}

Antworten:


12

Es ist Drupal ... es gibt immer einen Weg, aber die Zeit, die dafür benötigt wird, könnte Sie zweimal überlegen lassen :)

Wenn Sie sozusagen etwas weiter oben in der Nahrungskette nachsehen, werden Sie feststellen, dass diese Funktion ausschließlich von verwendet wird commerce_price_table_field_formatter_view(), wodurch ein Feldformatierer deklariert wird, der für den commerce_price_tableFeldtyp verwendet wird.

In diesem Sinne können Sie ganz einfach Ihren eigenen Feldformatierer implementieren, ihn dem Feldtyp zuweisen commerce_price_tableund so viel benutzerdefinierten Code verwenden, wie Sie möchten, wobei Sie stets den Best Practices entsprechen.

Grundsätzlich müssen Sie Folgendes implementieren hook_field_formatter_info():

function MYMODULE_field_formatter_info() {
  return array(
    'MYMODULE_commerce_multiprice_default' => array(
      'label' => t('MyModule Price chart'),
      'field types' => array('commerce_price_table'),
      'settings' => array(
        'calculation' => FALSE,
        'price_label' => t('Price'),
        'quantity_label' => t('Quantity'),
        'table_orientation' => t('Orientation'),
      ),
    ),
  );
}

Und dann umzusetzen hook_field_formatter_view(), field_formatter_settings_form()und (optional) hook_field_formatter_summary().

Nehmen Sie für jede dieser Funktionen einfach den Code aus derselben Funktion im Contrib-Modul und nehmen Sie die erforderlichen Änderungen vor.


Danke für eine tolle Antwort. Ich werde den Code durchgehen und sehen, ob es die Art von Arbeit ist, die mein Verstand an einem Freitagnachmittag erledigen kann!
user9359

@Clive, Ihre Antwort ist unter dem Gesichtspunkt der Best Practice der Drupal-Entwicklung absolut korrekt. Wenn Sie jedoch in einer Funktion nur eine kleine Zeichenfolge ändern müssen, ist es kein guter Ansatz, einen benutzerdefinierten Formatierer zu erstellen. Denn je mehr benutzerdefinierten Code Sie schreiben, desto mehr Fehler fügen Sie hinzu. Und Sie schlagen vor, dass user9359 4 Hooks erstellt, von denen die meisten aus dem vorhandenen Commerce-Modul kopiert werden !!! Ich denke, dass die Verwendung eines kleinen Patches für diese Situation viel besser geeignet ist.
Eugene Fidelin

2
@Eugene Ja, es ist wirklich ein Urteilsspruch, jede Person würde in dieser Situation wahrscheinlich eine andere Definition von "angemessen" haben. Persönlich bevorzuge ich die lange Methode, da dies bedeutet, dass ich keine Patch-Dateien verwalten muss und jede ausgefallene Versionskontrolllogik, die ich habe, nicht von dieser betrügerischen "geänderten" Moduldatei betroffen ist. Aber das bin nur ich. Wenn Sie mit der Pflege von Patch-Dateien vertraut sind, ist dies viel weniger aufwändig als die erneute Implementierung all dieser Funktionen. Diese Antwort entsprach definitiv dem Wie , nicht unbedingt dem Warum :)
Clive

wieder klammern an die resuce
vishal

2

Anscheinend können Sie diese Funktion nicht überschreiben, da sie keinen Themen- oder Hook-Workflow verwendet.

Der einzige Weg - besteht darin, die commerce_price_table_display_quantity_headers()Funktion direkt zu ändern . Dann einen Patch erstellen mit Ihnen verändert.

Wenn Sie später das Commerce- Modul aktualisieren, müssen Sie Ihren Patch anwenden.


Ja, das wollte ich vermeiden, aber nach einem kurzen Blick auf Clives Vorschlag scheint es verlockend!
user9359

1

Ich denke, Eugenes Antwort ist richtig, dass man es nicht tun kann, ohne direkt zu überschreiben.

Was ich jedoch als nützlich empfunden habe, ist, dass Sie dieses Modul, wenn dies unbedingt erforderlich ist, aus Ihrem sites/all/modules/contribVerzeichnis in das Verzeichnis verschieben, sites/all/modules/customdamit Sie wissen und verfolgen können, dass Sie benutzerdefinierte Änderungen vorgenommen haben.


Ja, danke für den Tipp, ich hatte früher darüber gelesen
user9359
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.