Come posso sovrascrivere una funzione da un modulo?


8

In primo luogo, scusate se questa risposta è trattata altrove. Ho fatto molte ricerche e riesco a trovare solo informazioni su funzioni e hook tematici.

Sto usando un modulo che crea una tabella dei prezzi per gli articoli di Drupal Commerce. C'è una funzione che formatta le intestazioni della tabella:

/**
 * 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;
}

Come puoi vedere, questa non è una funzione del tema in cui posso sovrascriverla in template.php ma posso modificare un po 'dell'output.

Ovviamente non voglio modificare il modulo stesso nel caso venga aggiornato in futuro, quindi, come posso ridefinire questa funzione in modo da poter tagliare e cambiare alcune cose?

Il mio lavoro finora ...

Finora, ho provato a crearlo come un modulo separato con alcune sottili modifiche per mostrare se funziona o no, ma non sovrascrive alcun output.

File informativo

; $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

File del modulo

 /**
 * 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;
}

Risposte:


12

È Drupal ... c'è sempre un modo, ma la quantità di tempo che ci vorrà potrebbe farti pensare due volte :)

Se guardi un po 'più in alto nella catena alimentare, per così dire, vedrai che questa funzione viene utilizzata esclusivamente da commerce_price_table_field_formatter_view(), che dichiara un formattatore di campo che viene utilizzato per il commerce_price_tabletipo di campo.

Con questo in mente, puoi implementare abbastanza facilmente il tuo formattatore di campo, assegnarlo al commerce_price_tabletipo di campo e utilizzare tutto il codice personalizzato che desideri, sempre in linea con le migliori pratiche.

Fondamentalmente è necessario implementare 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'),
      ),
    ),
  );
}

E quindi implementare hook_field_formatter_view(), field_formatter_settings_form()e (opzionalmente) hook_field_formatter_summary().

Per ognuna di queste funzioni basta prendere il codice dalla stessa funzione nel modulo contrib e apportare le modifiche dove è necessario.


Grazie per un'ottima risposta Guardo il codice e vedrò se è il tipo di lavoro che la mia mente può svolgere un venerdì pomeriggio!
user9359

@Clive, la tua risposta è assolutamente corretta dal punto di vista delle migliori pratiche di sviluppo di Drupal. Ma nel caso in cui sia necessario modificare solo una piccola stringa in alcune funzioni, non è un buon approccio creare un formatter personalizzato. Perché più codice personalizzato scrivi, più bug aggiungi. E suggerisci a user9359 di creare 4 hook, molti dei quali verranno copiati dal modulo commerciale esistente !!! Penso che l'uso di piccole patch sia molto più appropriato per questa situazione.
Eugene Fidelin,

2
@Eugene Sì, si tratta davvero di un giudizio, ogni persona avrebbe probabilmente una diversa definizione di "appropriato" in questa situazione. Personalmente preferisco il metodo lungo in quanto significa che non devo mantenere i file di patch e qualsiasi logica di controllo di versione che ho non sarà influenzata da questo file di modulo "modificato"; ma sono solo io, se ti senti a tuo agio nel mantenere i file di patch, sarebbe molto meno sforzo farlo che implementare di nuovo tutte queste funzionalità. Questa risposta era decisamente in linea con il come , non necessariamente con il perché :)
Clive

ancora una volta Clive al resuce
Vishal

2

Sembra che non sia possibile ignorare questa funzione perché non utilizza il flusso di lavoro a tema o hook.

L'unico modo è cambiare direttamente la commerce_price_table_display_quantity_headers()funzione. Quindi crea una patch con le tue modifiche.

In seguito, se aggiorni il modulo Commerce , dovrai applicare la tua patch.


Sì, è quello che stavo cercando di evitare, ma sembra allettante dopo una rapida occhiata al suggerimento di Clive!
user9359

1

Penso che la risposta di Eugene sia corretta e che non puoi farlo senza sovrascrivere direttamente.

Tuttavia, ciò che ho trovato utile è che se è assolutamente necessario farlo, sposta questo modulo dalla tua sites/all/modules/contribdirectory a sites/all/modules/customdir in modo da poter essere a conoscenza e tenere traccia del fatto che hai apportato modifiche personalizzate.


Sì, grazie per il suggerimento, ne avevo letto prima
user9359
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.