No Magento 1, eu podia copiar a classe abstrata para o diretório local ou comunitário e o Magento a usava, quando o carregamento automático carregava essa classe.
Existe alguma solução para o Magento carregar minha classe vendor/magento/framework/Model/AbstractModel.php
?
As preferências di.xml
para classes abstratas não funcionam. Apenas plugins?
Solução completa: inclua classes substituídas antes que o magento as carregue automaticamente. Então, passo a passo:
No arquivo
app/etc/NonComposerComponentRegistration.php
adicionar linhaNo
app/etc
arquivo de lugarClassReplacer.php
com o conteúdoLugar para
app/code/Magento
alguma classe, que será substituída, por exemploapp/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php
fonte
Se a classe abstrata tiver algum método público ou protegido que você queira substituir, existe uma maneira de não usar plug-ins.
Eu tive que substituir o método por
_processDownload
dentro\Magento\Downloadable\Controller\Download
, adicionando alguns 'se-s' por dentro. (Se alguém tiver idéia de como posso adicionar algo como este método interno usando plug-ins, ficarei grato). A classe é abstrata, então a preferência não funcionou. Plugins também, como o método está protegido. O que eu precisava fazer era substituir todas as classes que estendiamDownload
, usando a preferência. Essas classes:Magento\Downloadable\Controller\Download\Link
Magento\Downloadable\Controller\Download\LinkSample
Magento\Downloadable\Controller\Download\Sample
E dentro deles reescrevemos o método da classe pai (a que eu deveria substituir). Na verdade, o código dos métodos substituídos foi copiado para três lugares e era exatamente o mesmo.
Não é o ideal, mas funciona.
fonte
Você pode tentar usar o Magento Plugin para aprimorar a funcionalidade existente de qualquer classe Abstract, embora o escopo da função deva ser Público. Recentemente, trabalhei no mesmo problema em que preciso excluir produtos com um atributo personalizado atribuído na lista de produtos visualizados recentemente .
Eu usei o plug-in para a função chamada getItemsCollection da classe Magento \ Reports \ Block \ Product \ AbstractProduct usando a seguinte sintaxe:
arquivo: app \ código \ Pacote \ Módulo \ etc \ frontend \ di.xml
file: app \ code \ Package \ Module \ Block \ Viewed.php
Você também pode usar plugins anteriores e anteriores. Espero que este trabalho para você.
fonte