Comment remplacer une fonction d'un module?

8

Tout d'abord, désolé si cette réponse est couverte ailleurs. J'ai fait beaucoup de recherches et je ne trouve que des informations sur les fonctions de thème et les crochets.

J'utilise un module qui construit une table de prix pour les articles Drupal Commerce. Il existe une fonction qui formate les en-têtes de table:

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

Comme vous pouvez le voir, ce n'est pas une fonction de thème où je peux la remplacer dans template.php mais je peux modifier une partie de la sortie.

Évidemment, je ne veux pas éditer le module lui-même au cas où il serait mis à jour à l'avenir, alors, comment puis-je redéfinir cette fonction afin de pouvoir couper et changer quelques choses?

Mon travail jusqu'à présent ...

Jusqu'à présent, j'ai essayé de le créer en tant que module séparé avec quelques modifications subtiles pour montrer s'il fonctionne ou non, mais il ne remplace aucune des sorties.

Fichier d'informations

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

Fichier de module

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

Réponses:

12

C'est Drupal ... il y a toujours un moyen, mais le temps qu'il vous faudra peut vous faire réfléchir à deux fois :)

Si vous regardez un peu plus haut dans la chaîne alimentaire pour ainsi dire, vous verrez que cette fonction est exclusivement utilisée par commerce_price_table_field_formatter_view(), qui déclare un formateur de champ utilisé pour le commerce_price_tabletype de champ.

Dans cet esprit, vous pouvez assez facilement implémenter votre propre formateur de champs, l'affecter au commerce_price_tabletype de champ et utiliser autant de code personnalisé que vous le souhaitez, tout en respectant les meilleures pratiques.

Fondamentalement, vous devez implémenter 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'),
      ),
    ),
  );
}

Et puis implémentez hook_field_formatter_view(), field_formatter_settings_form()et (éventuellement) hook_field_formatter_summary().

Pour chacune de ces fonctions, prenez simplement le code de la même fonction dans le module contrib et effectuez les modifications là où vous en avez besoin.

Clive
la source
Merci pour une excellente réponse. Je vais parcourir le code et voir si c'est le genre de travail que mon esprit peut gérer un vendredi après-midi!
user9359
@Clive, vous répondez est tout à fait correct du point de vue des meilleures pratiques de développement Drupal. Mais dans le cas où vous n'avez besoin de changer qu'une petite chaîne dans une fonction - ce n'est pas une bonne approche pour créer un formateur personnalisé. Parce que plus vous écrivez de code personnalisé, plus vous ajoutez de bogues. Et vous suggérez à user9359 de créer 4 crochets, la plupart d'entre eux seront copypés à partir du module de commerce existant !!! Je pense que l'utilisation d'un petit patch est beaucoup plus appropriée pour cette situation.
Eugene Fidelin
2
@Eugene Oui, c'est vraiment un appel au jugement, chaque personne aurait probablement une définition différente de «appropriée» dans cette situation. Personnellement, je préfère la méthode longue car elle signifie que je n'ai pas à maintenir les fichiers de correctifs et que toute logique de contrôle de version sophistiquée que je possède ne sera pas affectée par ce fichier de module «modifié» escroc; mais ce n'est que moi, si vous êtes à l'aise pour gérer les fichiers de correctifs, cela nécessiterait beaucoup moins d'efforts que de réimplémenter toutes ces fonctionnalités. Cette réponse allait définitivement dans le sens du comment , pas nécessairement du pourquoi :)
Clive
encore une fois à la resuce
vishal
2

Il semble que vous ne puissiez pas remplacer cette fonction car elle n'utilise pas de thème ou de workflow de hook.

La seule façon - est de changer directement de commerce_price_table_display_quantity_headers()fonction. Créez ensuite un patch avec vos modifications.

Plus tard, si vous mettez à jour le module Commerce - vous devrez appliquer votre correctif.

Eugene Fidelin
la source
Oui, c'est ce que j'essayais d'éviter, mais cela semble tentant après un rapide coup d'œil à la suggestion de Clive!
user9359
1

Je pense que la réponse d'Eugene est correcte: vous ne pouvez pas le faire sans écraser directement.

Cependant, ce que j'ai trouvé utile, c'est que s'il est absolument nécessaire de le faire, déplacez ce module de votre sites/all/modules/contribrépertoire vers sites/all/modules/customdir afin que vous puissiez être conscient et garder une trace du fait que vous avez apporté des modifications personnalisées.

nedwardss
la source
Ouais merci pour l'astuce, je l'avais lu plus tôt
user9359