franco1706 Posted February 5, 2015 Share Posted February 5, 2015 Le modifiche sono state testate su Prestashop 1.6.0.11 Ho notato che Prestahop visualizza la quantità disponibile senza tener conto di eventuali prodotti messi nel proprio e/o nel carrello di altri utenti. Ipotizziamo di aver 10 pezzi in magazzino di un prodotto denominato “PALLA” . Se il cliente TIZIO mette nel proprio carrello nr 7 PALLA ed il cliente CAIO mette nel proprio carrello nr 6 PALLA il nostro Prestashop lo consente intervenendo solo al momento del pagamento negando l'operazione a colui che provvederà all'acquisto per secondo avvertendolo che un prodotto non è più disponibile. Ho provato a verificare se esistesse una modalità di configurazione in admin che cambiasse il modo di calcolare la disponibilità del prodotto ma non l'ho trovata. (Se ci fosse sarei grato a chi me la indicasse). Ho provato allora a scrivere due righe di codice per modificare le cose e siccome mi sembra funzionino bene le metto a disposizione di tutti. 1) creare in root una cartella denominata “arriba” ed inserire il file Arriba.php (vedi script alla fine) 2) con un editor aprire il file in classes/stock/StockAvaible.php circa in riga 363 modificare la riga Cache::store($key, (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query); in Cache::store($key, (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query) -Arriba::qta_product_cart($id_product)); 3)nel file classes/Product.php circa in riga 3074 modificare la riga return ($qty <= StockAvailable::getQuantityAvailableByProduct($this->id, $id_product_attribute)); in return ($qty <= StockAvailable::getQuantityAvailableByProduct($this->id, $id_product_attribute)+Arriba::qta_product_order($this->id)); 4) Nel file controller/FrontController.php inserire in riga 2 in pratica sotto <?php include_once("arriba/Arriba.php"); e circa a riga 268 modificare la riga else $this->context->cart = $cart; in else { $this->context->cart = $cart; define("ARRIBA_CART",$cart->id); } Dopo queste modifiche verrà visualizzato come disponibilità del prodotto la quantità in magazzino meno la quantità nei carrelli prima di essere venduti e quando l'utente inserirà il prodotto nel carrello si terrà conto delle quantità presenti nei vari carrelli. Ricordiamo che ogni volta che aggiorneremo la versione di Prestashop oppure modiche che alterano i file da noi rettificati dovremo verificare se esistono ancora le nostre modifiche ed eventualmente inserirle nuovamente. Una cosa da tenere presente sono i CARRELLI ABBANDONATI che potrebbero alterare la disponibilità effettiva. E' opportuno nella parte admin-Clienti verificare se nei Carrello della spesa ci siano carrelli abbandonati da molto tempo ed eventualmente eliminarli. Spero che il mio lavoro sia utile ad altri. Qua sotto il file Arriba.php da inserire nella cartella arriba ***Inizio file Arriba.php ***(utilizzato sul sito www.arribaarriba.it)*** <?php class Arriba { public function qta_product_cart($idprod) { $query="select id_cart from "._DB_PREFIX_."cart where id_carrier!='0'"; $rows = Db::getInstance()->executeS("$query"); $notin=''; foreach ($rows as $r) { $notin.="'$r[id_cart]',"; } $not=substr($notin,0,-1); if($not!=''){$not=" and "._DB_PREFIX_."cart_product.id_cart not in($not)";} $newquery="select sum("._DB_PREFIX_."cart_product.quantity) as qty from "._DB_PREFIX_."cart_product where "._DB_PREFIX_."cart_product.id_product='$idprod' $not"; return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($newquery); } public function qta_product_order($idprod) { $id_cart=ARRIBA_CART; $newquery="select "._DB_PREFIX_."cart_product.quantity as qty from "._DB_PREFIX_."cart_product where "._DB_PREFIX_."cart_product.id_product='$idprod' and "._DB_PREFIX_."cart_product.id_cart='$id_cart'"; return (int)Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($newquery); } } ?> *** fine file Arriba.php Link to comment Share on other sites More sharing options...
Luigi Massa Posted February 5, 2015 Share Posted February 5, 2015 indipendentemente dal codice okkio che poi ti blocchi il negozio i carrelli vengono salvati quindi se i carrelli non sono cancellati dopo x tempo, le tue disponibilità saranno sempre bloccate Link to comment Share on other sites More sharing options...
franco1706 Posted February 5, 2015 Author Share Posted February 5, 2015 Grazie Luigi per l'avvertimento, siccome ne sono consapevole, l'avevo già segnalato indicando che i "carrelli abbandonati" devono essere periodicamente controllati e cancellati. Tutt'altra cosa invece per i carrelli che rimangano sul database in quanto la transazione si è conclusa con la vendita, questi carrelli non entrano nel conteggio per la disponibilità. In realtà ho già scritto anche il codice per eliminare automaticamente i carrelli abbandonati dopo X giorni (a mia scelta) però siccome non l'ho ancora testato non ho ritenuto proporlo. Ciao e grazie!!! 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