Jump to content

Override non funziona


Recommended Posts

Ciao ragazzi,

Ho la necessità di modificare l'ordine dei prodotto mostrati a seconda della categoria, quindi ho apportato una modifica al file ProductListingFrontController, dove ho aggiunto un piccolo pezzo di codice:

https://paste.ofcode.org/eUsQwqeXQyFYCUmTMpfm5V (Linea 39)

Ora, per fare le cose per bene :D, vorrei apporta
re questa modifica direttamente nell'override anziché direttamente nel Controller.

Quindi nella cartella override,ho creato un file ProductListingFrontController dove ho copiato la funzione originale + il pezzo di codice mancante, ma non funziona. Come mai? Mi sfugge qualcosa?

https://paste.ofcode.org/c8FP8cwVjf98TwKabZ6u7J
 

Link to comment
Share on other sites

On 29/4/2022 at 3:18 PM, s.elettronew dice:

Ciao ragazzi,

Ho la necessità di modificare l'ordine dei prodotto mostrati a seconda della categoria, quindi ho apportato una modifica al file ProductListingFrontController, dove ho aggiunto un piccolo pezzo di codice:

https://paste.ofcode.org/eUsQwqeXQyFYCUmTMpfm5V (Linea 39)

Ora, per fare le cose per bene :D, vorrei apporta
re questa modifica direttamente nell'override anziché direttamente nel Controller.

Quindi nella cartella override,ho creato un file ProductListingFrontController dove ho copiato la funzione originale + il pezzo di codice mancante, ma non funziona. Come mai? Mi sfugge qualcosa?

https://paste.ofcode.org/c8FP8cwVjf98TwKabZ6u7J
 

Dopo aver fatto l'override e quindi caricato il file nella cartella override/classes/controller hai cancellato la cache in Parametri avanzati > Prestazioni?

Link to comment
Share on other sites

3 hours ago, codencode said:

Dopo aver fatto l'override e quindi caricato il file nella cartella override/classes/controller hai cancellato la cache in Parametri avanzati > Prestazioni?

Caricato il file ? Non si fanno più gli override in quel modo. Si crea la cartella override dentro al modulo e poi lo si installa o reinstalla nel caso di modifiche. E per prevenire questo continuo "reinstallare" io nell'override faccio solo l'inclusione del vero file di override dentro al mio modulo. In questo modo l'override resta valido e funzionante e posso modificare il suo "funzionamento" senza dover reinstallare ogni volta il modulo

 

Link to comment
Share on other sites

@codencode

Come detto anche da @ziobudda in PS 1.7 l'override va fatto tramite un modulo, vedi documentazione ufficiale: https://devdocs.prestashop.com/1.7/modules/concepts/overrides/ Il metodo che indichi tu va bene fino a PS 1.6.

@s.elettronew

Personalmente io faccio un modulo per ciascun controller/classe che devo modificare in modo da tenere il codice il più ordinato possibile, ma è una scelta del tutto personale.
Quanto al metodo di @ziobudda per evitare di continuare a "reinstallare" il modulo che contiene l'override, faccio così anche io, quindi lo consiglio.

Buon pomeriggio,
Federica

  • Like 1
Link to comment
Share on other sites

Quello che dite è giusto, lo so che va fatto così (come viene detto nella documentazione), però se bisogna fare una modifica ad un controller o classe, che non è "collegata" ad un modulo, mi sembra eccessivo dover creare un modulo per poter fare l'override.

Capisco anche che in caso di aggiornamento l'override verrà perso, invece facendolo mediante un modulo basta reinstallare il modulo, però così si rischia di dovere creare un modulo per ogni modifica.

Comprendo anche il discorso di non toccare mai il "core", so che è così, ma a volte è inevitabile.

Link to comment
Share on other sites

Quindi se hai bisogno di modificare un codice in un metodo statico, non lo fai perché è sbagliato?

Oppure se hai bisogno di una modifica molto specifica da inserire in un punto in cui non è presente un hook, come fai?

Lo chiedo per avere un parere, visto che spesso mi trovo in situazioni simili.

Link to comment
Share on other sites

Ciao, esistono gli hook e gli override proprio per non dover lavorare sul core. Se proprio proprio devi lavorare sul core è perchè non esiste ASSOLUTISSIMAMENTE altro modo per fare quella cosa. Ma non deve mai essere una scappatoia.

M.

 

  • Like 1
Link to comment
Share on other sites

24 minuti fa, ziobudda dice:

Ciao, esistono gli hook e gli override proprio per non dover lavorare sul core. Se proprio proprio devi lavorare sul core è perchè non esiste ASSOLUTISSIMAMENTE altro modo per fare quella cosa. Ma non deve mai essere una scappatoia.

M.

 

Certo sono pienamente d'accorto, se esiste un hook è ovvio che va sfruttato.
Mi sono trovato in situazioni in cui non c'erano hook e non ho potuto fare altro che aggiungere codice nel core.
Ad esempio per un ecommerce abbiamo dovuto impostare il minimo d'ordine, però Prestashop permette di impostarlo tasse escluse ma noi avevamo la necessità che lo calcolasse sul lordo e che anche il messaggio venisse mostrato tasse incluse (inoltre ci occorreva che venisse considerato solo l'importo dei prodotti incluso di eventuali sconti e senza considerare la spedizione :)).
Per far ciò ho dovuto mettere mano alla classe PrestaShop\PrestaShop\Adapter\Presenter\Cart\CartPresenter, che è sbagliato, ma è l'unica soluzione che ho trovato.

Ovviamente Prestashop utilizza tasse escluse perché potrebbero esserci articoli con aliquote IVA differenti, ma nel nostro caso non avevamo questo problema e abbiamo optato per "agevolare" l'usabilità in quanto mostrando il minimo tasse incluse è più immediato.

 

Edited by codencode (see edit history)
Link to comment
Share on other sites

Un altro esempio che mi è venuto in mente ora è il seguente:

disabilitando la "Gestione del magazzino" Parametri negozio > Prodotti > Permetti gestione del magazzino > NO

per gli articoli con quantità 0 viene stampato come microdato availability il valore PreOrder OutOfStock a seconda che sia impostato Accetta o rifiuta ordine quando non disponibile. Questa cosa non ha molto senso in quanto se disabilito la gestione del magazzino significa che gli articoli sono sempre disponibili in quanto non voglio gestire le quantità.

Per risolvere questo problema ho dovuto modificare il metodo PrestaShop\PrestaShop\Adapter\Presenter\Product\ProductLazyArray::getSeoAvailability(), che è sbagliato, ma non ho trovato altre soluzioni e sono stato costretto a modificarlo, altrimenti nei microdati l'articolo risultava non disponibile.

 

Link to comment
Share on other sites

@codencode

In linea di massima io sono d'accordo con @ziobudda sul fatto che il core non va toccato e questi sono alcuni motivi che ritengo essenziali in proposito:
- una modifica al core non ti permetterebbe di aggiornarlo (o quantomeno non in modo immediato)
- potrebbe risolvere il problema che hai nell'immediato ma creare qualche incompatibilità altrove

- se per qualche motivo non dovessi più essere io ad occuparmi di quel progetto/cliente il passaggio di consegne con un altro sviluppatore sarebbe più complesso (non sai quante volte mi è capitato al contrario ...)

Inoltre esiste la possibilità di creare degli hooks custom dal proprio modulo che poi si possono richiamare nel tema dove si preferisce, quindi rarissimamente mi è capitato di dover mettere mano al core (mi viene in mente giusto una modifica ad una classe nel src di facetedsearch ma solo perchè non può essere "raggiunta" da un override).

Per quanto riguarda gli esempi che hai portato, io forse avrei tentato prima la strada di una modifica nel tema da Smarty, sulla base delle variabili già calcolate dal PHP invece di modificare il core, ma non conoscendo i dettagli dei problemi è solo un'idea buttata lì.

Buona giornata a tutti,
Federica

Link to comment
Share on other sites

Ragazzi approfitto per fare qualche piccola domanda...

Quindi ho creato il modulo, ed ho ricreato la cartella "Override" nel seguente percorso:

nomemodulo/override/modules/ProductListingFrontController/ProductListingFrontController.php

ed all'interno ho copiato ed incollato la struttura della classe con la funzione che ho bisogno di modificare, aggiungendo solo la parte di codice che mi interessa modificare:

 

    protected function getProductSearchVariables()
    {
       // Modifica Salvatore per filtro per best sellers 29-04-2022
       $categorieDaFiltrare = [702];
       if (in_array(Tools::getValue('id_category'),$categorieDaFiltrare) && Tools::getValue('order') == null) {
           $encodedSortOrder = 'product.position.DESC';
           Hook::exec('actionProductSearchProviderRunQueryAfter', array('query' => $query->setSortOrder(SortOrder::newFromString(
               $encodedSortOrder
           ))));
       }
    }	

Ovviamente non funziona XD, come mai? Dovrei ricopiare interamente la funzione? 

Link to comment
Share on other sites

1 ora fa, fedesib dice:

@codencode

In linea di massima io sono d'accordo con @ziobudda sul fatto che il core non va toccato e questi sono alcuni motivi che ritengo essenziali in proposito:
- una modifica al core non ti permetterebbe di aggiornarlo (o quantomeno non in modo immediato)
- potrebbe risolvere il problema che hai nell'immediato ma creare qualche incompatibilità altrove

- se per qualche motivo non dovessi più essere io ad occuparmi di quel progetto/cliente il passaggio di consegne con un altro sviluppatore sarebbe più complesso (non sai quante volte mi è capitato al contrario ...)

Inoltre esiste la possibilità di creare degli hooks custom dal proprio modulo che poi si possono richiamare nel tema dove si preferisce, quindi rarissimamente mi è capitato di dover mettere mano al core (mi viene in mente giusto una modifica ad una classe nel src di facetedsearch ma solo perchè non può essere "raggiunta" da un override).

Per quanto riguarda gli esempi che hai portato, io forse avrei tentato prima la strada di una modifica nel tema da Smarty, sulla base delle variabili già calcolate dal PHP invece di modificare il core, ma non conoscendo i dettagli dei problemi è solo un'idea buttata lì.

Buona giornata a tutti,
Federica

Concordo pienamente in tutto, però alcune volte è inevitabile (lo so lo sto ripetendo tante volte 😅) .
In genere sviluppiamo siti molto personalizzati con funzionalità molto specifiche e che spesso non sono implementabili con moduli dell'addons.

Comunque grazie a entrambi per il confronto @ziobudda @fedesib

Link to comment
Share on other sites

@s.elettronew

1 hour ago, s.elettronew said:

nomemodulo/override/modules/ProductListingFrontController/ProductListingFrontController.php

Il percorso non sembra corretto, dovrebbe essere:

nomemodulo/override/classes/controller/ProductListingFrontController.php

Perchè deve riprodurre esattamente il percorso del file di cui vuoi fare l'override.

L'altra questione riguarda il fatto che stai cercando di fare override di una funzione protected: da quello che ricordo non è possibile, solo le funzioni public possono avere override, ma magari mi ricordo male. Comincia a modificare il percorso, una volta installato il tuo modulo dovresti ritrovare il tuo file nella cartella degli overrides.

 

@codencode

Nessun problema, figurati, un po' di discussione fattiva è sempre interessante. Comunque anche io sviluppo per progetti non standard e per i quali non ci sono moduli negli Addons (e credo anche @ziobudda da come risponde ai vari problemi posti dagli utenti) 😉

Buona giornata,
Federica

Edited by fedesib (see edit history)
Link to comment
Share on other sites

39 minuti fa, s.elettronew dice:

@fedesib No nulla, non funziona anche cambiando il percorso...Quindi essendo una funzione protected non psoso fare l'override? quale sarebbe l'alternativa?

 

 

Per i metodi protected può essere eseguito l'override, quindi c'è qualche altro problema.

La classe ProductListingFrontController ha i seguenti 3 metodi astratti:

  • getListingLabel
  • getProductSearchQuery
  • getDefaultProductSearchProvider

"probabilmente" nella tua classe li devi implementare, fai una prova potrebbe essere questo il problema?

Link to comment
Share on other sites

@s.elettronew

Scusa la domanda, probabilmente stupida, la tua classe nel file che fa l'override inizia con

class ProductListingFrontController extends ProductListingFrontControllerCore
{

// funzione modificata
}

giusto?

E la funzione che hai scritto contiene tutta la funzione originale + il pezzetto nuovo che ti serve, corretto?

Buon pomeriggio,
Federica

Link to comment
Share on other sites

@s.elettronew

Ok, allora, sicuramente va fatto con tutta la funzione originale + pezzo modificato e non solo con il pezzo modificato.

Guardando il controller originale, in testa al file ci sono parecchi "includes": li hai inclusi anche tu nell'override? Forse potrebbe essere quello.

use PrestaShop\PrestaShop\Core\Product\Search\Facet;
use PrestaShop\PrestaShop\Core\Product\Search\FacetsRendererInterface;
use PrestaShop\PrestaShop\Core\Product\Search\Pagination;
use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchContext;
use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchProviderInterface;
use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchQuery;
use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchResult;
use PrestaShop\PrestaShop\Core\Product\Search\SortOrder;

Buona giornata,
Federica

Link to comment
Share on other sites

Ragazzi vi ringrazio per il vostro aiuto, sono riuscito a farlo funzionare alla fine! Il percorso nn era valido...Ma ne approfitto per un consiglio:

Pero' purtroppo se ricopio tutta la funzione originale + pezzetto modificato, la modifica "non si aziona"...molto strano. Sapreste dirmi almeno se sono sulla buona strada?

https://paste.ofcode.org/pHfcxnAyGizsHvujUaNdwj

Se faccio questa modifica direttamente sul core funziona, mentre nel modlo mi sparisce la pagina dei prodotti nella ricerca per categoria...

Link to comment
Share on other sites

@s.elettronew

Ciao,

perchè nell'override c'è anche questa funzione private?

private function getProductSearchProviderFromModules($query)

Hai modificato anche quella? Mentre sulle funzioni protected avevo un dubbio, sulle funzioni private non ne ho: sicuramente non si può fare override.

Buon pomeriggio,
Federica

Link to comment
Share on other sites

2 hours ago, s.elettronew said:

@fedesib nono, quella li non è modificata. Semplicemente l'ho dovuta importare perchè visto che è utilizzata nella funzione che mi interessa, mi dava errore quindi l'ho importata nel modulo...

L'hai dovuta copiare perchè i metodi "private" possono essere richiamati solo nelle classi che li hanno definiti. Fosse stato un "protected" non avresti avuto problemi. Li puoi riscrivere ma sempre dello stesso tipo devono essere (private su private).

Per capirci:

public: puo' essere richiamato anche fuori dalla classe ($miaclasse->metodoPubblico())

protected: puo' essere richiamato all'interno della classe che lo ha definito e all'interno della classe derivata 

private: puo' essere richiamato SOLAMENTE all'interno della classe che lo ha definito

 

  • Like 1
Link to comment
Share on other sites

@ziobudda @fedesib

Sto facendo un po' di riflessioni sul fatto di creare gli override mediante uno o più moduli.

Come giustamente dite voi per evitare di "reinstallare" ogni volta il modulo, nel file di override includete un file del vostro modulo, però io sto avendo problemi in quanto in fase di installazione il metodo Module::addOverride() carica, mediante la casse ReflectionClass, il contenuto del file di override, e se non trova la classe che si aspetta, non installa l'override.

Mi viene quindi da chiedere come fate? inserite l'istruzione di include nel file di override "a mano"? 

Credo che mi sfugga qualcosa.

Grazie per l'attenzione.

 

Edited by codencode (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...