¿Cómo anulo una función de un módulo?

8

En primer lugar, lo siento si esta respuesta está cubierta en otra parte. He buscado mucho y solo puedo encontrar información sobre cómo anular funciones de tema y ganchos.

Estoy usando un módulo que crea una tabla de precios para los artículos de Drupal Commerce. Hay una función que formatea los encabezados de la tabla:

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

Como puede ver, esta no es una función de tema donde puedo anularla en template.php pero puedo modificar algunos de los resultados.

Obviamente no quiero editar el módulo en sí mismo en caso de que se actualice en el futuro, entonces, ¿cómo puedo redefinir esta función para poder cortar y cambiar algunas cosas?

Mi trabajo hasta ahora ...

Hasta ahora, he intentado crearlo como un módulo separado con algunos cambios sutiles para mostrar si funciona o no, pero no anula ninguna de las salidas.

Archivo de información

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

Archivo de módulo

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

Respuestas:

12

Es Drupal ... siempre hay una manera, pero la cantidad de tiempo que tomará hacerlo podría hacerte pensar dos veces :)

Si miras un poco más arriba en la cadena alimenticia, verás que esta función es utilizada exclusivamente por commerce_price_table_field_formatter_view(), que declara un formateador de campo que se usa para el commerce_price_tabletipo de campo.

Con eso en mente, puede implementar fácilmente su propio formateador de campo, asignarlo al commerce_price_tabletipo de campo y usar todo el código personalizado que desee, todo el tiempo de acuerdo con las mejores prácticas.

Básicamente necesitas implementar 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'),
      ),
    ),
  );
}

Y luego implementar hook_field_formatter_view(), field_formatter_settings_form()y (opcionalmente) hook_field_formatter_summary().

Para cada una de estas funciones, simplemente tome el código de la misma función en el módulo contrib y realice los cambios donde sea necesario.

Clive
fuente
Gracias por una gran respuesta. ¡Leeré el código y veré si es el tipo de trabajo que mi mente puede manejar un viernes por la tarde!
user9359
@Clive, su respuesta es absolutamente correcta desde el punto de vista de las mejores prácticas de desarrollo de Drupal. Pero en caso de que solo necesite cambiar una cadena pequeña en alguna función, no es un buen enfoque crear un formateador personalizado. Porque cuanto más código personalizado escriba, más errores agregará. ¡Y sugiere que user9359 cree 4 ganchos, la mayoría de ellos se copiarán del módulo de comercio existente! Creo que usar un parche pequeño es mucho más apropiado para esta situación.
Eugene Fidelin
2
@ Eugene Sí, es realmente una decisión, cada persona probablemente tendría una definición diferente de 'apropiado' en esta situación. Personalmente, prefiero el método largo, ya que significa que no tengo que mantener archivos de parches, y cualquier lógica de control de versión sofisticada que tenga no se verá afectada por este archivo de módulo 'cambiado' falso; pero así soy yo, si te sientes cómodo manteniendo los archivos de parche, sería mucho menos esfuerzo hacerlo que volver a implementar toda esta funcionalidad. Esta respuesta fue definitivamente similar a cómo , no necesariamente por qué :)
Clive
nuevamente clive al resuce
vishal
2

Parece que no puede anular esta función porque no usa flujo de trabajo de tema o gancho.

La única forma es cambiar directamente la commerce_price_table_display_quantity_headers()función. Luego crea un parche con tus cambios.

Más adelante, si actualiza el módulo de Comercio , deberá aplicar su parche.

Eugene Fidelin
fuente
Sí, eso es lo que estaba tratando de evitar, ¡pero parece tentador después de un rápido vistazo a la sugerencia de Clive!
user9359
1

Creo que la respuesta de Eugene es correcta: no puedes hacerlo sin sobrescribir directamente.

Sin embargo, lo que he encontrado útil es que si es absolutamente necesario hacer esto, mueva este módulo de su sites/all/modules/contribdirectorio al sites/all/modules/customdirectorio para que pueda conocer y realizar un seguimiento del hecho de que realizó cambios personalizados.

nedwardss
fuente
Sí, gracias por el consejo, había leído sobre eso antes
user9359