Share

Como usar o sistema de sobrescrita do PrestaShop sem comprometer o núcleo do sistema.

Este guia ajuda a resolver os overrides no Prestashop 9.x.x, 8.x.x e 7.x.x, explica como os overrides funcionam e como você pode usá-los com Knowband

Como usar o sistema de overrides do PrestaShop com Knowband sem quebrar o core

O sistema de sobrescrita do PrestaShop permite personalizar o comportamento principal sem alterar os arquivos originais. No entanto, usado de forma descuidada, ele cria lojas frágeis que quebram após atualizações. Este guia da Knowband aborda como as sobrescritas funcionam, quando usá-las e três armadilhas críticas que todo desenvolvedor deve conhecer.

O que é o sistema de sobreposição?

O PrestaShop utiliza herança PHP para permitir que você substitua qualquer classe principal por sua própria versão, sem alterar as originais. Cada classe principal recebe o sufixo “Core”, por exemplo, `ProductCore`. Se você criar o arquivo `/override/classes/Product.php` com uma classe chamada `Product` que estende `ProductCore`, o PrestaShop carregará sua versão. O mesmo se aplica aos controladores.

Substitua apenas os métodos específicos que você precisa alterar; nunca copie um arquivo de classe inteiro. Isso mantém sua substituição enxuta e muito menos propensa a conflitos com atualizações futuras.

Por exemplo, expondo o nome do controlador atual no seu modelo de cabeçalho:

Onde colocar seus arquivos de sobreposição

As configurações personalizadas podem estar em dois locais. O diretório global `/override/` na raiz da sua instalação fica ativo imediatamente após a limpeza do cache. A melhor abordagem é agrupar as configurações personalizadas dentro de um módulo.

Colocar um arquivo de sobrescrita dentro de um módulo (por exemplo, /modules/mymodule/override/classes/Product.php) faz com que o PrestaShop o copie para /override/ durante a instalação e o remova completamente durante a desinstalação. Esta é a abordagem recomendada.

Um exemplo rápido de sobrescrita de classe. Digamos que você queira expor o nome do controlador atual no seu modelo de cabeçalho:

// /override/classes/controllers/FrontController.php

classe FrontController estende FrontControllerCore {

    função pública initHeader() {

        self::$smarty->assign('currentController', get_class($this));

        retornar parent::initHeader();

    }}

Sempre chame o método pai, a menos que tenha um motivo específico para não fazê-lo. Ignorá-lo quebrará silenciosamente a funcionalidade principal.

Sobrescrita de classes e controladores de módulos

A partir do PrestaShop 1.6, você também pode sobrescrever classes de módulos. Adicione “Override” ao nome da classe (por exemplo, BlockUserInfoOverride estendendo BlockUserInfo) e coloque-a em /override/modules/. O mesmo padrão se aplica aos controladores de módulos. Após qualquer sobrescrita, limpe o cache, especificamente exclua o arquivo /cache/class_index.php, ou as alterações não terão efeito.

Quando NÃO usar substituições

As sobrescritas são exclusivas — só pode existir uma por classe. Elas também são proibidas em módulos do marketplace e devem ser reservadas para personalizações privadas da loja. Antes de recorrer a uma sobrescrita, considere uma destas alternativas:

  • Ganchos: O PrestaShop dispara eventos de gancho (hook events) em todos os carregamentos de página — você pode acessá-los a partir de um módulo para executar código personalizado ou inserir conteúdo na página sem precisar mexer em nenhuma classe principal.
  • Sobrescritas de serviço do Symfony: Partes do PrestaShop que foram migradas para o Symfony oferecem um caminho mais limpo através do contêiner de serviços. Você decora ou substitui um serviço em vez de modificar a própria classe.
  • Modelo de objeto personalizado: Precisa adicionar campos a uma entidade principal? Crie seu próprio ObjectModel com sua própria tabela em vez de modificar a existente.

Protegendo as configurações personalizadas por meio de atualizações

As atualizações do PrestaShop podem alterar silenciosamente as assinaturas dos métodos, deixando seu código sobrescrito com base em premissas desatualizadas. Trate cada código sobrescrito como algo a ser revisado após cada atualização. Comente o que você alterou e por quê, verifique o changelog e mantenha o código sobrescrito o menor possível. Um código sobrescrito conciso e bem comentado que chama os métodos da classe pai corretamente sobrevive às atualizações. Uma cópia completa da classe é um bug prestes a ser descoberto.

O cache “fantasma”: por que sua sobrescrita parece invisível

O principal motivo pelo qual os desenvolvedores acreditam que suas configurações personalizadas estão com problemas: o PrestaShop não verifica o diretório `/override/` a cada requisição. Ele compila um mapa de classes em `/cache/class_index.php`, e até que esse arquivo seja excluído e regenerado, sua configuração personalizada permanece invisível, independentemente da correção do código. Limpar o cache do Smarty não é suficiente. Exclua o arquivo `class_index.php` manualmente via FTP/SSH, através de Parâmetros Avançados > Desempenho no painel administrativo ou pelo console do Symfony.

Figura 1: O fluxo do sistema de sobrescrita do PrestaShop e a função de /cache/class_index.php.

 

O Muro do Symfony: Substituições Legadas Não Funcionam com Controladores Modernos

Este sistema PHP legado funciona apenas na camada ObjectModel mais antiga do PrestaShop. A partir da versão 1.7, áreas importantes do painel administrativo, incluindo as novas telas de Página de Produto e Pedido, foram reescritas em Symfony. O sistema de sobrescrita do PHP não afeta esses controladores do Symfony. Para esses, use Decoração de serviço, encapsulando ou substituindo um serviço através do arquivo services.yml do seu módulo. Se uma sobrescrita não tiver efeito mesmo após limpar o arquivo class_index.php, é provável que o controlador tenha sido migrado para o Symfony.

Resolução de Conflitos: Quando Dois Módulos Desejam a Mesma Classe

Quando dois módulos sobrescrevem a mesma classe, o PrestaShop gera um erro na segunda instalação e deixa a sobrescrita inativa. A solução é manual: abra ambos os arquivos, combine todos os métodos em um único arquivo `/override/` que estenda a classe `Core`, e então exclua o arquivo `class_index.php`. Adicione comentários identificando qual módulo contribuiu com cada método. É por isso que sobrescritas são proibidas em módulos de marketplaces; conflitos se tornam problema do lojista. Se estiver desenvolvendo para terceiros, use hooks.

Figura 2: Como surgem conflitos de sobrescrita quando dois módulos têm como alvo a mesma classe e a resolução manual da mesclagem.

Sobre a Knowband

A Knowband é uma fornecedora confiável de plugins e extensões para e-commerce, com anos de experiência ajudando lojistas online a criar lojas mais rápidas, inteligentes e repletas de recursos. Seja qual for a plataforma em que sua loja opera — a Knowband, por exemplo —, oferece soluções completas e inovadoras para lojas virtuais. PrestaShop, OpenCartShopify, WooCommerce, MagentoSeja para o Google Play ou qualquer outra plataforma importante, a Knowband oferece uma ampla gama de plugins e extensões prontos para uso que ajudam a aprimorar a funcionalidade, melhorar o desempenho e proporcionar uma melhor experiência de compra, sem a necessidade de desenvolver tudo do zero.