Como substituir uma função de um módulo?

8

Em primeiro lugar, desculpe se esta resposta é abordada em outro lugar. Pesquisei bastante e só consigo encontrar informações sobre funções de tema e ganchos.

Estou usando um módulo que cria uma tabela de preços para itens do Drupal Commerce. Há uma função que formata os cabeçalhos da tabela:

/**
 * 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 você pode ver, essa não é uma função de tema onde eu possa substituí-la no template.php, mas posso ajustar alguns dos resultados.

Obviamente, não quero editar o módulo em si, caso ele seja atualizado no futuro. Portanto, como redefinir essa função para poder cortar e alterar algumas coisas?

Meu trabalho até agora ...

Até agora, tentei criá-lo como um módulo separado, com algumas mudanças sutis para mostrar se está funcionando ou não, mas não está substituindo nenhuma saída.

Arquivo de informações

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

Arquivo 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;
}
user9359
fonte

Respostas:

12

É Drupal ... sempre existe uma maneira, mas a quantidade de tempo que leva para fazer pode fazer você pensar duas vezes :)

Se você olhar um pouco mais adiante na cadeia alimentar, verá que essa função é usada exclusivamente por commerce_price_table_field_formatter_view(), o que declara um formatador de campo usado para o commerce_price_tabletipo de campo.

Com isso em mente, você pode facilmente implementar seu próprio formatador de campos, atribuí-lo ao commerce_price_tabletipo de campo e usar o código personalizado que desejar, mantendo o tempo todo alinhado às práticas recomendadas.

Basicamente, você precisa 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'),
      ),
    ),
  );
}

E, em seguida hook_field_formatter_view(), implemente field_formatter_settings_form()e (opcionalmente) hook_field_formatter_summary().

Para cada uma dessas funções, basta pegar o código da mesma função no módulo contrib e fazer as alterações necessárias.

Clive
fonte
Obrigado por uma ótima resposta. Vou percorrer o código e ver se é o tipo de trabalho que minha mente pode lidar em uma sexta-feira à tarde!
User9359 17/08/2012
@Clive, você responde está absolutamente correto do ponto de vista das melhores práticas de desenvolvimento do Drupal. Mas, caso você precise alterar apenas uma sequência pequena em alguma função - não é uma boa abordagem criar um formatador personalizado. Porque quanto mais código personalizado você escreve, mais erros você adiciona. E você sugere que o user9359 crie 4 ganchos, a maioria deles será copypasted do módulo de comércio existente !!! Eu acho que o uso de pequenas correções é muito mais apropriado para essa situação.
Eugene Fidelin 21/08/2012
2
@ Eugene Sim, é realmente uma decisão, cada pessoa provavelmente teria uma definição diferente de 'apropriado' nessa situação. Pessoalmente, prefiro o método long, pois significa que não preciso manter os arquivos de correção, e qualquer lógica de controle de versão sofisticada que eu não seja afetada por esse arquivo de módulo desonesto e alterado; mas esse sou eu, se você estiver confortável em manter arquivos de correção, seria muito menos esforço fazer isso do que reimplementar toda essa funcionalidade. Essa resposta foi definitivamente ao longo das linhas da forma como , não necessariamente o porquê :)
Clive
novamente clive para o resuce #
1219
2

Parece que você não pode substituir essa função porque ela não usa o tema ou o fluxo de trabalho de gancho.

A única maneira - é mudar diretamente de commerce_price_table_display_quantity_headers()função. Em seguida, crie um patch com suas alterações.

Posteriormente, se você atualizar o módulo Commerce - precisará aplicar seu patch.

Eugene Fidelin
fonte
Sim, era isso que eu estava tentando evitar, mas parece tentador depois de uma rápida olhada na sugestão de Clive!
user9359
1

Acho que a resposta de Eugene está correta, de que você não pode fazer isso sem sobrescrever diretamente.

No entanto, o que eu achei útil é que, se for absolutamente necessário fazer isso, mova este módulo do sites/all/modules/contribdiretório para sites/all/modules/customdir, para que você esteja ciente e acompanhe o fato de ter feito alterações personalizadas.

nedwardss
fonte
Sim obrigado pela dica, eu li sobre isso antes
user9359