s.elettronew Posted April 29, 2022 Share Posted April 29, 2022 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 apportare 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 More sharing options...
fedesib Posted April 29, 2022 Share Posted April 29, 2022 Ciao, se sei su PS 1.7 non si possono più mettere direttamente gli overrides nella cartella omonima, bisogna sviluppare un modulo (vedi: https://devdocs.prestashop.com/1.7/modules/concepts/overrides/). Buon pomeriggio, Federica Link to comment Share on other sites More sharing options...
ziobudda Posted April 29, 2022 Share Posted April 29, 2022 Ciao, come detto da @fedesib devi sviluppare un modulo che contenga l'override. Ci pensarà poi PS a creare il contenuto della cartella override. M. Link to comment Share on other sites More sharing options...
s.elettronew Posted May 2, 2022 Author Share Posted May 2, 2022 ma non è scomoda come soluzione? conviene sviluppare un modulo per aggiungere 3 righe di codice ad un controller? Link to comment Share on other sites More sharing options...
ziobudda Posted May 2, 2022 Share Posted May 2, 2022 Certo che conviene, perchè altrimenti ti perderesti le modifiche al primo aggiornamento di PS. Mai toccare il core. Mai, in nessun CMS. M. Link to comment Share on other sites More sharing options...
s.elettronew Posted May 2, 2022 Author Share Posted May 2, 2022 E mi conviene creare un modulo per ogni modifica oppure un unico modulo che contenga le modifiche di tutti i file che devo modificare? (le modifiche hanno finalità diverse tra di loro) Link to comment Share on other sites More sharing options...
ziobudda Posted May 2, 2022 Share Posted May 2, 2022 Se le modifiche sono solo "tue" allora un unico modulo va più che bene. M. Link to comment Share on other sites More sharing options...
Codencode Posted May 4, 2022 Share Posted May 4, 2022 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 apportare 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 More sharing options...
ziobudda Posted May 4, 2022 Share Posted May 4, 2022 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 More sharing options...
fedesib Posted May 4, 2022 Share Posted May 4, 2022 @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 1 Link to comment Share on other sites More sharing options...
ziobudda Posted May 4, 2022 Share Posted May 4, 2022 7 minutes ago, fedesib said: Quanto al metodo di @ziobudda per evitare di continuare a "reinstallare" il modulo che contiene l'override, faccio così anche io, quindi lo consiglio. Solo chi sa lo fa Link to comment Share on other sites More sharing options...
Codencode Posted May 4, 2022 Share Posted May 4, 2022 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 More sharing options...
ziobudda Posted May 4, 2022 Share Posted May 4, 2022 Non è "inevitabile": è sbagliato toccare il core. Poi puoi fare quello che vuoi. M. Link to comment Share on other sites More sharing options...
Codencode Posted May 4, 2022 Share Posted May 4, 2022 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 More sharing options...
ziobudda Posted May 4, 2022 Share Posted May 4, 2022 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. 1 Link to comment Share on other sites More sharing options...
Codencode Posted May 4, 2022 Share Posted May 4, 2022 (edited) 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 May 4, 2022 by codencode (see edit history) Link to comment Share on other sites More sharing options...
Codencode Posted May 4, 2022 Share Posted May 4, 2022 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 o 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 More sharing options...
fedesib Posted May 5, 2022 Share Posted May 5, 2022 @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 More sharing options...
s.elettronew Posted May 5, 2022 Author Share Posted May 5, 2022 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 More sharing options...
Codencode Posted May 5, 2022 Share Posted May 5, 2022 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 More sharing options...
fedesib Posted May 5, 2022 Share Posted May 5, 2022 (edited) @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 May 5, 2022 by fedesib (see edit history) Link to comment Share on other sites More sharing options...
s.elettronew Posted May 5, 2022 Author Share Posted May 5, 2022 @fedesib No nulla, non funziona anche cambiando il percorso...Quindi essendo una funzione protected non psoso fare l'override? quale sarebbe l'alternativa? Link to comment Share on other sites More sharing options...
Codencode Posted May 5, 2022 Share Posted May 5, 2022 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 More sharing options...
fedesib Posted May 5, 2022 Share Posted May 5, 2022 @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 More sharing options...
s.elettronew Posted May 5, 2022 Author Share Posted May 5, 2022 @fedesib si esatto, ho provato sia a utilizzare tutta la funzione originale + pezzetto modificato e anche solo il pezzetto modificato... Link to comment Share on other sites More sharing options...
fedesib Posted May 6, 2022 Share Posted May 6, 2022 @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 More sharing options...
Codencode Posted May 6, 2022 Share Posted May 6, 2022 @s.elettronew posta l'intero file, così possiamo vedere se c'è qualcosa che non va. 1 Link to comment Share on other sites More sharing options...
s.elettronew Posted May 9, 2022 Author Share Posted May 9, 2022 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 More sharing options...
fedesib Posted May 9, 2022 Share Posted May 9, 2022 @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 More sharing options...
s.elettronew Posted May 9, 2022 Author Share Posted May 9, 2022 @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... Link to comment Share on other sites More sharing options...
ziobudda Posted May 9, 2022 Share Posted May 9, 2022 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 1 Link to comment Share on other sites More sharing options...
Codencode Posted May 10, 2022 Share Posted May 10, 2022 (edited) @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 May 10, 2022 by codencode (see edit history) Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now