Siamo obbligati a riscrivere un modello in Magento2 quando riscriviamo un blocco?


8

Questa domanda riguarda le migliori pratiche di Magento2.

Ho dovuto riscrivere il metodo \ Magento \ Theme \ Block \ Html \ Topmenu :: _ addSubMenu () per aggiungere alcuni wrapper attorno agli elementi. Ora, poiché è un metodo protetto, la mia comprensione è che devo usare la funzione di preferenza:

<preference for="Magento\Theme\Block\Html\Topmenu" type="MyCompany\Theme\Block\Html\Topmenu" />

e aggiungo un corso con le mie riscritture:

<?php

namespace MyCompany\Theme\Block\Html;

class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
    protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
    {
        // my stuff
    }
}

Sebbene la classe predefinita sia stata riscritta, nella pagina successiva ricaricata ho ricevuto il seguente errore:

main.CRITICAL: file modello non valido: 'html / topmenu.phtml' nel modulo: nome del blocco 'MyCompany_Theme': 'catalog.topnav' [] []

Magento sta cercando di trovare html / topmenu.phtml nella mia estensione e non in Magento_Theme. Capisco che si tratta di un comportamento corretto, ma stavo pensando ad aspetti pratici di questo. Questo significa che ogni volta che riscriviamo un blocco, dobbiamo riscrivere anche il suo modello, anche se non abbiamo necessariamente bisogno di toccare qualcosa correlato all'HTML?

Un modo per aggirare questo sarebbe riscrivere anche il metodo _toHtml (), in questo modo:

protected function _toHtml()
{
    $this->setModuleName($this->extractModuleName('Magento\Theme\Block\Html\Topmenu'));
    return parent::_toHtml();
}

Ora Magento sta esaminando nuovamente il modulo Magento_Theme per il file modello. Ma a me sembra un trucco.

Quindi, la mia domanda è: qual è una raccomandazione in queste situazioni? Dovremmo sempre copiare il modello pertinente quando riscriviamo la classe di blocco, o la soluzione alternativa va bene? Esiste un approccio migliore per questo?


Non ho tempo di rispondere adesso, ma ti suggerisco di dare un'occhiata a questa domanda e alle risposte che potrebbero aiutarti a capire il concetto: magento.stackexchange.com/q/112749/2380
Raffaello al Pianismo digitale

1
interessante. Il modello potrebbe ancora essere caricato dal modulo originale se non fosse stato prefissato Magento_Theme::, ma non hanno github.com/magento/magento2/blob/develop/app/code/Magento/Theme/… Adesso mi chiedo davvero se questo fosse apposta
David Verholen,

@RaphaelatDigitalPianism Grazie. Il thread che hai collegato riguarda i plugin. Il mio scenario è diverso.
mstojanov,

Sì, è quello che ho scoperto una volta capito il tuo problema. Sicuramente non mi sembra un bug
Raphael al Digital Pianism

Ho creato un problema su GitHub che risolve questo problema: github.com/magento/magento2/issues/4564 in attesa di una risposta dal team di sviluppo e farà un PR se finisce per essere un bug.
Raffaello al Pianismo digitale,

Risposte:


4

Dal momento che ci sono discussioni sulla soluzione proposta nella richiesta pull ( https://github.com/magento/magento2/pull/1895 ), nel frattempo devi solo "bloccare" il modello originale quando cambi il nome della classe di blocco originale:

<referenceBlock name="catalog.topnav" class="***" template="Magento_Theme::html/topmenu.phtml"/>

Questo è un buon suggerimento, anche se per alcuni blocchi sarebbe nella migliore delle ipotesi impraticabile poiché è usato in così tanti layout ( Catalog\Block\Product\View). Penso che il suggerimento del PO sia ancora la soluzione migliore per quell'istanza.
Erfan,

3

devi solo aggiungere un codice in questo file

app/design/frontend/chop/misty/Magento_Theme/layout/default.xml

con:

<referenceBlock name="catalog.topnav" class="Company_name\Override\Block\Html\Topmenu" template="Magento_Theme::html/topmenu.phtml"/>

e aggiungi il codice seguente nel nome del file del modulo di sostituzione:

app/code/Aims/Override/etc/di.xml

codice :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <preference for="Magento\Theme\Block\Html\Topmenu" type="Company_name\Override\Block\Html\Topmenu" />
    <preference for="Magento\Paypal\Model\Config" type="Company_name\Override\Model\Paypal\Config" />
</config>

Aggiungi Topmenu.phpfile in File: app/code/Company_name/Override/Block/Html/Topmenu.php puoi aggiungere qualsiasi funzione desideri sovrascrivere.

Grazie

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.